省略基于属性的XML中的节点
本文关键字:XML 节点 属性 于属性 | 更新日期: 2023-09-27 18:10:49
使用C#LINQ到XML
我试图省略下面XML中的第一个和最后一个节点。
我正在尝试处理<node id="2" one="start">
和<node id="4" one="finish">
之间的每个节点
<root>
<node id="1">
<element two="3"/>
<element two="7"/>
</node>
<node id="2" one="start">
<element two="1"/>
<element two="2"/>
</node>
<node id="3">
<element two="4"/>
<element two="4"/>
<element two="4"/>
<element two="2"/>
<element two="6"/>
</node>
<node id="4">
<element two="3"/>
<element two="7"/>
</node>
<node id="5" one="finish">
<element two="3"/>
<element two="7"/>
</node>
<node id="6">
<element two="3"/>
<element two="7"/>
</node>
<root>
这方面有标准的方法吗?
如果你有一个XElement
序列,并且你想根据你的条件对它们进行筛选,我认为LINQ中没有任何内置的东西可以做到这一点(有SkipWhile()
和TakeWhile()
可以做类似的事情(。
我认为您应该创建一个通用的扩展方法,根据第一个和最后一个条件过滤集合,比如:
public static IEnumerable<T> GetBetween<T>(
this IEnumerable<T> source,
Func<T, bool> firstPredicate, Func<T, bool> lastPredicate)
{
bool foundFirst = false;
foreach (var item in source)
{
if (!foundFirst)
foundFirst = firstPredicate(item);
if (foundFirst)
{
yield return item;
if (lastPredicate(item))
break;
}
}
}
然后你会这样使用它:
elements.GetBetween(
e => (string)e.Attribute("one") == "start",
e => (string)e.Attribute("one") == "finish")
我使用了一些非常简单的逻辑来处理这个问题。
bool processFlag = false;
当node.element.attribute="start"时,将此布尔值从false
切换到true
,然后当="finish"时,再切换回false
!