gpt4 book ai didi

java - 如何在 Java 中调用 XPath position() 函数?

转载 作者:行者123 更新时间:2023-11-30 08:13:59 24 4
gpt4 key购买 nike

这是我的 XML 代码:

test.xml

<l>
<i>
<a>AAA</a>
<b>BBB</b>
<c>CCC</c>
</i>
<i>
<a>AAA2</a>
<b>BBB2</b>
<c>CCC2</c>
</i>
<i>
...
</i>
</l>

我想用 Java 提取第二个 c 节点。我试过下面的代码:

测试.java

DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document d = docBuilder.parse("file:///C:/path/to/my/test.xml");

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//c[position()=2]");

// The following line raises a NPE
System.out.println("> " + ((Node) expr.evaluate(d, XPathConstants.NODE)).getTextContent());

然而,evaluate 方法返回空值,因此引发 NullPointerException (NPE)。

我错过了什么?

Java 6

最佳答案

情况是这样的:XPath 中的位置谓词通常应用于输入树的节点,而不是中间结果序列。像这样的 XPath 表达式

//c[position() = 2]       |   or //c[2]

意思是:

Select all element nodes c anywhere in the input document, if they are the second c child of their parent element.

现在让我们看看您的输入文档:

<l>
<i>
<a>AAA</a>
<b>BBB</b>
<c>CCC</c>
</i>
<i>
<a>AAA2</a>
<b>BBB2</b>
<c>CCC2</c>
</i>
<i>
...
</i>
</l>

其中的两个 c 元素都是其父元素的 first c 子元素,这就是结果集为空的原因。

打算做的是

  • 第一步找到输入文档中存在的所有 c 元素
  • 只取那些节点中的第二个作为中间结果序列

这正是 //c 周围的括号所做的:

(//c)[2]

If I run //i[position()=2], I get the second i only.

在输入中实际上一个 i 元素,它是其父元素的第二个 i 子元素。但是,这个表达式并不总是返回单个项目。如果你的输入文档的结构是这样的

<?xml version="1.0" encoding="UTF-8"?>
<root>
<l>
<i>
<a>AAA</a>
<b>BBB</b>
<c>CCC</c>
</i>
<i>
<a>AAA2</a>
<b>BBB2</b>
<c>CCC2</c>
</i>
<i>
...
</i>
</l>
<l>
<i>
<a>AAA</a>
<b>BBB</b>
<c>CCC</c>
</i>
<i>
<a>AAA2</a>
<b>BBB2</b>
<c>CCC2</c>
</i>
<i>
...
</i>
</l>
</root>

然后 //i[2] 将返回 两个 i 个元素。

关于java - 如何在 Java 中调用 XPath position() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29751839/

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