2011-11-21 103 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 }); 
相關問題