如何获取xml文件中每个节点的完整路径?

joh*_*ash 5 xml xpath

我正在使用 xpath 遍历 xml 文件。我想知道是否有一种简单的方法来获取文件中每个节点的路径。我能想到的一种方法是收集数组中的所有节点。然后将其传递到一个函数,该函数将每个节点作为参数,并不断寻找父节点,直到到达文档根。所以,

            function getPathForNode(eachXmlNode, path) {
                if ( eachXmlNode == rootNode ) {
                    return path;
                } else {
                    getPathForNode(eachXmlNode->parent, path+path_of_parent);
                }
            }
Run Code Online (Sandbox Code Playgroud)

请告诉我是否还有其他更好的方法或者递归函数是否正确?

Ben*_*ela 4

这取决于您使用的主机和 XPath 语言版本。

最简单的方法是使用 XPath 3,它具有以下path功能:

//node()/path()
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想在路径中包含命名空间,则类似:

//node()/replace(path(), "Q[{][^}]*[}]", "")
Run Code Online (Sandbox Code Playgroud)

XPath 2 解决方案使用ancestor-or-self::*string-join

for $node in //node()
return concat( "/",
  string-join(
    for $a in $node/ancestor-or-self::*, 
        $name in node-name($a)
    return concat($name, "[",  $a/../node()[node-name(.) = $name]/(if (. is $a) then position() else ()), "]")
  , "/"),
  if ($node/self::text()) then concat("/text()[",$node/../text()/(if (. is $node) then position() else ()),"]") else ()
)
Run Code Online (Sandbox Code Playgroud)