2015-05-15 49 views
2

特定類別我有以下XML:的LINQ to XML來查找XML

<table name="transactions"> 
    <row> 
     <col name="id">1</col> 
     <col name="amount">2673.9</col> 
     <col name="created_date">2014-10-19</col> 
     <col name="display_date">2014-04-22</col> 
     <col name="cat_id">13</col> 
     <col name="note">Initial Balance</col> 
     //other col tags 
    </row> 
    <row> 
     ... 
    </row> 
</table> 

我需要找到與特定CAT_ID所有行。 LINQ查詢怎麼樣?我試過

IEnumerable<XElement> rows = 
    from el in root.Elements("row") 
    where (string)el.Element("col").Attribute("name") == "cat_id" 
    select el; 

但它什麼也沒有返回。

+1

我認爲下面的psubsee2003的答案是訣竅。如果你想了解更多關於Linq的信息,我建議你使用LinqPad https://www.linqpad.net/來玩遊戲,它帶有大量的工作例子 – etoisarobot

回答

3

首先,您需要了解如何編寫LINQ查詢。

如果您閱讀documentation,您會知道Element()方法會返回第一個匹配元素,在這種情況下,會返回<col name="id">1</col>行。由於第一個匹配元素中名爲「name」的屬性的值不是「cat_id」,因此它將轉到下一個row元素。

如果「cat_id」確保每次都是第一個匹配元素,那麼您的查詢就可以工作。

如果您無法確定或無法進行更改,您首先需要搜索所有屬性名稱爲「cat_id」的一個屬性,然後查找具有特定值的屬性。

首先,要獲取所有子元素,您需要使用Elements()方法。然後,您需要查找特定的屬性名稱和值。

IEnumerable<XElement> rows = from el in xdocument.Root.Elements("row") 
          from col in el.Elements("col") 
          where (string)col.Attribute("name") == "cat_id" 
          where col.Value =="13" 
          select el; 

此查詢將返回與叫做name屬性和cat_id值的col元素的所有行。然後,只有具有cat_id屬性的元素的值爲13.

+0

這個查詢比我建議的更好:-) – Zrethreal

+0

謝謝爲了這!我想我理解它的大部分,但不是第一行:從root.Root.Elements(「row」)中的el。 Root.Root做什麼? – Edwin

+0

哦,我認爲這是一個錯字。我刪除了第二個Root,並且它工作正常 – Edwin

0

假設root是您的XElement「表」,where子句將在每個「行」中選擇第一個XElement「col」。 for「col」元素的屬性是「id」,它永遠不會等於「cat_id」。

你想要做的是這樣的:

XDocument xmlDoc = XDocument.Load("test.xml"); 
XElement root = xmlDoc.Element("table"); 
Dictionary<string, List<XElement>> s1 = root.Elements("row") 
              .GroupBy(ks => ks.Elements("col").Single(p => p.Attribute("name").Value == "cat_id").Value) 
              .ToDictionary(ks => ks.Key, es => es.ToList()); 

,讓你與cat_ids關鍵和每個關鍵

在這個例子中,我不走的XElement排列表的字典進入有沒有名字屬性和行缺少cat_id的科列 - 這會給你NullReferenceException s,你需要在查詢表達式中處理