linq to xml skipwhile() takewhile()
本文关键字:takewhile skipwhile to xml linq | 更新日期: 2023-09-27 18:07:51
我有这个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 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,但是我找不到我的错误,所以有人能帮帮我吗?
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);
我猜你的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(...)
操作与这一个元素的集合,而不是与其余的元素之后。