2013-03-11 60 views
2

我有一個xml文件這樣LINQ與所有XML查詢屬性

<Products> 
    <Product Name="Mobile Device" Code="10000000000000000006"> 
    <Providers> 
     <Provider Name="VODA" Code="VODA"> 
      <Menus> 
       <Menu Name="Home" Url="TopModelsNew.aspx" DisplayOrder="1" NewWindow="0"/> 
       <Menu Name="Top Queries" Url="TopIssues.aspx" DisplayOrder="2" NewWindow="0"/> 
       <Menu Name="Error Codes" Url="PCErrors.aspx" DisplayOrder="3" NewWindow="0"/> 
      </Menus> 
     </Provider> 
    </Providers> 
</Product> 

我想找到所有的菜單,產品代碼=「10000000000000000006」和供應商代碼=「VODA」一個列表。
的結果應該是像

 
    Name Url   DisaplayOrder 
    Home TopModels  0 

我嘗試的LINQ to XML如下

XDocument xdoc = XDocument.Load(Server.MapPath("~/App_Data/LeftMenu.xml")); 
     var products = from product in xdoc.Descendants("Product") where 
     new{ 
       .....  
      }; 

我無法找到如何獲取列表。

回答

2
XDocument xdoc = XDocument.Load(Server.MapPath("~/App_Data/LeftMenu.xml")); 
var menus = from product in xdoc.Descendants("Product") 
      where (string)product.Attribute("Code") == "10000000000000000006" 
      from provider in product.Descendants("Provider") 
      where (string)provider.Attribute("Code") == "VODA" 
      from menu in provider.Descendants("Menu") 
      select new { 
       Name = (string)menu.Attribute("Name"), 
       Url = (string)menu.Attribute("Url"), 
       DisplayOrder = (int)menu.Attribute("DisplayOrder") 
      }; 

結果:

Name   Url     DisaplayOrder 
    "Home"   "TopModelsNew.aspx"  1 
    "Top Queries" "TopIssues.aspx"   2 
    "Error Codes" "PCErrors.aspx"   3 
+1

非常感謝您的幫助。它爲我完美地燃燒起來。 – 2013-03-11 16:26:14

2
var menus = doc.Root 
       .Elements("Product") 
       .Where(p => (string)p.Attribute("Code") == "10000000000000000006") 
       .SelectMany(p => p.Element("Providers").Elements("Provider")) 
       .Where(p => (string)p.Attribute("Code") == "VODA") 
       .SelectMany(p => p.Element("Menus").Elements("Menu")) 
       .ToList(); 

它返回的樣本數據的所有3個菜單元素。您可以使用投影來獲得匿名對象,而不是XElement

var menus = doc.Root 
       .Elements("Product") 
       .Where(p => (string)p.Attribute("Code") == "10000000000000000006") 
       .SelectMany(p => p.Element("Providers").Elements("Provider")) 
       .Where(p => (string)p.Attribute("Code") == "VODA") 
       .SelectMany(p => p.Element("Menus").Elements("Menu")) 
       .Select(m => new { 
        Name = (string)m.Attribute("Name"), 
        Url = (string)m.Attribute("Url"), 
        DisplayOrder = (int)m.Attribute("DisplayOrder") 
       }) 
+0

非常感謝您的回答。 – 2013-03-11 16:26:49

1
XDocument xdoc = XDocument.Load(Server.MapPath("~/App_Data/LeftMenu.xml")); 
var menus = xdoc.Descendants("Menu").Where(x => 
    x.Ancestors("Product").First().Attribute("Code").Value == "10000000000000000006" && 
    x.Ancestors("Provider").First().Attribute("Code").Value == "VODA"); 

隨着一些假設到源XML文檔:

  • <Menu>節點必須和只有一個<Product>祖先節點
  • <Menu>節點必須且只有一個<Provider>祖先節點
+0

非常感謝您的回答。 – 2013-03-11 16:27:05