2016-01-05 2 views
0

У меня есть ниже код, в котором каждый item элемент необходимо содержать ровно один a, b, c или d элемент, и в дополнение может содержат множество дополнительных элементов. Положение требуемых элементов (, b ...) не является достоверным.XDocument: получить первый дочерний элемент типа «A» или «B»

<root> 
    <item> 
    <a>...</a> 
    ... 
    <item> 

    <item> 
    ... 
    <d>...</d> 
    <item> 

    <item> 
    <c>...</c> 
    <item> 

    ... 
</root> 

Использование XDocument, как можно выразить следующим образом:

возвращать первый дочерний элемент типа a, b, c или d.

В настоящее время я использую цепочку инструкций if-else, но это богохульство должно идти; кажется, слишком много для такой, казалось бы, простая задача:

foreach (XElement xItem in xmlDoc.Root.Elements("item")) 
{ 
    if (xItem.Element("a") != null) 
    { 
     // element <a>...</a> found 
    } 
    else if (xItem.Element("b") != null) 
    { 
     // element <b>...</b> found 
    } 
    ... 
} 

ответ

1

Как я понимаю, вы все еще хотите, чтобы сохранить цикл, так как вы хотите сделать что-то элемента относительно его содержащий Item, но вы хотите сделать код, который получает первые a, b, c, или d элемент очиститель.

Вот как вы можете это сделать:

var names = new XName[] { "a", "b", "c", "d" }; 

foreach (XElement xItem in xmlDoc.Root.Elements("item")) 
{ 
    var element = xItem.Elements().FirstOrDefault(x => names.Contains(x.Name)); 
    //Do something with element 
} 
1

Вы можете использовать FirstOrDefault для выполнения этой задачи:

var firstAorBorCorD = xmlDoc.Root 
    .Elements("item") 
    .Select(xItem => 
     xItem.Elements().FirstOrDefault(sub => 
      sub.Name == "a" || sub.Name == "b" || sub.Name == "c" || sub.Name == "d" 
     ) 
    ); 

Это будет производить последовательность первых детей типа {а, Ь, с , d} для каждого item. Если конкретный элемент не имеет детей желаемого типа, его соответствующая запись в списке будет null.

1

Ну это звучит, как вы могли бы хотеть что-то вроде:

var names = new XName[] { "a", "b", "c", "d" }; 
var element = xmlDoc.Root 
        .Elements("item") 
        .Elements() 
        .FirstOrDefault(x => names.Contains(x.Name)); 
Смежные вопросы