[英]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.