6

I have this xml file and I want to get some values with Xpath.

The half of job is done but I get some trouble in the last part of file(States Node)

<?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>

And here the java code: 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 ); 
      }


   }
  }
}

and the output will be :

First example

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

Second example

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

Looking at the state with ID 2, the text is description2 not description1 . I think the parser don't move to the second child and it always still at the firsst child. So how can I do and also how to do too to get the attribute of state????????

2
  • Shouldn't you iterate over States NodeList?! Commented Apr 15, 2011 at 14:46
  • I got a briallint answer of this question on stackoverflow.com/a/21890347/3245218 Commented Feb 19, 2014 at 19:34

1 Answer 1

3

You will have to do something like:

for (int k = 0; k < States.getLength(); k++) {
          String desc_state = xPath.evaluate("states/state[position()=" + (k + 1) + "]", workflow);
          String id_employee = xPath.evaluate("states/state[position()=" + (k + 1) + "]/@IDemployee", workflow);
          System.out.println(desc_state + ":" + id_employee); 
}
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for fast reply and how to do for attributes??
@nabeelmukhtar : I am using xpath in java for xml signatures but the xpath transformation does not work. Please see this link - stackoverflow.com/questions/10698287/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.