簡體   English   中英

XDocument 中當前節點的路徑

[英]Path of Current Node in XDocument

是否可以在 XDocument 中獲取當前 XElement 的路徑? 例如,如果我遍歷文檔中的節點,是否有某種方法可以獲得該節點(XElement)的路徑,以便它返回類似 \\root\\item\\child\\currentnode 的內容?

沒有內置任何東西,但您可以編寫自己的擴展方法:

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 上選擇

  • 位置 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 )

請注意,如果您想要真正通用版本的 XPath 到 XML 中的節點,則可能需要考慮特殊節點,如注釋和處理指令。

我知道這個問題很老,但萬一有人想要一個簡單的襯里:

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

用途:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM