Java 带有XML名称空间的XPath-名称空间上下文为';t地址
我想通过XPath查询XML。此XML已声明命名空间。我已经读到,必须在XPath对象上设置NameContext,并且应该在文档工厂中启用名称空间感知 但是getNamespaceURI(#String)方法中的输出永远不会打印。我做错了什么Java 带有XML名称空间的XPath-名称空间上下文为';t地址,java,xpath,Java,Xpath,我想通过XPath查询XML。此XML已声明命名空间。我已经读到,必须在XPath对象上设置NameContext,并且应该在文档工厂中启用名称空间感知 但是getNamespaceURI(#String)方法中的输出永远不会打印。我做错了什么 String xpathStr = ... //some string DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(t
String xpathStr = ... //some string
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
Document document = builder.parse(settlementFile);
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath(),
xpath.setNamespaceContext(new NamespaceContext() {
public String getNamespaceURI(String prefix) {
System.out.println("I'm here");
... //do some work
}
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
});
XPathExpression xpathExpression = xpath.compile(xpathStr);
String result = xpathExpression.evaluate(document);
请提供最少但完整的代码片段,以便我们重现问题。告诉我们您正在处理名称空间,但不显示XML的任何细节或名称空间中的XPath是毫无意义的。我的XML以
…
开始,据我所知,当我使用上述构造时,XPath不需要任何名称空间的特殊性。当我删除“xmlns”部分时,评估就起作用了,必须使用绑定到该名称空间的前缀,例如/rp:Report/rp:Details/rp:Data
,然后getNamespaceURI
必须返回字符串http://com/company/report
用于前缀rp
。当然,您可以选择任何想要的前缀,但是您的XPath代码必须使用前缀,并且您的上下文必须返回该前缀的匹配URI。谢谢您的帮助。我没有真正理解名称空间的概念。