2015-06-17 2 views
3

Я нашел много статей о получении потомка с определенным атрибутом, но я не могу найти ничего при выборе нескольких потомков с различными атрибутами с LINQ to XML. Поэтому из следующего примера мне нужно выбрать всех внуков, где Parent name = Ken AND Child name = Lorna. Потенциально, мне нужно иметь до 4 AND статей, так как мой реальный XML глубже, чем пример ниже.Linq to XML select descendent of descendant каждый с определенным атрибутом

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

Любая помощь очень ценится

<?xml version="1.0" encoding="UTF-8"?> 
<FamilyTree> 
    <Parent name="Ken"> 
    <Child name="Lorna"> 
     <Grandchild name="Andrew"/> 
     <Grandchild name="Brian"/> 
    </Child> 
    <Child name="Mike"> 
     <Grandchild name="Ann"/> 
     <Grandchild name="Beth"/> 
    </Child> 
    </Parent> 
    <Parent name="Norma"> 
    <Child name="Owen"> 
     <Grandchild name="Charles"/> 
    </Child> 
    <Child name="Peter"> 
     <Grandchild name="Charlotte"/> 
    </Child> 
    </Parent> 
    <Parent name="Quinn"> 
    <Child name="Robert"> 
     <Grandchild name="Debbie"/> 
     <Grandchild name="Eric"/> 
    </Child> 
    <Child name="Susan"> 
     <Grandchild name="Frank"/> 
    </Child> 
    </Parent> 
</FamilyTree> 

ответ

2

Есть несколько вариантов, но я хотел бы предложить самую простую вещь, просто проверить каждый внучат:

var grandchildren = doc 
    .Descendants("Grandchild") 
    .Where(x => (string) x.Parent.Parent.Attribute("name") == "Ken" && 
       (string) x.Parent.Attribute("name") == "Lorna"); 

Или вы могли бы найти все соответствующие Child элементы, а затем извлекают детей:

var grandchildren = doc 
    .Descendants("Child") 
    .Where(x => (string) x.Parent.Attribute("name") == "Ken" && 
       (string) x.Attribute("name") == "Lorna") 
    .Elements("Grandchild"); 
+0

Замечательно, спасибо. – grayson

Смежные вопросы