2011-11-21 57 views
1

我有XML(不完全这么简单,但对于我的问题来说就足够了)。如何提取某些子元素取决于使用Linq to 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和节点6(节点名称和值)。请帮忙。谢谢。

回答

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