2015-10-14 64 views
0

如何獲取XML中最頂級的父元素?我需要整個元素及其屬性。從XML中獲取最頂級的父項

它不會總是第一行,因爲可能有評論。

string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml"); 

XElement str = XElement.Parse(xmlStr); 
var h1 = str.Parent; 
var h2 = str.XPathSelectElements("..").FirstOrDefault(); 
var h3 = str.XPathSelectElement("..").Parent; 
<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer"> 
<REC NAME="Recipient"> 
    <FLD NAME="FirstName">James</FLD> 
    </REC> 
<REC NAME="Message"> 
    <FLD NAME="Key">123</FLD> 
    </REC> 
<REC NAME="Details"> 
    <FLD NAME="Key">default</FLD>  
    </REC> 
</File> 

我希望有一個等於<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">作爲期望的結果

+2

在代碼'str'已經引用 '最頂層的父' AK一個根元素,如果我正確地理解了這個問題。發佈預期的輸出,如果它不是您想要的實際根元素。 – har07

回答

2

在XML數據模型中,開始標記(包括所有屬性),標記內容和結束標記是單個XML元素對象,因此僅請求開始標記是不自然的。我不知道在.NET函數中可以得到它,但是可以通過組合標記名稱的信息和所有屬性名稱 - 值對來重建開始標記字符串,例如:

string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml"); 

XElement str = XElement.Parse(xmlStr); 
var attributes = String.Join(" ", str.Attributes().Select(o => String.Format("{0}=\"{1}\"", o.Name, o.Value))); 
var result = string.Format("<{0} {1}>", str.Name, attributes); 
Console.WriteLine(result); 

Dotnetfiddle Demo

輸出:

<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer"> 
+1

內置的.NET方法用於標記XML樹標記,屬性等屬性是使用'XmlReader'。但我懷疑這是必需的,它是一個低級別的API,除非你知道你在做什麼,並且你的需要需要它,否則你最好遠離它。 – Abel

0

爲@ har07已經說了VAR,str是最上面的元素。如果你想要的屬性只是在它們之間迭代

string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml"); 

var root = XElement.Parse(xmlStr); 
foreach (var attribute in root.Attributes()) 
{ 
    Console.WriteLine("{0} : {1}", attribute .Name, attribute.Value); 
} 
+1

你可能在循環體中的意思是'attribute.Name'和'attribute.Value'? – Abel

+0

哎呀,你是對的。已更正 –

2

您可以使用XElement.AncestorsAndSelf()父XML元素鏈步行到根元素。 Enumerable.Last然後給你的根元素:

var root = element.AncestorsAndSelf().Last(); 

如果XElement是由一些XDocument載,你總是可以做

var root = element.Document.Root; 

但在你的情況直接解析到XElement而不打擾創建XDocument集裝箱。