在 Java 中使用 XPath 解析 XML - 在 Java 中使用 Xpath 和 NodeList 从 XML 文件中获取数据
我有这个 xml 文件,我想使用 Xpath 获取一些值。
工作的一半已经完成,但是我在文件的最后部分(状态节点)遇到了一些麻烦
<?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>
,这里是java代码: 打包 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 );
}
}
}
}
输出将是:
第一个示例
wf1000 wf1 description 1 2 text text text text text text text
2
description1
description1
第二个示例
wf2000 wf2 description 2 3 text text text text text text text
3
description1
description1
description1
查看 ID 为 2 的状态,文本是 description2
而不是 description1
。 我认为解析器不会移动到第二个孩子,它总是仍然在第一个孩子。 那么我该怎么做以及怎么做才能获得状态属性?????????
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????????
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你将不得不做类似的事情:
You will have to do something like: