2012-05-01 3 views
1

Часть приложения, которое я создаю, должна генерировать файл robots.txt из XML-документа.Как выбрать дочерние узлы, когда родительский узел равен определенному значению в 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> 

Как я могу выбрать "Элементы", где UserAgent = "*"?

Другими словами, я хочу выбрать дочерние узлы только в том случае, если родительский узел равен определенному значению. Значение в родительском узле будет уникальным.

Я использую C# в ASP.net.

ответ

3

Похоже, вы хотите что-то вроде:

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

Обратите внимание, что второй from используется только для выравнивания результата, так что это не последовательность последовательностей.

В качестве альтернативы:

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

Обратите внимание, что это не даст те же результаты, если у вас есть несколько элементов UserAgent под одним элементом UserAgents.

(Можете ли вы изменить схему XML, кстати, похоже, что вы сможете это упростить ...)

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; 
Смежные вопросы