【问题标题】:Path of Current Node in XDocumentXDocument 中当前节点的路径
【发布时间】:2011-05-05 20:54:15
【问题描述】:

是否可以在 XDocument 中获取当前 XElement 的路径?例如,如果我正在迭代文档中的节点,是否有某种方法可以获得该节点(XElement)的路径,以便它返回类似 \root\item\child\currentnode 的东西?

【问题讨论】:

  • 看看这个link的代码

标签: c# linq-to-xml


【解决方案1】:

没有内置任何东西,但您可以编写自己的扩展方法:

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】:

    取决于您希望如何使用 XPath。无论哪种情况,您都需要自己爬树并在此过程中构建 XPath。

    如果您想使用可读的字符串进行显示 - 只需加入 prent 节点的名称(请参阅 BrokenGlass 建议)就可以了

    如果你想稍后在 XPath 上选择

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

    请注意,如果您想要 XML 中节点的真正通用版本的 XPath,则可能需要考虑诸如 cmets 和处理指令之类的特殊节点。

    【讨论】:

      【解决方案3】:

      我知道这个问题很老了,但万一有人想得到一个简单的单行:

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

      用途:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 2013-09-17
        • 2018-01-25
        相关资源
        最近更新 更多