2009-07-14 86 views
1

一直在對我的大腦徵稅,試圖找出如何執行linq xml查詢。「where」使用linq xml查詢

我想查詢返回的所有「產品」的項目,其中的類別/名稱=「品類第一」下面的XML

<catalog> 
    <category> 
    <name>First Category</name> 
    <order>0</order> 
    <product> 
     <name>First Product</name> 
     <order>0</order> 
    </product> 
    <product> 
     <name>3 Product</name> 
     <order>2</order> 
    </product> 
    <product> 
     <name>2 Product</name> 
     <order>1</order> 
    </product> 
    </category> 
</catalog> 

回答

6

像這樣:

XDocument doc = XDocument.Parse(xml); 
    var qry = from cat in doc.Root.Elements("category") 
       where (string)cat.Element("name") == "First Category" 
       from prod in cat.Elements("product") 
       select prod; 

或許與匿名類型太:

XDocument doc = XDocument.Parse(xml); 
    var qry = from cat in doc.Root.Elements("category") 
       where (string)cat.Element("name") == "First Category" 
       from prod in cat.Elements("product") 
       select new 
       { 
        Name = (string)prod.Element("name"), 
        Order = (int)prod.Element("order") 
       }; 
    foreach (var prod in qry) 
    { 
     Console.WriteLine("{0}: {1}", prod.Order, prod.Name); 
    } 
0

您要使用的Single擴展方法列表這裏。請嘗試以下操作:

var category = doc.RootNode.Elements("category").Single(
    c => c.Attribute("name").Value == "First Category"); 
var products = category.Elements("product"); 

請注意,這裏假設您只有一個類別名稱爲「First Category」。如果你可能有更多,我推薦使用Marc的解決方案;否則,這應該是更合適/有效的解決方案。此外,如果任何category節點沒有name子節點,這將引發異常。否則,它應該做你想要的。

+0

原因下投票嗎? – Noldorin 2009-07-14 12:48:28

+0

現在這讓我感到困惑。這個答案是完全正確的,因爲(國際海事組織公平)假設,OP只是在尋找一個名爲「第一類」的類別...... – Noldorin 2009-07-14 12:57:01

1

下面是一個例子:

 string xml = @"your XML"; 

     XDocument doc = XDocument.Parse(xml); 

     var products = from category in doc.Element("catalog").Elements("category") 
         where category.Element("name").Value == "First Category" 
         from product in category.Elements("product") 
         select new 
         { 
          Name = product.Element("name").Value, 
          Order = product.Element("order").Value 
         }; 
     foreach (var item in products) 
     { 
      Console.WriteLine("Name: {0} Order: {1}", item.Name, item.Order); 
     }