如何在foreach循环中删除xmlnode?

时间:2012-10-19 23:35:38

标签: c# xml

在下面的代码中,我使用foreach循环检查nodelist中的每个节点并删除其中的一些节点。 删除一个节点后,foreach循环抛出以下错误: “元素列表已更改。枚举操作无法继续”。 我怎么能避免它?

public static XmlNodeList Scan(XmlNodeList nodeList)
        {
            string elementValue = null;
            foreach (XmlNode xmlElement in nodeList)
            {
                elementValue = xmlElement.InnerText;
                if (elementValue.Length >= 6 && elementValue.Substring(0, 3) == "999")
                {
                    continue;
                }
                else 
                {
                    XmlNode node = xmlElement.ParentNode;
                    node.RemoveChild(xmlElement);
                }
            }

            return nodeList;
        }

5 个答案:

答案 0 :(得分:5)

可悲的是,答案是不使用foreach,而是使用非常防弹的“for()”。

for(int i = collection.Count - 1; i >= 0; i--)
{
    object myObject = collection[i];
    collection.Remove(myObject);
}

在这种情况下,我在集合中向后循环,并一次删除一个对象。这样,我永远不会有无效的索引。

答案 1 :(得分:2)

由于你不是简单地从集合中移除你正在循环的项目,我不确定“使用for循环”是否会起作用。

以下分为两步:

  1. 创建要与父母分离的所有元素的常规列表。
  2. 通过迭代不受分离影响的常规列表,从父母那里删除这些元素。
  3. public static XmlNodeList Scan(XmlNodeList nodeList)
    {
        List<XmlNode> toRemove = new List<XmlNode>();
    
        foreach (XmlNode xmlElement in nodeList)
        {
            string elementValue = xmlElement.InnerText;
            if (elementValue.Length < 6 || elementValue.Substring(0, 3) != "999")
            {
                toRemove.Add(xmlElement);
            }
        }
    
        foreach(XmlNode xmlElement in toRemove)
        {
            XmlNode node = xmlElement.ParentNode;
            node.RemoveChild(xmlElement);
        }
    
        return nodeList;
    }
    

答案 2 :(得分:0)

使用for循环代替

for(I=length-1;I>=0;I--)

每个用于枚举,枚举列表时无法删除。此外,循环必须从最后一个元素开始,以避免在删除元素时发生任何移位。

答案 3 :(得分:0)

不允许更改foreach次迭代期间使用的集合。您可以使用For..loop代替

for(int i=0; i<nodeList.Length; i++)
{
   //remove nodeList[i];
}

答案 4 :(得分:0)

我找到了一个替代项:Convert xmlnodelist to list<>

XmlNodeList具有方法Cast,可以按以下方式使用:

var listOfNodes = new List<XmlNode>(xmlNodeList.Cast<XmlNode>());