如何提取某些子元素取决于使用Linq to XML的条件

时间:2011-11-21 10:23:57

标签: linq-to-xml

我有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 });

这将为我提供“Item”元素的所有后代(节点名称和节点值)的结果列表。我想问的是如何根据条件获得不同的数据集。例如,如果Node1或Node2有一个值(非空),那么我只想要Node1和Node2的结果列表(节点名称和值),否则结果列表应该显示其他节点,即Node3,Node4,Node5和Node6(节点名称和值)。请帮忙。谢谢。

2 个答案:

答案 0 :(得分:0)

你的条件相当......奇怪。

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,
    };

答案 1 :(得分:0)

我不确定我完全理解你的问题。但是,如果我说得对,那么你需要添加的就是这样的条件:

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