从 org.w3c.dom.Node 获取 Xpath

2022-09-01 18:33:27

我可以从 org.w3c.dom.Node 获取完整的 xpath 吗?

假设当前节点指向 xml 文档中间的某个位置。我想提取该元素的xpath。

我正在寻找的输出 xpath 是 。节点 xpath 的父节点。只需忽略具有表达式并指向同一节点的 xpath 即可。//parent/child1/chiild2/child3/node


答案 1

没有用于获取 XPath 的通用方法,主要是因为没有一个通用 XPath 来标识文档中的特定节点。在某些架构中,节点将由属性唯一标识(并且可能是最常见的属性)。在其他情况下,每个元素(即标记)的名称足以唯一标识节点。在少数(不太可能,但可能)的情况下,没有一个唯一的名称或属性可以将您带到特定节点,因此您需要使用基数(获取第 m 个子节点的第 n 个子级...)。idname

编辑:在大多数情况下,创建一个依赖于架构的函数来组装给定节点的XPath并不难。例如,假设您有一个文档,其中每个节点都由一个属性唯一标识,并且您没有使用命名空间。然后(我认为)下面的伪Java将基于这些属性返回XPath。(警告:我还没有测试过这个。id)

String getXPath(Node node)
{
    Node parent = node.getParent();
    if (parent == null) {
        return "/" + node.getTagName();
    }
    return getXPath(parent) + "/" + "[@id='" + node.getAttribute("id") + "']";
}

答案 2

我正在为jOOX背后的公司工作,jOOX是一个库,为Java标准DOM API提供了许多有用的扩展,模仿jquery API。使用jOOX,您可以获得任何元素的XPath,如下所示:

String path = $(element).xpath();

然后,上面的路径将是这样的

/document[1]/library[2]/books[3]/book[1]