Analyse DOM avec Xerces

Utilisation de fichiers XML en Java à l'aide de l'analyse DOM

1. Vue d'ensemble

Dans ce didacticiel, nous allons expliquer comment analyser DOM avecApache Xerces - une bibliothèque mature et établie pour analyser / manipuler XML.

Il existe plusieurs options pour analyser un document XML; nous allons nous concentrer sur l'analyse DOM dans cet article. L'analyseur DOM charge un document et crée une arborescence hiérarchique complète en mémoire.

Pour un aperçu de la prise en charge des bibliothèques XML en Java, consultez nos précédentsarticle.

2. Notre document

Commençons par le document XML que nous allons utiliser dans notre exemple:



    
        Guava
        Introduction to Guava
        04/04/2016
        GuavaAuthor
    
...

Notez que notre document a un nœud racine appelé "tutoriels" avec 4 nœuds enfants "tutorial". Chacun de ceux-ci a 2 attributs: "tutId" et "type". De plus, chaque “tutoriel” a 4 nœuds enfants: “titre”, “description”, “date” et “auteur”.

Nous pouvons maintenant continuer à analyser ce document.

3. Chargement du fichier XML

Tout d'abord, nous devons noter quethe Apache Xerces library is packaged with the JDK, nous n'avons donc pas besoin de configuration supplémentaire.

Passons directement au chargement de notre fichier XML:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new File("src/test/resources/example_jdom.xml"));
doc.getDocumentElement().normalize();

Dans l'exemple ci-dessus, nous obtenons d'abord une instance de la classeDocumentBuilder, puis utilisons la méthodeparse() sur le document XML pour obtenir un objetDocument le représentant.

Nous devons également utiliser la méthodenormalize() pour nous assurer que la hiérarchie du document n'est pas affectée par des espaces blancs supplémentaires ou de nouvelles lignes dans les nœuds.

4. Analyse du DOM

Maintenant, explorons notre fichier XML.

Commençons par récupérer tous les éléments avec la balise "tutoriel". Nous pouvons le faire en utilisant la méthodegetElementsByTagName(), qui retournera unNodeList:

@Test
public void whenGetElementByTag_thenSuccess() {
    NodeList nodeList = doc.getElementsByTagName("tutorial");
    Node first = nodeList.item(0);

    assertEquals(4, nodeList.getLength());
    assertEquals(Node.ELEMENT_NODE, first.getNodeType());
    assertEquals("tutorial", first.getNodeName());
}

Il est important de noter queNode is the primary datatype for the DOM components. Tous les éléments, attributs, texte sont considérés comme des nœuds.

Voyons ensuite comment nous pouvons obtenir les attributs du premier élément en utilisantgetAttributes():

@Test
public void whenGetFirstElementAttributes_thenSuccess() {
    Node first = doc.getElementsByTagName("tutorial").item(0);
    NamedNodeMap attrList = first.getAttributes();

    assertEquals(2, attrList.getLength());

    assertEquals("tutId", attrList.item(0).getNodeName());
    assertEquals("01", attrList.item(0).getNodeValue());

    assertEquals("type", attrList.item(1).getNodeName());
    assertEquals("java", attrList.item(1).getNodeValue());
}

Ici, nous obtenons l'objetNamedNodeMap, puis utilisons la méthodeitem(index) pour récupérer chaque nœud.

Pour chaque nœud, nous pouvons utilisergetNodeName() etgetNodeValue() pour trouver leurs attributs.

5. Traverser les nœuds

Voyons ensuite comment traverser les nœuds DOM.

Dans le test suivant, nous traverserons les nœuds enfants du premier élément et imprimerons leur contenu:

@Test
public void whenTraverseChildNodes_thenSuccess() {
    Node first = doc.getElementsByTagName("tutorial").item(0);
    NodeList nodeList = first.getChildNodes();
    int n = nodeList.getLength();
    Node current;
    for (int i=0; i

Tout d'abord, nous obtenons lesNodeList en utilisant la méthodegetChildNodes(), puis nous les parcourons et imprimons le nom du nœud et le contenu du texte.

La sortie montrera le contenu du premier élément "tutorial" de notre document:

title: Guava
description: Introduction to Guava
date: 04/04/2016
author: GuavaAuthor

6. Modifier le DOM

Nous pouvons également apporter des modifications au DOM.

À titre d’exemple, modifions la valeur de l’attributtype de «java» à «autre»:

@Test
public void whenModifyDocument_thenModified() {
    NodeList nodeList = doc.getElementsByTagName("tutorial");
    Element first = (Element) nodeList.item(0);

    assertEquals("java", first.getAttribute("type"));

    first.setAttribute("type", "other");
    assertEquals("other", first.getAttribute("type"));
}

Ici, changer la valeur d'attribut est une simple question d'appeler une méthodesetAttribute() deElement.

7. Créer un nouveau document

Outre la modification du DOM, nous pouvons également créer de nouveaux documents XML à partir de zéro.

Jetons d'abord un coup d'œil au fichier que nous voulons créer:



    
        [email protected]
    

Notre XML contient un nœud racineusers avec un élémentuser qui a également un nœud enfantemail.

Pour y parvenir, nous devons d'abord appeler la méthodenewDocument() deBuilder qui renvoie un objetDocument.

Ensuite, nous appellerons la méthodecreateElement() du nouvel objet:

@Test
public void whenCreateNewDocument_thenCreated() throws Exception {
    Document newDoc = builder.newDocument();
    Element root = newDoc.createElement("users");
    newDoc.appendChild(root);

    Element first = newDoc.createElement("user");
    root.appendChild(first);
    first.setAttribute("id", "1");

    Element email = newDoc.createElement("email");
    email.appendChild(newDoc.createTextNode("[email protected]"));
    first.appendChild(email);

    assertEquals(1, newDoc.getChildNodes().getLength());
    assertEquals("users", newDoc.getChildNodes().item(0).getNodeName());
}

Pour ajouter chaque élément au DOM, nous appelons également la méthodeappendChild().

8. Enregistrer un document

Après avoir modifié notre document ou en avoir créé un à partir de rien, nous devrons l'enregistrer dans un fichier.

Nous allons commencer par créer un objetDOMSource, puis utiliser un simpleTransformer pour enregistrer le document dans un fichier:

private void saveDomToFile(Document document,String fileName)
  throws Exception {

    DOMSource dom = new DOMSource(document);
    Transformer transformer = TransformerFactory.newInstance()
      .newTransformer();

    StreamResult result = new StreamResult(new File(fileName));
    transformer.transform(dom, result);
}

De même, nous pouvons imprimer notre document dans la console:

private void printDom(Document document) throws Exception{
    DOMSource dom = new DOMSource(document);
    Transformer transformer = TransformerFactory.newInstance()
        .newTransformer();

    transformer.transform(dom, new StreamResult(System.out));
}

9. Conclusion

Dans cet article rapide, nous avons appris à utiliser l'analyseur DOM Xerces pour créer, modifier et enregistrer un document XML.

Comme toujours, le code source complet des exemples est disponibleover on GitHub.