我有以下 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:
“前缀:someName”
“。”
但不是:“prefix:someName2”。它返回空值。
我想我还是不太了解 namespace ,但我不明白什么?我试过从我的 xpath 中删除前缀,但没有任何效果。 我还检查了是否为 doc.lookupNamespaceURI(prefix) 的前缀返回了正确的 uri,确实如此。
如有任何帮助,我们将不胜感激。
最佳答案
查询prefix:XXX
的意思是child::prefix:XXX
,即找到一个名为prefix:XXX的上下文节点的元素child
。您的上下文节点是树根处的文档节点。文档节点有一个名为 prefix:someName
的子节点,但没有名为 prefix:someName2
的子节点。如果要查找文档节点的孙节点,请尝试查询 */prefix:someName2
。
关于java - 为什么我的 xpath 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46970456/