[英]linq to xml skipwhile() takewhile()
我有这个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有一个错误,即当您找到第一个IDZ = AWak时-下一步是获取1个元素Take(1)
,因此在Take(1)
将仅返回一个元素,因此下一步是TakeWhile(...)
使用此一个元素对集合进行操作,而不使用之后的其余元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.