L'analyse de XML avec XPath en Java - Obtenir les données à partir du fichier XML avec Xpath et NodeList en Java

J'ai ce fichier xml et je veux obtenir certaines valeurs avec Xpath.

La moitié du travail est fait mais j'ai quelques difficultés dans la dernière partie du fichier(États Nœud)

<?xml version="1.0" encoding="UTF-8"?>
<favoris>
    <workflow codewf="wf1000">
        <information>
            <title>wf1</title>
            <desc>description 1</desc>
            <nberState>2</nberState>
            <text>text text text text text text text</text>
        </information>
        <states>
            <state id="1" IDemployee="2">description1</state>
            <state id="2" IDemployee="3">description2</state>
        </states>
    </workflow>

    <workflow codewf="wf2000">
        <information>
            <title>wf2</title>
            <desc>description 2</desc>
            <nberState>3</nberState>
            <text>text text text text text text text</text>
        </information>
        <states>
            <state id="1" IDemployee="3">description1</state>
            <state id="2" IDemployee="2">description2</state>
            <state id="3" IDemployee="4">description2</state>
        </states>
    </workflow>

</favoris>

Et voici le code java:
package myxml;

import java.io.FileReader;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class xmlParty {
public static void main(String[] args) throws Exception {
XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
NodeList favoris = (NodeList) xPath.evaluate("/favoris/workflow[@codewf='wf1000']", 
new InputSource(new FileReader("a.xml")), 
XPathConstants.NODESET);
for (int i = 0; i < favoris.getLength(); i++) {
Element workflow = (Element) favoris.item(i);
String title = xPath.evaluate("information/title", workflow);
String desc_w = xPath.evaluate("information/desc", workflow);
String nberState = xPath.evaluate("information/nberState", workflow);
String text = xPath.evaluate("information/text", workflow);
System.out.println(workflow.getAttribute("codewf") +" "+title + " " + desc_w + " " + nberState + " " + text );
NodeList States = (NodeList)xPath.evaluate("states/state", workflow, XPathConstants.NODESET);
System.out.println(States.getLength());
for (int k = 0; k < States.getLength(); k++) {
String desc_state = xPath.evaluate("states/state", workflow);
System.out.println(desc_state ); 
}
}
}
}

et la sortie sera :

Premier exemple

wf1000 wf1 description 1 2 text text text text text text text
2
description1
description1

Deuxième exemple

wf2000 wf2 description 2 3 text text text text text text text
3
description1
description1
description1

Regardant l'état avec l'ID 2, le texte est description2 pas description1 .
Je pense que l'analyseur ne bouge pas pour le deuxième enfant et il reste toujours à la firsst enfant.
Alors, comment puis-je faire et comment le faire de façon à obtenir l'attribut de l'état????????

Ne devriez-vous pas faire une itération sur les États NodeList?!
J'ai eu un briallint réponse à cette question sur la stackoverflow.com/a/21890347/3245218

OriginalL'auteur Ali Ben Messaoud | 2011-04-15