2011-01-20 45 views
0

我有這樣的代碼:有沒有更好的方法來讀取LINQ到XML中的XML後代?

string result = xml.Root.Descendants("XYZ").Descendants("ABC").Descendants("MNO").Single().Value; 

1)是否有更好的方式來閱讀的價值?一些不依賴於節點深度的泛型,我必須去?

2)刪除「XYZ」,「ABC」等硬編碼依賴的方法是什麼?

+1

你可能包括要查詢幫助我們使你的查詢感XML文檔的片段? – 2011-01-20 17:47:44

回答

2

目前還不清楚你的真正含義,但這是你所追求的嗎?

public IEnumerable<XElement> PathDescendants(
    this XElement element, 
    params XName[] names) 
{ 
    return new[] { element }.PathDescendants(names); 
} 

public IEnumerable<XElement> PathDescendants(
    this IEnumerable<XElement> elements, 
    params XName[] names) 
{ 
    return names.Aggregate(elements, 
          (current, name) => current.Descendants(name)); 
} 

然後,您可以撥打:

string result = xml.Root.PathDescendants("XYZ", "ABC", "MNO").Single().Value; 
+0

是的;但是在實現這個時,我得到一個錯誤,說擴展方法應該是靜態的。這些是作爲擴展方法嗎? – GilliVilla 2011-01-20 19:52:06

2

如果你不關心父節點的依賴關係,你可以直接去"MNO"在你的後代調用。

xml.Root.Descendants("MNO")

但是,這會產生MNO後裔,無論他們可能在你的XML結構顯示的序列。

<root> 
    <MNO /> 
    <ABC> 
     <MNO /> 
    </ABC> 
    <ABC> 
     <XYZ> 
     <MNO /> 
     </XYZ> 
    </ABC> 
</root> 

全部MNO元素將在序列中。

相關問題