0

我有这个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);
4

1 回答 1

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 有一个错误,当您找到第一个 IDZ = AWak - 下一步是获取 1 个元素Take(1),因此在此之后Take(1)将只返回一个元素的集合,因此下一步您的步骤TakeWhile(...)使用这个元素对集合进行操作,而不是之后的其余元素。

于 2013-04-08T00:11:40.807 回答