OVH Cloud OVH Cloud

dom4j et XPath

3 réponses
Avatar
Wamli
Bonjour,

J'utilise dom4j pour circuler dans un arbre XML, mais j'ai un comportement
bizzarre. Voici un fichier XML type :

<?xml version="1.0"?>
<network name="Simple">
<main_topology>
<node id="0">
<link dest="1"/>
</node>
<node id="1">
<link dest="2"/>
</node>
<node id="2">
<link dest="3"/>
</node>
<node id="3"/>
<node id="4"/>
</main_topology>
</network>

Je souhaite pouvoir extraire tous les éléments "node" puis, pour chacun
d'eux, les sous-éléments "link". Alors pour les éléments nodes, c'est ok, je
fais

List<org.dom4j.Node> nodeList =
document.selectSingleNode("//main_topology").selectNodes("//node");

et il me donne une liste contenant les cinq noeuds. Par contre après, pour
les "link", je fais par exemple

List<org.dom4j.Node> linkList =
nodeList.get(i).selectNodes("//link");

mais là, il m'extrait tous les éléments link du document XML (dans mon
exemple, trois) et non juste ceux qui sont rattachés au noeud. C'est comme
si la formule XPath était appliquée à la racine du document et non au noeud
lui-même. Quelqu'un a-t-il une idée ?


voici le code entier.

Document document = null;
try {
SAXReader reader = new SAXReader();
document = reader.read(stream);
}
catch (DocumentException e) {
throw new IllegalStateException(e);
}

// reading the network attached infos
Node mainTopology = document.selectSingleNode("//main_topology");

AbstractGraph newGraph = new DefaultGraphImpl();

// reading the nodes attached infos
for (Node n : (List<Node>)(mainTopology.selectNodes("//node"))) {
Element el = (Element)n;
int id = Integer.parseInt(el.attribute("id").getValue());
newGraph.addNode(new DefaultNodeImpl(), id);
for (Node link : (List<Node>)(n.selectNodes("//link"))) {
Element linkEl = (Element)link;
int dest =
Integer.parseInt(linkEl.attribute("dest").getValue());
newGraph.addLink(new DefaultLinkImpl(), id, dest);
}
}

3 réponses

Avatar
Wamli
J'ai trouvé la répoonse tout seul... le "/" au début d'une expression XPath
signifie que l'on part à la racine du graphe... Donc tout va bien




"Wamli" wrote in message news:43998d51$
Bonjour,

J'utilise dom4j pour circuler dans un arbre XML, mais j'ai un comportement
bizzarre. Voici un fichier XML type :

<?xml version="1.0"?>
<network name="Simple">
<main_topology>
<node id="0">
<link dest="1"/>
</node>
<node id="1">
<link dest="2"/>
</node>
<node id="2">
<link dest="3"/>
</node>
<node id="3"/>
<node id="4"/>
</main_topology>
</network>

Je souhaite pouvoir extraire tous les éléments "node" puis, pour chacun
d'eux, les sous-éléments "link". Alors pour les éléments nodes, c'est ok,
je fais

List<org.dom4j.Node> nodeList >
document.selectSingleNode("//main_topology").selectNodes("//node");

et il me donne une liste contenant les cinq noeuds. Par contre après, pour
les "link", je fais par exemple

List<org.dom4j.Node> linkList > nodeList.get(i).selectNodes("//link");

mais là, il m'extrait tous les éléments link du document XML (dans mon
exemple, trois) et non juste ceux qui sont rattachés au noeud. C'est comme
si la formule XPath était appliquée à la racine du document et non au
noeud lui-même. Quelqu'un a-t-il une idée ?


voici le code entier.

Document document = null;
try {
SAXReader reader = new SAXReader();
document = reader.read(stream);
}
catch (DocumentException e) {
throw new IllegalStateException(e);
}

// reading the network attached infos
Node mainTopology = document.selectSingleNode("//main_topology");

AbstractGraph newGraph = new DefaultGraphImpl();

// reading the nodes attached infos
for (Node n : (List<Node>)(mainTopology.selectNodes("//node"))) {
Element el = (Element)n;
int id = Integer.parseInt(el.attribute("id").getValue());
newGraph.addNode(new DefaultNodeImpl(), id);
for (Node link : (List<Node>)(n.selectNodes("//link"))) {
Element linkEl = (Element)link;
int dest =
Integer.parseInt(linkEl.attribute("dest").getValue());
newGraph.addLink(new DefaultLinkImpl(), id, dest);
}
}



Avatar
Simon OUALID
Wamli wrote:
J'ai trouvé la répoonse tout seul... le "/" au début d'une expression XPath
signifie que l'on part à la racine du graphe... Donc tout va bien




Oui, tu peux d'ailleurs directement utiliser //link qui te récupérera
tous les tags link de ton arbre xml.

Avatar
TestMan
Wamli wrote:
J'ai trouvé la répoonse tout seul... le "/" au début d'une expression XPath
signifie que l'on part à la racine du graphe... Donc tout va bien


Yep, AMHA ça aurait été plus intuitif (clair?) si au lieu de // ils
avaient choisit une syntaxe /.../ par exemple ;-)

A+

TM