省略基于属性的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> 

这方面有标准的方法吗?

省略基于属性的XML中的节点

如果你有一个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