XDocument中当前节点的路径

发布于 2024-11-05 12:02:03 字数 126 浏览 0 评论 0 原文

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

Is it possible to get the path of the current XElement in an XDocument? For example, if I'm iterating over the nodes in a document is there some way I can get the path of that node (XElement) so that it returns something like \root\item\child\currentnode ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风吹雨成花 2024-11-12 12:02:03

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

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

但这并不能说明元素在其对等组中的位置。

There's nothing built in, but you could write your own extension method:

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

This doesn't account for the position of the element within its peer group though.

凉城凉梦凉人心 2024-11-12 12:02:03

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

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

用途:

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

I know the question is old, but in case someone wants to get a simple one liner:

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

Usings:

using System.Linq;
using System.Xml.Linq;
萌化 2024-11-12 12:02:03

取决于您想要如何使用 XPath。无论哪种情况,您都需要自己沿着树向上走,并在此过程中构建 XPath。

如果你想有可读的字符串用于显示 - 只需加入当前节点的名称(请参阅 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)

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

Depending on how you want to use the XPath. In either case you'll need to walk tree up yourself and build XPath on the way.

If you want to have readable string for dispaly - just joining names of prent nodes (see BrokenGlass suggestion) works fine

If you want select later on the XPath

  • positional XPath (specify position of each node in its parent) is one option (something like //[3]/*). You need to consider attributes as special case as there is no order defined on attributes
  • XPath with pre-defined prefixes (namespace to prefix need to be stored separately) - /my:root/my:child[3]/o:prop1/@t:attr3
  • XPath with inlined namespaces when you want semi-readable and portable XPath /*[name()='root' & namespace-uri()='http://my.namespace']/.... (see specification for name and namespace-uri functions http://www.w3.org/TR/xpath/#function-namespace-uri)

Note that special nodes like comments and processing instructions may need to be taken into account if you want truly generic version of the XPath to a node inside XML.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文