Parcours avec TreeWalker
Définition : TreeWalker
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
Syntaxe : createTreeWalker
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ément : NodeFilter
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.
public class MyNodeFilter implements NodeFilter
{
public short acceptNode(Node n)
{
if (n.getNodeName().contentEquals("MonTag"))
return FILTER_ACCEPT;
return FILTER_SKIP;
}
}
public class MyNodeFilter implements NodeFilter { @Override public short acceptNode(Node n) { if (n.getNodeName().contentEquals("MonTag")) return FILTER_ACCEPT; return FILTER_SKIP; } }
Exemple : Utilisation de l'objet TreeWalker
<racine>
<balise1>
<MonTag>Tag1</MonTag>
<MonTag>Tag2</MonTag>
</balise1>
<balise2>
<sousBalise2>
<MonTag>Tag3</MonTag>
<MonTag>Tag4</MonTag>
</sousBalise2>
</balise2>
</racine>
<racine> <balise1> <MonTag>Tag1</MonTag> <MonTag>Tag2</MonTag> </balise1> <balise2> <sousBalise2> <MonTag>Tag3</MonTag> <MonTag>Tag4</MonTag> </sousBalise2> </balise2> </racine>
public class MyNodeFilter implements NodeFilter
{
public short acceptNode(Node n)
{
if (n.getNodeName().contentEquals("MonTag"))
return FILTER_ACCEPT;
return FILTER_SKIP;
}
}
public class MyNodeFilter implements NodeFilter { @Override public short acceptNode(Node n) { if (n.getNodeName().contentEquals("MonTag")) return FILTER_ACCEPT; return FILTER_SKIP; } }
//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();
}
//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(); }