XDocument中当前节点的路径

6

是否可以获取XDocument中当前XElement的路径?例如,如果我正在遍历文档中的节点,是否有一种方法可以获取该节点(XElement)的路径,以便返回类似于\root\item\child\currentnode的内容?


1
请查看此链接中的代码:http://seattlesoftware.wordpress.com/2009/03/13/get-the-xpath-to-an-xml-element-xelement/ - Sitnik
3个回答

3

虽然没有内置的方法,但是您可以编写自己的扩展方法:

public static string GetPath(this XElement node)
{
    string path = node.Name.ToString();
    XElement currentNode = node;
    while (currentNode.Parent != null)
    {
        currentNode = currentNode.Parent;
        path = currentNode.Name.ToString() + @"\" + path;
    }
    return path;
}


XElement node = ..
string path = node.GetPath();

这并未考虑元素在同级组中的位置。

2

我知道这个问题很老了,但是如果有人想要一个简单的一行回答:

XElement element = GetXElement();
var xpath = string.Join ("/", element.AncestorsAndSelf().Reverse().Select(a => a.Name.LocalName).ToArray());

使用:

using System.Linq;
using System.Xml.Linq;

1

根据您想要如何使用XPath。在任何情况下,您都需要自己遍历树并在途中构建XPath。

如果您想要一个可读的字符串以供显示-只需连接父节点的名称(请参见BrokenGlass建议)即可正常工作

如果您想要稍后选择XPath

  • 位置XPath(指定每个节点在其父节点中的位置)是一种选项(类似于//[3]/*)。您需要将属性视为特殊情况,因为属性上没有定义顺序
  • 具有预定义前缀的XPath(命名空间到前缀需要单独存储)-/my:root/my:child[3]/o:prop1/@t:attr3
  • 当您想要半可读和可移植的XPath /*[name()='root' & namespace-uri()='http://my.namespace']/.... (请参见规范的名称和namespace-uri函数http://www.w3.org/TR/xpath/#function-namespace-uri

请注意,如果您想要XML内部节点的XPath的真正通用版本,则可能需要考虑注释和处理指令等特殊节点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接