API pour XML Mihaela JUGANARU-MATHIEU mathieu@emse.fr École Nationale Supérieure des Mines de St Etienne février 2012
Les outils pour traiter XML (validation, navigation, interrogation) sont puissants d un point de vue pouvoir d expression, mais ils s avèrent insuffisant pour la réalisation des applications complètes. Nécessité de pouvoir traiter du XML dans un programme écrit en langage impératif, orienté objet ou non (C, C+, Java, PHP, C#, etc). Il existe diverses API permettant de traiter le XML depuis un langage de programmation de haut niveau.
et = Document Object Model est une recommandation du W3C http://www.w3.org/tr/ = Simple API for XML est une recommandation d un groupe de travail http://www.saxproject.org/ et sont des API (Application Programming Interface) qui ont des implémentations dans divers langages (Java, C++, PHP,...) pour travailler avec XML sur la base d une analyse (parsing) du document de travail.
Pour les deux API on réalise un parsing (analyse) du document XML afin de pouvoir traiter le contenu.
: : construit une représentation complète du document dans la mémoire est adapté au traitement des documents qui se modifient ou qui doivent être traités dans la globalité défini des trigger que sont activés lors de l apparition d un événemet (un document XML se traduit par un flux d événements) est mieux adapté pour des document de grandes taille et pour l extraction (consultation) de l information contenue dans le document XML
Le parser prend en entrée un document XML et produit un arbre avec une forme d objet et contenant des objets. chaque objet à l exception de la racine appartient à une classe ou sous-classe Node il y a des opérations pour créer/supprimer des nœuds et pour la navigation Les applications qui utilisent sont diverses : processeur XSLT, éditeur XML, applications d interface avec les bases de données, etc...
Les type de nœuds sont :
Un arbre se définit de manière récursive. Les type de nœuds sont : Chaque nœud a un type qui correspond à une catégorie syntaxique XML et chaque nœud a des propriétés. Selon le type de nœud il y a une série d opérations avec les nœuds et une série d interfaces.
Les types de nœuds sont : Document = document XML (la racine) DocumentType = type de document (DTD) ProcessingInstruction = instruction de traitement Element = élément XML Attribute = attribut XML Entity = declaration d entité EntityReference = référence à une entité Comment = commentaire CharacterData = commentaire et section de texte Text = section de texte CDataSection = section CDATA DocumentFragment = fragment de document XML Notation = notation
Les propriétés du type noeud (Node) et leur type : nodetype - unsigned short nodename - String nodevalue - String attributes - NamedNodeMap parentnode - Node firstchild - Node lastchild - Node childnodes - NodeList previoussibling - Node nextsibling - Node
Les opérations avec le type noeud : Type résultat Méthode Paramètre Nœud insertbefore Nœud nouveau, Nœud fils Nœud replacechild Nœud nouveau, Node ancien Nœud removechild Nœud fils Nœud appendchild Nœud nouveau boolean haschildnode - Nœud clonenode boolean preuve
Exemple : insérer un élément de forme <adventure type = epic >&adventure1;</adventure> avant le 4-ème élément du document. var racine = mydocument.documentelement; var enfants = racine.childnodes; var el_nouv = createelement("adventure") ; var ent_ref = createentityreference("adventure1"); el_nouv.setattribute("type", "epic"); el_nouv.appendchild(ent_ref); insertbefore(el_nouv, enfants.item(3));
Le principe de est le suivant : chaque balise ouverte ou fermée est un événement ouvrir ou fermer un document est un événement rencontrer du texte est un événement Le parser travaille avec un flux linéaire et détecte au fur et à mesure ces événement. Pour chaque événement on peut indiquer que l on fait une extraction/transformation du flux ou non. peut jouer le rôle de filtre entre une application qui génère du XML et une autre application qui traite un certain type de flux.
- exemple de flux
en Java Parser : org.xml.sax.xmlreader Handlers : org.xml.sax.contenthandler org.xml.sax.dtdhandler org.xml.sax.errorhandler org.xml.sax.entityresolver Interfaces d implémentation par défaut (coquille vide) : org.xml.sax.helpers.defaulthandler
- exemple de code String filename = "..."; ContentHandler mycontenthandler = new...;... XMLReader parser = XMLReaderFactory.createXMLReader(); parser.setcontenthandler(mycontenthandler); parser.parse(filename); public static void main(string[] args) { Trace t = new Trace(); Parser p = new Parser(); p.setcontenthandler(t); try { p.parse(args[0]); } catch (Exception e) {e.printstacktrace();} }
2 est une librairie libre (licence MIT) et fiable écrite en C standard permettant d analyser et traiter du XML. 2 implémente les API et, XPath, XML Base, XML Pointer, la validation par DTD et XSchema. La commande xmllint fait partie de la librairie. La librairie peut s interfacer avec d autres langages : C++, PHP, Ruby, TCL, etc.