我将Java与Saxon HE 9.4一起使用,因此我可以获得XPath 2.0支持。
给定以下 XML 实例文档:
<entities>
<entity>
<person>
James
</person>
</entity>
<entity>
<legalEntity>
ACME
</legalEntity>
</entity>
</entities>
我知道我可以通过执行以下操作来获取实体元素标签的列表:
XPathExpression expr = xpath.compile("/entities/entity/*");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0 ; i < nodes.getLength() ; i++)
System.out.println("element name = "+ nodes.item(i).getNodeName());
以上将输出:
element name = person
element name = legalEntity
......正如预期的那样。
但是,逻辑分布在两个地方:XPath 表达式本身和对getNodeName
方法的调用。我想要的是一个 XPath 表达式,它会返回一个通用的结果列表,我可以通过调用一些通用方法(不是getNodeName
)来迭代它。
这样,所有逻辑都可以驻留在 XPath 表达式本身中,我的代码可以将 XPath 字符串保存在文件中并在运行时处理它们以获取结果列表。
尝试 XPAth 表达式/entities/entity/*/name()
仅获取第一个值(人):
XPathExpression expr = xpath.compile("/entities/entity/*/name()");
System.out.println("element name = "+expr.evaluate(doc));
...如果我尝试将其转换为 a ,则代码会在运行时中断NodeList
:
XPathExpression expr = xpath.compile("/entities/entity/*/name()");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0 ; i < nodes.getLength() ; i++) {
...
(以上失败net.sf.saxon.trans.XPathException: Cannot convert XPath value to Java object: required class is org.w3c.dom.NodeList; supplied value has type xs:string
:)
那么是否有一种通用的方法可以让XPath表达式评估为结果列表(可能是元素标签、元素值、属性值和标签等),以便迭代这些结果的代码在所有情况下都是相同的,并且不会不必区分对getNodeName()
orgetNodeValue()
的调用