2012-05-01 3 views
1

빌드중인 응용 프로그램의 일부가 XML 문서에서 robots.txt 파일을 생성해야합니다.부모 노드가 LINQ to XML의 특정 값과 같을 때 자식 노드를 선택하는 방법

나는 XML과 같이 있습니다

<root> 
    <Robots> 
    <UserAgents> 
     <UserAgent>*</UserAgent> 
     <Disallow> 
     <Item>/wibble/</Item> 
     <Item>/wobble/</Item> 
     </Disallow> 
    </UserAgents> 
    <UserAgents> 
     <UserAgent>Google</UserAgent> 
     <Disallow> 
     <Item>/</Item> 
     </Disallow> 
    </UserAgents> 
    </Robots> 
</root> 

가 어떻게이 "항목"사용자 에이전트 = "*"를 선택 할 수 있습니까?

다른 말로하면 부모 노드가 특정 값과 같을 때만 자식 노드를 선택하고 싶습니다. 상위 노드의 값은 고유합니다.

ASP.net에서 C#을 사용하고 있습니다. 두 번째 from는 그냥 시퀀스의 순서가되지 않도록 결과를 평평하게하기 위해 사용되는

var query = from agent in doc.Descendants("UserAgent") 
      where (string) agent == "*" 
      from item in agent.Parent.Elements("Disallow").Elements("Item") 
      select item; 

참고 :

답변

3

당신이 뭔가를 원하는 것 같은데. 또한

:

var query = doc.Descendants("UserAgent") 
       .Where(agent => (string) agent == "*") 
       .SelectMany(agent => agent.Parent.Elements("Disallow") 
               .Elements("Item")); 

또는 UserAgents로 선택한 "정상"노드를 변경하여

, 당신은 상위 단계를 방지 할 수 있습니다

그 같은 결과의 경우를 포기하지 않을 것을
var query = doc.Descendants("UserAgents") 
       .Where(agents => (string) agents.Element("UserAgent") == "*") 
       .SelectMany(agent => agent.Elements("Disallow").Elements("Item")); 

주 하나의 UserAgents 요소 아래에 여러 개의 UserAgent 요소가 있습니다.

(XML 스키마를 변경할 수 있습니까? btw? 단순화 할 수 있어야합니다 ...)

1
var query = from x in doc.Root.Element("Robots").Elements("UserAgents") 
      where (string)x.Element("UserAgent") == "*" 
      from y in x.Element("Disallow").Elements("Item") 
      select y; 
관련 문제