Parcourir un arbre DOM en Java

Parcours avec TreeWalker

DéfinitionTreeWalker

L'interface TreeWalker permet de parcourir un arbre DOM en utilisant une représentation hiérarchique du document.

Cette interface permet de parcourir l'arborescence ou une sous-arborescence d'un document XML.

Pour obtenir un objet de type TreeWalker, il faut utiliser la méthode createTreeWalker de l'interface DocumentTraversal

SyntaxecreateTreeWalker

TreeWalker createTreeWalker(Node root, int whatToShow, NodeFilter filter, boolean entityReferenceExpansion)

  • Node root : le parcours commencera à partir de ce nœud. Le NodeIterator est initialement positionné avant le noeud.

  • int whatToShow : permet de spécifier le ou les types de nœuds obtenus lors du parcours. Les valeurs possibles sont les constantes commençant par SHOW_  (Par exemple SHOW_ALL, SHOW_ELEMENT, SHOW_ATTRIBUTE). Plusieurs valeurs peuvent être combinées avec un opérateur OR.

  • NodeFilter filter : une implémentation de type NodeFilter permet d'appliquer un filtre supplémentaire sur les nœuds obtenus lors du parcours.

  • boolean entityReferenceExpansion : booléen indiquant si les nœuds de type EntityReference sont visibles pour l'itérateur (laisser à true de manière générale).

ComplémentNodeFilter

L'interface NodeFilter permet de définir un filtre supplémentaire pour le NodeIterator ou le TreeWalker en plus de celui spécifié dans le paramètre whatToShow.

Cette interface possède une seule méthode : Short acceptNode(Node n)

Cette méthode peut renvoyer trois valeurs de type short permettant d'indiquer si le nœud étudié doit être retourné ou non :

  • FILTER_ACCEPT : le nœud est inclus

  • FILTER_REJECT : le nœud et ses fils sont exclus

  • FILTER_SKIP : le nœud est exclu mais les nœuds fils seront inclus dans le parcours

Pour utiliser cette interface, il faut définir une classe l'implémentant.

CTRL+C pour copier, CTRL+V pour coller
1
public class MyNodeFilter implements NodeFilter
2
{
3
     @Override
4
     public short acceptNode(Node n)
5
	   {
6
		     if (n.getNodeName().contentEquals("MonTag"))
7
			        return FILTER_ACCEPT;
8
    
9
		     return FILTER_SKIP;
10
	   }
11
}
public class MyNodeFilter implements NodeFilter
{
     @Override
     public short acceptNode(Node n)
	   {
		     if (n.getNodeName().contentEquals("MonTag"))
			        return FILTER_ACCEPT;
    
		     return FILTER_SKIP;
	   }
}

ExempleUtilisation de l'objet TreeWalker

CTRL+C pour copier, CTRL+V pour coller
1
<racine>
2
     <balise1>
3
          <MonTag>Tag1</MonTag>
4
          <MonTag>Tag2</MonTag>
5
     </balise1>
6
     <balise2>
7
          <sousBalise2>
8
               <MonTag>Tag3</MonTag>
9
               <MonTag>Tag4</MonTag>
10
          </sousBalise2>
11
     </balise2>
12
</racine>
<racine>
     <balise1>
          <MonTag>Tag1</MonTag>
          <MonTag>Tag2</MonTag>
     </balise1>
     <balise2>
          <sousBalise2>
               <MonTag>Tag3</MonTag>
               <MonTag>Tag4</MonTag>
          </sousBalise2>
     </balise2>
</racine>
CTRL+C pour copier, CTRL+V pour coller
1
public class MyNodeFilter implements NodeFilter
2
{
3
     @Override
4
     public short acceptNode(Node n)
5
	   {
6
		     if (n.getNodeName().contentEquals("MonTag"))
7
			        return FILTER_ACCEPT;
8
    
9
		     return FILTER_SKIP;
10
	   }
11
}
public class MyNodeFilter implements NodeFilter
{
     @Override
     public short acceptNode(Node n)
	   {
		     if (n.getNodeName().contentEquals("MonTag"))
			        return FILTER_ACCEPT;
    
		     return FILTER_SKIP;
	   }
}
CTRL+C pour copier, CTRL+V pour coller
1
//L'interface DocumentTraversal permet de créer un objet NodeIterator
2
DocumentTraversal traversal = (DocumentTraversal) document;
3
//document.getDocumentElement() retourne la racine du document
4
//NodeFilter.SHOW_ELEMENT permet de spécifier que l'on souhaite des noeuds de types Element
5
//Le troisième paramètre indique qu'on utilise un filtre supplémentaire définit par la méthode acceptNode de la classe MyNodeFilter
6
7
TreeWalker walker = traversal.createTreeWalker(
8
	    document.getDocumentElement(), NodeFilter.SHOW_ALL,
9
	    new MyNodeFilter (), true);
10
	    
11
Node noeud = null;
12
noeud = walker.nextNode();
13
	    
14
while (noeud != null)
15
{
16
     System.out.println(((Element)noeud).getTextContent());
17
     noeud = walker.nextNode();
18
}
//L'interface DocumentTraversal permet de créer un objet NodeIterator
DocumentTraversal traversal = (DocumentTraversal) document;
//document.getDocumentElement() retourne la racine du document
//NodeFilter.SHOW_ELEMENT permet de spécifier que l'on souhaite des noeuds de types Element
//Le troisième paramètre indique qu'on utilise un filtre supplémentaire définit par la méthode acceptNode de la classe MyNodeFilter

TreeWalker walker = traversal.createTreeWalker(
	    document.getDocumentElement(), NodeFilter.SHOW_ALL,
	    new MyNodeFilter (), true);
	    
Node noeud = null;
noeud = walker.nextNode();
	    
while (noeud != null)
{
     System.out.println(((Element)noeud).getTextContent());
     noeud = walker.nextNode();
}
CTRL+C pour copier, CTRL+V pour coller
1
//Résultat obtenu
2
Tag1
3
Tag2
4
Tag3
5
Tag4
//Résultat obtenu
Tag1
Tag2
Tag3
Tag4
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Etienne Chognard, Nicolas Lhome, Kévin Jezequell 2014-2016 (Contributions : Stéphane Crozat, les étudiants de NF29) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)