webservice

Les technologies XML

Les API pour manipuler des documents XML

Les API XML

  • Sont des analyseurs syntaxiques (parser en anglais, parfois francisé en parseur), des librairies proposant un ensemble de composants logiciels
  • Permettent et facilitent la lecture, la génération et le traitement de documents XML.

Ces API sont implémentées sur la base de 2 modèles:

  • Hiérarchique : DOM XML (Document Objet Model) permet la manipulation d’un document XML après l’avoir représenté en mémoire sous la forme d’un arbre d’objets
  • Evénementiel : SAX (Simple API for XML) permet la manipulation d’un document XML au fur et à mesure de sa lecture, sans avoir à le charger en totalité en mémoire. L’extraction des données est basée sur une gestion d’événements (création d’un document, d’un élément ...).
  • DOM est une norme du consortium w3
  • SAX est une spécification disponible en projet Open Source.
  • Il existe de nombreuses implémentations de la norme DOM et de la spécification SAX
  • Xerces est un projet Open Source de la fondation Apache Fournit une implémentation d’analyseur syntaxique XML DOM et SAX.

JAXP ou Java API for XML Parsing

  • L’API javax.xml.parsers permet d’obtenir des instances d’un analyseur syntaxique DOM ou SAX.
  • C’est l’étape préliminaire à toute manipulation de document XML.
  • Un parseur a pour rôle d’analyser un document XML.
  • Il peut en outre vérifier la validité d’un document en fonction de sa DTD ou du XML-Schema associé

L'API org.xml.sax

Elle implémente les interfaces SAX, fournit des classes et méthodes permettant la manipulation d’un document XML via une gestion d’événement.

Le parseur analyse le flot de caractères du document et appelle des méthodes de rappel (en anglais callback) lorsqu’il rencontre les balises de début et de fin du document et d’éléments

Exemple parser SAX

public class SimpleSaxParser {

        /**
         * Contructeur.
         */
        public SimpleSaxParser(String uri) throws SAXException, IOException {
                        XMLReader saxReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
                        saxReader.setContentHandler(new SimpleContentHandler());
                        saxReader.parse(uri);
        }

        public static void main(String[] args) {
                if (0 == args.length || 2 < args.length) {
                        System.out.println("Usage : SimpleSaxParser uri [parserClassName]");
                        System.exit(1);
                }

                String uri = args[0];

                String parserName = null;
                if (2 == args.length) {
                        parserName = args[1];
                }

                try {
                        SimpleSaxParser parser = new SimpleSaxParser(uri);
                } catch (Throwable t) {
                        t.printStackTrace();
                }
        }
}

L’API org.xml.dom

Elle implémente les interfaces DOM et fournit des classes et des méthodes permettant la manipulation d’un document XML via une gestion d’arbre.

On peut ainsi ajouter ou supprimer un noeud, ajouter ou supprimer un attribut à un nœud (méthodes appendChild, setAttribute de la classe Element par exemple)...

Un parseur DOM construit un objet DOM, puis parcours en largeur et en profondeur l’arbre afin d’en traiter chaque nœud.

Exemple lecteur d'un document avec DOM

public class ExempleDOM {
    public static void main(String[] args) {
        try{
            // création d'une fabrique de constructeur de documents DOM
            DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();

            // création d'un constructeur de documents DOM
            DocumentBuilder constructeur = fabrique.newDocumentBuilder();

            // lecture du contenu d'un fichier XML avec le constructeur pour
            // créer le document DOM correspondant 
            File xmlFile = new File("ExempleDOM.xml");
            Document document = constructeur.parse(xmlFile);

                // traitement du document
                printDocument(document);
        } catch(ParserConfigurationException pce) {
                System.out.println("Erreur de configuration du parseur DOM");
        } catch(SAXException se) {
                System.out.println("Erreur lors du parsing du document");
        } catch(IOException ioe) {
                System.out.println("Erreur d'entrée/sortie");
        }
    }

    public static void printNode(Node node) {
        System.out.println(node);
        NodeList nodes = node.getChildNodes();
        for(int i=0; i<nodes.getLength(); i++) {
            Node n = nodes.item(i);
            printNode(n);
        }
    }
    public static void printDocument(Document document) {
        Element racine = document.getDocumentElement();
        printNode(racine);
    }
}
Avantages Inconvénients
SAX le traitement du document par le programme se fait en cours d'analyse (efficacité) // seuls les éléments pertinents sont traités l'écriture des callback pour traiter des structures imbriquées est plus complexe
DOM un einterface navigationnelle est fournit pour parcourir un arbre d'éléments un arbre est construit en mémoire, tous les éléments sont représentés, le traitement du document par le programme se fait après l'analyse