假设我有一个xml文档,并希望从每个节点中获取“NodeID”和“Description”元素,而不必知道它们是某个孩子的子元素,还是只是一个孩子。
<Stuff>
<data>
<Nodes>
<NodeID>1</NodeID>
<Name>thingA</Name>
<MoreInfo>
<Description>Scooter</Description>
</MoreInfo>
</Nodes>
<Nodes>
<NodeID>2</NodeID>
<Name>thingB</Name>
<MoreInfo>
<Description>Bike</Description>
</MoreInfo>
</Nodes>
</data>
</Stuff>
所以我最终会得到:1,踏板车; 2,自行车。
NodeList nodes = (NodeList) xpath.evaluate("Nodes", resultXml, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
logger.info("Evaluating: " + node.toString());
String nodeID = xpath.evaluate("//NodeID", node);
String description = xpath.evaluate("//DescriptionID", node);
System.out.println("Found: " + nodeID + ", " + description);
}
输出如下:
Evaluating: <NodeID>1</NodeID><Name>thingA</Name><MoreInfo><Description>Scooter</Description></MoreInfo>
Found: 1, Scooter
Evaluating: <NodeID>2</NodeID><Name>thingB</Name><MoreInfo><Description>Bike</Description></MoreInfo>
Found: 1, Scooter
节点是正确的,但它保持“发现”的东西,好像它是从xml文档的开头看。如何只搜索相关节点的后代?我认为作为评估源的节点可以解决这个问题......
答案 0 :(得分:2)
//NodeID
和//Description
是绝对路径,它们将从包含上下文节点的文档的根开始搜索。这种情况下的表达式将匹配整个文档中名为NodeID
(分别为Description
)的所有节点,当您将这样的表达式计算为字符串时,这将为您提供第一个匹配节点的字符串值按文件顺序。
要查看上下文节点本身,您需要通过添加前导点来使用 relative 路径,例如.//NodeID
。