java - 如何从 NodeInfo 创建 xPath 语句?

标签 java xml xpath saxon

我正在使用带有 Saxon 9.7 HE 的 S9API,并且我有一个 NodeInfo 对象。我需要创建一个与此 NodeInfo 唯一对应的 xPath 语句。获取前缀、节点名称和父节点很容易:

String prefix = node.getPrefix();
String localPart = node.getLocalPart();
NodeInfo parent = node.getParent();

这样我就可以沿着树向上走,边走边构建 xPath。但我找不到任何获取位置谓词信息的方法。 IOW,创建还不够:

/persons/person/child

因为它可能匹配多个子元素。我需要创建:

/persons/person[2]/child[1]

仅匹配一个子元素。关于如何获取位置谓词信息有什么想法吗?或者也许有更好的方法来做到这一点?

顺便说一句,对于那些使用通用 DOM 而不是 S9API 的人来说,这里有一个简单的解决方案:http://practicalxml.sourceforge.net/apidocs/net/sf/practicalxml/DomUtil.html#getAbsolutePath(org.w3c.dom.Element)

<小时/>

编辑:@Michael Kay 的答案有效。添加一些肉:

XPathExpression xPathExpression = xPath.compile("./path()");
List matches = (List) xPathExpression.evaluate(node, XPathConstants.NODESET);
String pathToNode = matches.get(0).toString();
// If you want to remove the expanded QName syntax:
pathToNode = pathToNode.replaceAll("Q\\{.*?\\}", "");

这必须使用先前用于获取 NodeInfo 对象的同一 xPath 对象来完成。

最佳答案

在 XPath 3.0 中,您可以使用 fn:path()。

早期的 Saxon 版本提供 saxon:path()。

这里的挑战是处理命名空间。 fn:path() 使用新的扩展 QName 语法返回对命名空间前缀绑定(bind)不敏感的路径

/Q{}persons/Q{}person[2]/Q{}child[1]

关于java - 如何从 NodeInfo 创建 xPath 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34005288/

相关文章:

java - 使用 JDOM 解析时处理特殊字符

c# - 将 XML 反序列化为类

python-3.x - 找到WebDriver元素后,如何在该元素上应用xpath来进一步缩小其范围?

java - 使用 JDK 工具 wsimport 从 .NET 2.0 应用程序生成的 WSDL 生成 Java SOAP Web 服务客户端时出现问题

Java - 二进制插入排序 StackOverFlowError

java - 一维数组中的三角矩阵 get()

c# - 将 cXML 反序列化为 C# 类

java - 通过tcp将json发送到logstash,保持连接打开,从不显示

php - Simplexml xpath 和 xmlns

python - 如何使用 Selenium WebDriver 和 Python 提取元素中的文本?