Résumé de la structure voulue : une structure comme un document XML, avec des noeuds (Node) qui ont des propriétés, qui peuvent avoir des enfants, profondeur et nombre d'enfants illimités.
On utilise org.w3c.dom.*.
Node est une interface.
Element est une autre interface, Node est une superinterface de Element.
Un Element possède des attributs (concrètement : les attributs dans un fichier XML)
Le code pour créer l'arborescence.
import org.w3c.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class Test
{
public static void main(String[] args) throws Exception
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.newDocument();
Node racine = document.createElement("Racine");
document.appendChild(racine);
Node noeud1 = ajoutNoeud(racine,"aaa", "1er noeud");
ajoutNoeud(noeud1,"bbb", "Enfant du 1er noeud");
Node noeud2 = ajoutNoeud(racine,"ccc", "2e noeud");
ajoutNoeud(noeud2,"ddd", "Ainé du 2e noeud");
ajoutNoeud(noeud2,"eee", "Cadet du 2e noeud");
ajoutNoeud(noeud2,"fff", "Dernier enfant du 2e noeud");
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.transform(new DOMSource(document),new StreamResult(new File("toto.xml")));
System.out.println(affichage(document.getFirstChild(), 0));
}
public static Node ajoutNoeud(Node parent, String valeur1, String valeur2)
{
Element element = parent.getOwnerDocument().createElement("Noeud");
element.setAttribute("code",valeur1);
element.setAttribute("texte",valeur2);
parent.appendChild(element);
return element;
}
/**
* Parcours par récurrence le noeud N, pour afficher ou faire tout autre
* traitement sur l'arborescence
* @param Node N le noeud à afficher
* @param int profondeur pour connaître la profondeur où on est
*/
public static String affichage(Node N, int profondeur) {
String ret = "";
Node fils;
if (N != null) {
if (N.hasChildNodes()) {
fils = N.getFirstChild();
while (fils != null) {
ret += "\n";
for (int i = 0; i <= profondeur; i++)
ret += "\t";
ret += ((Element)fils).getAttribute("code")
+ " " + ((Element)fils).getAttribute("texte");
ret += affichage(fils, profondeur + 1);
fils = fils.getNextSibling();
}
}
}
return ret;
}
}
Le XML obtenu est :
<?xml version="1.0" encoding="UTF-8"?>
<Racine>
<Noeud code="aaa" texte="1er noeud">
<Noeud code="bbb" texte="Enfant du 1er noeud"/>
</Noeud>
<Noeud code="ccc" texte="2e noeud">
<Noeud code="ddd" texte="Ainé du 2e noeud"/>
<Noeud code="eee" texte="Cadet du 2e noeud"/>
<Noeud code="fff" texte="Dernier enfant du 2e noeud"/>
</Noeud>
</Racine>
La fonction affichage retourne :
aaa 1er noeud
bbb Enfant du 1er noeud
ccc 2e noeud
ddd Ainé du 2e noeud
eee Cadet du 2e noeud
fff Dernier enfant du 2e noeud
|