XDocument中当前节点的路径

时间:2011-05-05 20:54:16

标签: c# linq-to-xml

是否可以在XDocument中获取当前XElement的路径?例如,如果我在文档中的节点上进行迭代,那么我可以通过某种方式获取该节点的路径(XElement),以便返回类似\ root \ item \ child \ currentnode?的内容

3 个答案:

答案 0 :(得分:2)

内置任何内容,但您可以编写自己的扩展方法:

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();

但这并不考虑元素在其对等组内的位置。

答案 1 :(得分:1)

取决于您希望如何使用XPath。在任何一种情况下,你都需要自己走树并在途中构建XPath。

如果你想要显示可读的字符串 - 只需加入prent节点的名称(参见BrokenGlass建议)就可以正常工作

如果您想稍后在XPath上选择

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

请注意,如果您希望将XPath的真正通用版本发送到XML中的节点,则可能需要考虑注释和处理指令等特殊节点。

答案 2 :(得分:0)

我知道这个问题很老,但万一有人想要一个简单的衬垫:

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

用途:

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