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

1. Vue d'ensemble

Dans ce didacticiel, nous verrons comment analyser DOM avec Apache 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 entière en mémoire.

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

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 «tutoriel». Chacun d'eux a 2 attributs: «tutId» et «type». En outre, 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 que la bibliothèque Apache Xerces est fournie avec le 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 classe DocumentBuilder , puis utilisons la méthode parse () sur le document XML pour obtenir un objet Document le représentant.

Nous devons également utiliser la méthode normalize () 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éthode getElementsByTagName () , qui retournera une NodeList:

@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 que Node est le type de données principal pour les composants DOM . Tous les éléments, attributs, texte sont considérés comme des nœuds.

Ensuite, voyons comment nous pouvons obtenir les attributs du premier élément en utilisant getAttributes () :

@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' objet NamedNodeMap , puis utilisons la méthode item (index) pour récupérer chaque nœud.

Pour chaque nœud, nous pouvons utiliser getNodeName () et getNodeValue () pour trouver leurs attributs.

5. Traversée des nœuds

Ensuite, voyons comment parcourir 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
    

First, we get the NodeList using the getChildNodes() method, then iterate through it, and print the node name and text content.

The output will show the contents of the first “tutorial” element in our document:

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

6. Modifying the DOM

We can also make changes to the DOM.

As an example, let's change the value of the type attribute from “java” to “other”:

@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")); }

Here, changing the attribute value is a simple matter of calling an Element‘s setAttribute() method.

7. Creating a New Document

Besides modifying the DOM, we can also create new XML documents from scratch.

Let's first have a look at the file we want to create:

 [email protected] 

Our XML contains a users root node with one user element that also has a child node email.

To achieve this, we first have to call the Builder‘s newDocument() method which returns a Document object.

Then, we'll call the createElement() method of the new object:

@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()); }

To add each element to the DOM, we're also calling the appendChild() method.

8. Saving a Document

After modifying our document or creating one from scratch, we'll need to save it in a file.

We'll start with creating a DOMSource object, then use a simple Transformer to save the document in a file:

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); }

Similarly, we can print our document in the 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

In this quick article, we learned how to use the Xerces DOM parser to create, modify and save an XML document.

As always, the full source code for the examples is available over on GitHub.