【发布时间】:2011-05-05 20:54:15
【问题描述】:
是否可以在 XDocument 中获取当前 XElement 的路径?例如,如果我正在迭代文档中的节点,是否有某种方法可以获得该节点(XElement)的路径,以便它返回类似 \root\item\child\currentnode 的东西?
【问题讨论】:
-
看看这个link的代码
标签: c# linq-to-xml
是否可以在 XDocument 中获取当前 XElement 的路径?例如,如果我正在迭代文档中的节点,是否有某种方法可以获得该节点(XElement)的路径,以便它返回类似 \root\item\child\currentnode 的东西?
【问题讨论】:
标签: c# linq-to-xml
没有内置任何东西,但您可以编写自己的扩展方法:
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();
但这并没有考虑元素在其对等组中的位置。
【讨论】:
取决于您希望如何使用 XPath。无论哪种情况,您都需要自己爬树并在此过程中构建 XPath。
如果您想使用可读的字符串进行显示 - 只需加入 prent 节点的名称(请参阅 BrokenGlass 建议)就可以了
如果你想稍后在 XPath 上选择
请注意,如果您想要 XML 中节点的真正通用版本的 XPath,则可能需要考虑诸如 cmets 和处理指令之类的特殊节点。
【讨论】:
我知道这个问题很老了,但万一有人想得到一个简单的单行:
XElement element = GetXElement();
var xpath = string.Join ("/", element.AncestorsAndSelf().Reverse().Select(a => a.Name.LocalName).ToArray());
用途:
using System.Linq;
using System.Xml.Linq;
【讨论】: