Как извлечь определенные подэлементы, зависит от условия использования Linq to XML - PullRequest
1 голос
/ 21 ноября 2011

У меня есть XML (не совсем такой простой, но достаточно для моего вопроса).

Если я напишу код, подобный следующему

    var xdoc = XDocument.Parse(@"
<Root>
    <Item>
        <Node1>Value 1</Node1>
        <Node2>Value 2</Node2>
        <Node3>Value 3</Node3>
        <Node4>Value 4</Node4>
        <Node5>Value 5</Node5>
        <Node6>Value 6</Node6>
    </Item>  
</Root>");

var results = xdoc.Root
    .Elements("Item")
    .Descendants()
    .Select(e => new { ElementName = e.Name, ElementValue = e.Value });

Это даст мне список результатов всехпотомки (имя узла и значение узла) элемента «Элемент».Я хочу спросить, как получить различный набор данных в зависимости от состояния.Например, если Node1 или Node2 имеет значение (не пустое), то я хочу, чтобы список результатов только Node1 и Node2 (имя и значение узла), в противном случае в списке результатов должны отображаться другие узлы, такие как Node3, Node4, Node5 иNode6 (имя и значение узла).Пожалуйста помоги.Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Я не уверен, что полностью понимаю ваш вопрос. Однако, если я правильно понял, то все, что вам нужно добавить, это условие, подобное этому:

if (condition)
    results = results.Take(2);
else
    results = results.Skip(2);

Итак, если condition истинно, то в вашей последовательности результатов будут только первые 2 узла. И если condition ложно, то у вас будут только оставшиеся элементы.

Моя первая интерпретация вашего вопроса состояла в том, что вам нужно было добавить в ваш запрос вызов Where, чтобы в вашем наборе результатов были только те элементы, которые действительно содержат значение. Это будет выглядеть так:

var results = xdoc.Root
    .Elements("Item")
    .Descendants()
    .Where(e => !string.IsNullOrEmpty(e.Value))
    .Select(e => new { ElementName = e.Name, ElementValue = e.Value }); 
0 голосов
/ 28 ноября 2011

Ваши условия довольно ... странные.

var query =
    from item in doc.Root.Elements("Item")
    let elements = item.Elements()
    let firstTwo = elements.Take(2)
    let descendants = firstTwo.All(e => !String.IsNullOrWhiteSpace(e.Value))
      ? firstTwo.DescendantsAndSelf()
      : elements.Skip(2).DescendantsAndSelf()
    from e in descendants
    select new
    {
        ElementName = e.Name,
        ElementValue = e.Value,
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...