这感觉就像一个菜鸟问题。
我正在查看一堆操作 XML DOM 的 Java 代码。(这些类是JDK 7 附带的库存等。)它有很多看起来像这样的地方org.w3c.dom.Document
:javax.xml.xpath.XPath
String expr = "/fixed/path/through/the/hierarchy";
// actual code reuses factory instances, etc
XPath xpath = XPathFactory.newInstance().newXPath();
Node topNode = someDocumentInstance.getFirstChild();
Node node = (Node) xpath.evaluate (expr, topNode, XPathConstants.NODE);
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeName().equalsIgnoreCase("somePrefix:someTag")) {
// "return child;" or otherwise break out of the loop
}
}
这一切都有效。但是这个循环似乎是一项乏味的工作。如果我们已经在使用 XPath 来获取节点,为什么还要遍历该节点的子节点来寻找已知标记?
所以我尝试重写一个部分来直接获取子节点。但查询使用
String expr = "/fixed/path/through/the/hierarchy/somePrefix:someTag";
从不匹配任何东西。我已经尝试过请求XPathConstants.NODESET
或等变体.STRING
,但仍然没有结果。(无论如何,这些节点应该只有一个。)
我觉得我在这里遗漏了一些非常明显的东西,但我无法弄清楚为什么完整的查询会失败,当查询父级加上通过子级的手动循环有效时。getNodeName()
当我使用这样的查询时,XPath 是否会测试节点的某些质量?
我想出的唯一理论是它与 XML 名称空间有关,在这个项目中没有使用。(实际上.setNamespaceAware(false)
在 DocumentBuilderFactory 实例上有一个调用,并带有一条评论说“不要这样做,否则一切都会中断”。)