2010-06-23 48 views
0

我有類似的XML塊如下:如何從此XML獲取列表<XElement>?

<factsheet> 
<bilcontents > 
    <config name="1" /> 
</bilcontents> 

<singlefactsheet includeInBook="true"> 
    <config name="7" /> 
    <fund id="630" /> 
</singlefactsheet> 

<doubleFactsheet includeInBook="true"> 
    <config name="8" /> 
    <fund id="623" /> 
    <fund id="624" /> 
</doubleFactsheet> 

<tripplefactsheet includeInBook="true"> 
    <config name="6" /> 
    <fund id="36" /> 
    <fund id="37" /> 
    <fund id="38" /> 
</tripplefactsheet> 
</factsheet> 

是否有可能對我來說,得到一個包含每個這些XElements的名單,只要includeInBook="true",並與每一個元素,我可以再處理與它基於節點的類型。

回答

2

絕對:

var list = doc.Root 
       .Elements() 
       .Where(x => (bool?) x.Attribute("includeInBook") == true) 
       .ToList(); 

可空布爾處理可以是有點奇怪,順便說一句。爲lambda表達式另一種方法可能是:

x => (bool?) x.Attribute("includeInBook") ?? false 

x => (string) x.Attribute("includeInBook") == "true" 
+0

感謝喬恩,我實際上已經制定了類似的東西,所以我把它貼在下面。 – DaveDev 2010-06-23 16:51:24

0

這是我的工作了,但喬恩幾乎打我衝

var inBook = nodes.Descendants() 
    .Where(xx => xx.Attribute("includeInBook") != null) 
    .Select(xx => xx).ToList(); 
+0

這只是驗證屬性*是否存在* - 如果包含includeInBook =「false」元素,這肯定不是你想要的。還要注意'選擇'呼叫是多餘的。 – 2010-06-23 17:08:16

+0

積分。謝謝 – DaveDev 2010-06-23 17:30:58

0

或者,您可以使用內置的XPath擴展方法方法(他們生活在System.Xml.Xpath

XDocument doc; 
// ... 
var includeInBook = doc.XPathSelectElements("/factsheet/*[@includeInBook = 'true']") 

讀爲:

  • /factsheet:選擇元素 '簡報'
  • /*:然後選擇所有的孩子
  • [ ... ]:讀方括號 「其中」
    • @includeInBook = 'true':在屬性「includeInBook」具有等於「真」的內容
0

您應該考慮爲此XML創建數據結構並使用「序列化」。這將是一個更清潔的方式來與這個數據模型進行交互。只是要考慮...