2013-03-11 3 views
2

가 나는 제품 코드 = "10000000000000000006"와 제공자 코드 = "VODA"이LINQ는

<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> 

나는 모든 메뉴를 찾으려면 같은 xml 문서에서이 속성 목록.

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

을 다음과 같이 내가 LINQ to XML을 시도했다 나는 목록을 얻는 방법을 찾을 수 없습니다입니다

 
    Name Url   DisaplayOrder 
    Home TopModels  0 


처럼
결과가 있어야한다.

답변

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

도움 주셔서 감사합니다. 그것은 나를 위해 완벽하게 손을 댔다. –

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 개 메뉴 요소를 반환합니다. 원본 XML 문서에 몇 가지 가정으로

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

답장을 보내 주셔서 감사합니다. –

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"); 

: 당신은 익명의 객체 대신 XElement 얻을 프로젝션을 사용할 수 있습니다

  • <Menu> 노드해야하고 하나 개의 <Product> 조상 노드를 가지고
  • <Menu> 노드는 하나만 <Provider> 조상 노드가 있어야합니다.
+0

답장을 보내 주셔서 감사합니다. –