我有以下xml:
<?xml version="1.0" encoding="UTF-8"?>
<prefix:someName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prefix="someUri" xsi:schemaLocation="someLocation.xsd">
<prefix:someName2>
....
</prefix:someName2>
</prefix:someName>
我的代码看起来像这样:
private Node doXpathThingy(Document doc) {
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
XPath xPath = XPathFactory.newInstance().newXPath();
xPath.setNamespaceContext(new NamespaceContext(){
@Override
public String getNamespaceURI(String prefix) {
if (prefix == null) {
throw new NullPointerException("Null prefix");
}
return doc.lookupNamespaceURI(prefix);
}
@Override
public String getPrefix(String namespaceURI) {
return null;
}
@Override
public Iterator getPrefixes(String namespaceURI) {
return null;
}
});
try {
XPathExpression expr = xPath.compile(xpathString);
return (Node)expr.evaluate(doc, XPathConstants.NODESET);
} catch (Exception e) {
.... }
}
我试图让它与任何有效的xpath一起使用。它适用于这些xpath:
&#34;前缀:someName&#34;
&#34;&#34;
但不是:&#34;前缀:someName2&#34;。它返回null。
我想我还没有得到关于名称空间的内容,但我不明白什么?我试过从我的xpath中省略前缀,但是根本没有任何作用。 我还检查了doc.lookupNamespaceURI(前缀)的前缀是否返回了正确的uri,它是。
非常感谢任何帮助。
答案 0 :(得分:2)
不能说我熟悉Java做XPath的方式,但看起来你正在从文档的根目录进行XPath查询,所以你看到的是预期的行为。
尝试在doc
中的任何位置找到someName2 //prefix:someName2
或者这样可以找到someName2的孩子
/prefix:someName/prefix:someName2
或者将其作为任何根元素的直接子元素
/*/prefix:someName2
答案 1 :(得分:2)
查询prefix:XXX
表示child::prefix:XXX
,即查找名称为prefix:XXX
的上下文节点的元素子元素。您的上下文节点是树根的文档节点。文档节点有一个名为prefix:someName
的子项,但它没有名为prefix:someName2
的子项。如果要查找文档节点的孙,请尝试查询*/prefix:someName2
。