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