我刚刚发现了XPath,我试图使用它来解析XML文件。我读了一些关于它的课程,但我遇到了一个问题。当我尝试从文件中获取NodeList时,getLength()方法始终返回0。 但是,当我尝试
时document.getElementsByTagName("crtx:env").getLength()
输出正确(在我的情况下为7)。 我真的不明白,因为我的节点列表是根据我的文档构建的,输出应该是相似的,不是吗?
以下是我的代码的一部分:
IFile f = (IFile) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorInput().getAdapter(IFile.class);
String fileURL = f.getLocation().toOSString();
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = builderFactory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document document = null;
if (builder != null){
try{
document = builder.parse(fileURL);
System.out.println("DOCUMENT URI : " + document.getDocumentURI());
} catch (Exception e){
e.printStackTrace();
}
} else {
System.out.println("builder null");
}
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodeList = null;
try {
nodeList = (NodeList) xPath.compile("crtx:env").evaluate(document, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
System.out.println("NODELIST SIZE : " + nodeList.getLength());
System.out.println(document.getElementsByTagName("crtx:env").getLength());
}
第一个System.out.println()返回相干输出(一个好的URI),但最后两行返回不同的数字。
任何帮助将不胜感激。 谢谢你的阅读。
答案 0 :(得分:1)
为具有名称空间的XML定义了XPath,因此设置了
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
然后要使用带有命名空间前缀的路径,您需要使用https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPath.html#setNamespaceContext%28javax.xml.namespace.NamespaceContext%29来绑定用于命名空间URI的前缀,有关示例,请参阅https://xml.apache.org/xalan-j/xpath_apis.html#namespacecontext
使用名称空间感知DOM,您需要更改getElementsByTagName调用以使用getElementsByTagNameNS。