在XPath表达式Java中使用整数变量从具有名称空间的重复节点提取信息
解决了!谢谢你们 你的建议使我找到了答案。所以你们所有人的建议都值得感谢 放置int变量的解决方案如下:在XPath表达式Java中使用整数变量从具有名称空间的重复节点提取信息,java,xpath,Java,Xpath,解决了!谢谢你们 你的建议使我找到了答案。所以你们所有人的建议都值得感谢 放置int变量的解决方案如下: //Put my xpath into a string variable where it can evaluate my integer "counter" String myString = "/*[local-name()='root' and namespace-uri()='DK']/*[local-name()='book' and namespace-uri()='DK']
//Put my xpath into a string variable where it can evaluate my integer "counter"
String myString = "/*[local-name()='root' and namespace-uri()='DK']/*[local-name()='book' and namespace-uri()='DK']" + counter + "]/*[local-name()='item1' and namespace-uri()='DK']/*[local-name()='item2' and namespace-uri()='DK']/*[local-name()='date' and namespace-uri()='DK'][" + counter + "]"
//Then simply put that string variable into the xpath expression.
System.out.print(myString);
原问题如下:
首先,我感谢任何帮助。提前感谢您的帮助
我有一个需要解析的XML文件
比如说
<root xmlns="DK">
<book>
<item1>
<item2>
<date>xxx
</date>
<date>x1x1x1
</date>
</item2>
</item1>
</book>
<book>
<item1>
<item2>
<date>yyy
</date>
<date>y1y1y1
</date>
</item2>
</item1>
</book>
</root>
我的问题就在这里。因为有几个重复的节点是嵌套的,它们的名称完全相同,所以我使用一个整数计数器变量按编号将它们取出来
我的XPath表达式不理解我正在输入一个整数变量“counter”
我可以用什么语法来实现这一点吗?
还是不可能
提前谢谢
DK我在代码中没有看到对的任何调用,只是注释中有一个非常混乱的XPath表达式 以下代码为您获取每个中第一个
的节点列表:
请注意,XPath从1开始计数,因此date[1]
是第一个元素,而不是Java中的第二个元素
如果您不需要名称空间感知,可以只使用“/root/book/item1/item2/date[1]”
(并且可能会删除对DocumentBuilderFactory.setNamespaceAware(true);
或等效项的调用)
如果item2
在整个文档中是唯一的,您甚至可以将XPath表达式简化为“//item2/date[1]
”(对于NS感知,请在两个路径段前面加上DK:
,如上所述)。您可以在XPath表达式中引用变量$counter
,您可以通过定义XPathVariableResolver并将其与XPathFactory关联来设置Java API中变量的值。即使存在事先未知的嵌套,也可以使用XPath表达式,如:
(//*[local-name()='root' and namespace-uri()='DK'])[$k]
其中,$k
可替换为正整数
注意事项:
以上表达式中的括号是必需的
< > XPath中的索引是基于1的,不是基于0的,如C或C++。< /P>
为了正确地实现名称空间感知,他还必须将前缀绑定到名称空间。我不知道为什么,因为语法看起来正确。。。一定是我做错了什么,您是否按照Michael Kay的建议,以将变量名链接到您的计数器的方式实现了XPathVariableResolver
?对不起,我正在执行getStringValue();在上面。如果我输入一个[$k],它将返回'null',但如果我输入一个实际的数字,它将起作用。我还没有试过XPathVariableResolver。。。我现在正在研究它。@DKImportant:是的,您应该将值转换为字符串。在C#中,我会写:string.format((//*[local-name()='root'和namespace-uri()='DK'])[$k]”,I)代码>
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList dates = (NodeList) xpath.evaluate("/DK:root/DK:book/DK:item1/DK:item2/DK:date[1]", document, XPathConstants.NODESET);
for (int i = 0; i < dates.getLength(); i++) {
Node item = dates.item(i);
String content = item.getTextContent().trim();
System.err.println(content);
}
xxx
yyy
(//*[local-name()='root' and namespace-uri()='DK'])[$k]