gpt4 book ai didi

java - 为什么 XPath 从整个文档返回节点,而不仅仅是选择节点

转载 作者:行者123 更新时间:2023-11-30 02:19:16 25 4
gpt4 key购买 nike

给定:

public class XPathTest {

public static void main(String args[]) throws Exception {
String xmlString
= "<a>"
+ "<b c=\"1\"/>"
+ "<b c=\"2\"/>"
+ "</a>";

ByteArrayInputStream bis = new ByteArrayInputStream(xmlString.getBytes());
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(bis));

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//b");

NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
dumpNodeList(nl);
for (int i = 0; i < nl.getLength(); i++) {
Node n = nl.item(i);
NodeList nl2 = (NodeList) expr.evaluate(n, XPathConstants.NODESET);
dumpNodeList(nl2);
}

}

public static void dumpNodeList(NodeList nl) {
System.out.println("NodeList length = " + nl.getLength());
for (int i = 0; i < nl.getLength(); i++) {
System.out.println("Node #" + i);
Element e = (Element) nl.item(i);
System.out.println("Name = " + e.getTagName());
System.out.println("Attr = " + e.getAttribute("c"));
}
System.out.println();
}
}

结果示例:

NodeList length = 2
Node #0
Name = b
Attr = 1
Node #1
Name = b
Attr = 2

NodeList length = 2
Node #0
Name = b
Attr = 1
Node #1
Name = b
Attr = 2

NodeList length = 2
Node #0
Name = b
Attr = 1
Node #1
Name = b
Attr = 2

我计算 XPath 表达式 //b ,将根文档节点传递给评估器。预计它会返回两个 b节点。

令我感到困惑的是,当我评估相同的表达式时,我没有传入根节点作为参数,而是传入了我之前找到的子节点之一。根据XPathExpression.evaluate(Object item) ,它表示在指定的上下文中计算已编译的 XPath 表达式,并以指定的类型返回结果。

表达式 //b ,意味着“给我所有 b 节点”。

直观上,我会认为如果我将 Node 传递给 XPathExpression.evalute(Object item) ,表达式将从该节点开始计算,作为“给我全部”部分的根,而不是整个文档。因此,我期望生成的 NodeList 包含一个节点,而不是两个节点。

但是,我得到了相同的两个节点,就像从整个文档中一样。

所以,两个问题是:

  1. 为什么要相对于整个文档来计算表达式,而不是仅仅使用传递节点作为计算的合成根?

  2. 如何使用传入的 Node 作为计算的合成根来获取要计算的表达式?

最佳答案

它按其应有的方式工作。请尝试使用 ./b,而不是 //b。也许M$帮助不是很有帮助,但是here他们有一些方便的例子。

关于java - 为什么 XPath 从整个文档返回节点,而不仅仅是选择节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47319017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com