我在使用XPath时遇到了一些麻烦。由于某种未知的原因,我从表达式得到的结果是来自另一个函数运行的结果。
这是我班级的构造函数:
Wine(Node ndWine){
try{
xpath = XPathFactory.newInstance().newXPath();
}
catch(Exception e)
{}
Node ndName = null;
try{
ndName = (Node)xpath.evaluate("//name", ndWine, XPathConstants.NODE);
}
catch(Exception e)
{}
if (ndName != null)
name = ndName.getTextContent();
}
这是XML:
<cellar>
<wine>
<name>Jasnières</name>
</wine>
<wine>
<name>Ballet d'Octobre</name>
</wine>
</cellar>
在调用方法中,我有另一个xpath表达式,它将文档分解为<wine>
元素列表。为每个节点调用上面的代码
在调试器中,我检查在第二次运行时ndWine
节点实际上包含来自文档的第二个节点的数据,但评估总是返回Jasnieres
值而不是ballet d'octobre
,我无法理解。
任何根本原因的想法?
答案 0 :(得分:3)
使用//
启动XPath表达式使其成为绝对路径。即使您传入<wine>
元素,它也会忽略它并从文档根开始。在前面添加.
以使其成为相对路径:
.//name
或者更好的是,如果可以,请避免使用//
语法。如果您确切知道descendant-or-self
元素的确切位置,最好避免进行完整的<name>
搜索。如果它们总是直接位于<wine>
元素内,则使用此XPath:
name
答案 1 :(得分:0)
试试这段代码
try {
expr = xpath.compile("/cellar/wine/name");
nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
} catch (XPathExpressionException ignored) {}
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node != null) {
NodeList childNodes = node.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node childNode = childNodes.item(j);
if (childNode.getNodeType() == Node.TEXT_NODE) {
System.out.println(childNode.getNodeValue());
}
}
}
}