2013-04-07 97 views
0

我有這樣的XML的LINQ to XML skipwhile()takewhile()

<root> 
<TR_ZAL IDZ="cOY9" O="0"> 
</TR_ZAL> 
<TR_ZAL IDZ="FOXd" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="wAW5" O="1"> 
<TR_ZAL IDZ="AWak" O="1"> 
</TR_ZAL> 
<TR_ZAL IDZ="XpPp" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="asTu" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="y9VV" O="1"> 
</TR_ZAL> 
</root> 

,我知道IDZ"AWak",我的任務是讓已知IDZ和所有之後的元素,直至與相同的下一個元素屬性O,如果沒有其他人,那麼我應該得到所有剩餘的元素。在這種情況下,它應該是

<TR_ZAL IDZ="AWak" O="1"> 
</TR_ZAL> 
<TR_ZAL IDZ="XpPp" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="asTu" O="10"> 
</TR_ZAL> 

所以我試圖使用LINQ,但我找不到我的錯誤,所以任何人都可以請HALP我嗎?

IEnumerable<XElement> rozsah = xmlText.Root.Elements("TR_ZAL") 
        .SkipWhile(x => x.Attribute("IDZ").Value != "AWak") 
        .Take(1) 
        .TakeWhile(x =>Convert.ToInt32(x.Attribute("O").Value) != o); 
+0

您的輸入XML無效(並非所有TR_ZAL都已關閉標記)。你能解決它嗎?你有層次結構嗎?或者一切都只是一個TR_ZAL列表? – outcoldman 2013-04-07 23:51:48

+0

哦,我很抱歉,由於複製粘貼錯誤,xml無效 – david 2013-04-08 00:24:27

回答

1

我猜你的XML應該是有效的這種變化:

<root> 
<TR_ZAL IDZ="cOY9" O="0"> 
</TR_ZAL> 
<TR_ZAL IDZ="FOXd" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="wAW5" O="1"> 
</TR_ZAL> 
<TR_ZAL IDZ="AWak" O="1"> 
</TR_ZAL> 
<TR_ZAL IDZ="XpPp" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="asTu" O="10"> 
</TR_ZAL> 
<TR_ZAL IDZ="y9VV" O="1"> 
</TR_ZAL> 
</root> 

如果這是真的,然後回答下面的問題:

int? o = null; 
IEnumerable<XElement> rozsah = xmlText.Root 
    // Getting all child 'TR_ZAL' from root object 
    .Elements("TR_ZAL") 
    // Ignoring until we will not meet TR_ZAL with IDZ == AWak 
    .SkipWhile(x => x.Attribute("IDZ").Value != "AWak") 
    // Cache the first value of elements in collection and compare each next item 
    // we want to take only items which does not have the same value 
    .TakeWhile(x => 
     { 
      int oAttributeValue = XmlConvert.ToInt32(x.Attribute("O").Value); 

      if (!o.HasValue) 
      { 
       o = oAttributeValue; 
       return true; 
      } 
      else 
      { 
       return o != oAttributeValue; 
      } 
     }); 

你LINQ有一個bug當你找到第一個IDZ = AWak時 - 接下來你的步驟是取1個元素Take(1),所以在這個Take(1)之後你將只返回一個元素的集合,所以接下來你的步驟TakeWhile(...)使用這一個元素對集合進行操作,而不是對其他元素進行操作。

+0

謝謝我認爲'take(1)'只需一個元素並移動光標,但現在我明白了 – david 2013-04-08 00:25:36