我正在使用 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)
请告诉我是否还有其他更好的方法或者递归函数是否正确?
这取决于您使用的主机和 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)
归档时间: |
|
查看次数: |
5138 次 |
最近记录: |