Programmation XML 1 . DOM

publicité
Java est le “meilleur” langage pour XML
VB, C#, C, Perl, Python etc. également
support Unicode est complexe
SAX : Simple Api for Xml (dirigé par les
événements, un noeud à la fois)
DOM : Document Object Model (permet de
manipuler l’arbre en entier)
SAX, DOM
Standard W3C pour HTML et XML
Structure Objet pour représenter des documents
Résultat d’une analyse
Arbre d’objets liés
Interface pour naviguer à l’intérieur du document
OO
Peut être utilisée avec :
Java, C++
C#, VB
Python, PHP
DOM
Root of the document
Xerces
Apache (Java, C++)
MSXML
Microsoft
SDK Oracle
Oracle
4DOM
(Python)
<Guide>
<Restaurant>
<Guide>
<Restaurant id="R1">
The
best restaurant </Restaurant>
Id="R1"
</Guide>
The best restaurant
DOM
DOM
!
"
#$
"
%
Element getDocumentElement()
Navigation via un arbre
générique de noeuds
Node
NodeList (Parent/Child)
ProcessingInstruction
NamedNodeMap
<?xml:stylesheet ...>
Permet un accès direct au noeud fils qui est la racine du
document.
Node
NodeList getElementsByTagName(String tagname)
Document
DocumentType
<!DOCTYPE ...>
Element
Retourne un NodeList de tous les Elements d’une balise donnée
dans l’ordre qu’ils sont rencontrés selon un parcours en préordre
de l’arbre.
....
<Restaurant ....>
Child
Text
The best restaurant
DOM
DOM
!
"
#$
"
%&
'
NamedNodeMap getAttributes()
NamedNodeMap contient les attributs de ce noeud (si c’est un Element) ou null
autrement.
Une interface objet standard
NodeList getChildNodes()
Navigation
Traitement spécifique
NodeList qui contient tous les fils du noeud.
Node getFirstChild()
Le premier fils du noeud.
Problèmes de performance
Node getLastChild()
Le dernier fils du noeud.
mémoire
Le traitement est après l’analyse
Node getParentNode()
Le parent du noeud.
boolean hasAttributes()
Retourne vrai si le noeud (si c’est un élément) a des attributs.
boolean hasChildNodes()
Retourne vrai si le noeud a des fils.
DOM
DOM
)
SAX (Simple API for XML)
Modèle simple basé sur les événements
()
Types d’événements
début et fin du document
attributs, texte, … .
Différents parsers
XP, James Clark, Aelfred, Saxon
MSXML3, Microsoft
Xerces, Apache
JAXP, SUN
SAX
#$
XMLReader
setContentHandler
setErrrorHandler
parse
startDocument
event
XML
Stream
ContentHandler
startElement
event
startDocument
endDocument
startElement
endElement
characters
endDocument
event
!
ErrorHandler
fatalError
error
warning
"
SAX
SAX
)
Document en entrée
<ADDRESS>
<NUMBER> 9 </NUMBER>
<STREET>Charles Fourier</STREET>
<CITY>Evry</CITY>
<ZIPCODE>91011</ZIPCODE>
</ADDRESS>
Sortie à imprimer
Begin root element : ADDRESS
Opening tag : NUMBER
Ending tag : NUMBER
Opening tag : STREET
Ending tag : STREET
...
*+ ,)
import org.xml.SAX.HandlerBase;
import org.xml.SAX.AttributeList;
public class MonHandler extends HandlerBase {
public void startElement (String name, AttributeList atts) {
System.out.println(« Opening tag : "+name);
}
public void endElement (String name) {
System.out.println(« Ending tag : "+name);
}
}
*+ ,)
+
)
DOM utilise SAX pour construire l’arbre d’un
document XML
SAX (Simple API for XML)
import org.xml.SAX.Parser;
import org.xml.SAX.DocumentHandler;
import org.xml.SAX.helpers.ParserFactory;
public class MyApp {
static final String parserClass ="foo.bar.XML.SAXDriver";
public static void main (String args[]) throws Exception {
// parser creation
Parser parser = ParserFactory.makeParser(parserClass);
// handler creation
DocumentHandler handler= new MonHandler();
// handler recording
parser.setDocumentHandler(handler);
// document is processed
for (int i= 0;i <args.length; i++) { parser.parse(args[i]); }
}
}
API dirigée par les événements
Envoie les événements à l’application au fur et à
mesure de la lecture du document
Adaptée pour de gros documents et des
dispositifs à mémoire contrainte
DOM (Document Object Model)
Lit le document en entier en mémoire sous forme
d’arbre
Adapté lorsque l’on veut modifier le document ou
faire des manipulations complexes
SAX ne se souvient pas des événements
antérieurs (sauf programmation explicite)
SAX
Téléchargement