簡體   English   中英

linq到具有所有屬性的xml查詢

[英]linq to xml query with all attributes

我有一個這樣的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到XML如下

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

我找不到如何獲取列表。

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
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")
               })
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>祖先節點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM