替换XElement中的元素会破坏foreach循环

时间:2013-09-11 18:36:57

标签: c# xml

我有字符串

<div class="TextP">
   <span class="bold" style="font-weight: bold;">bold</span> text 
   <span class="bold" style="font-weight: bold;">italic</span> text 
   <span class="bold" style="font-weight: bold;">underlined</span> text
</div>

我解析到XElement对象,而不是我需要用其他元素替换格式化跨度。所以我写了这段代码

//el is the root div
foreach (XElement el in e.Elements())
        {
            switch (el.Name.ToString().ToLower())
            {
                //The method is more complex, but only this part doesnt work, therfore this only case
                case "span":
                    if (el.Attribute("class") != null)
                    {
                        switch (el.Attribute("class").Value)
                        {
                            case "underline" :
                                el.ReplaceWith(XElement.Parse("<U>" + el.Value + "</U>"));
                                break;
                            case "bold":
                                el.ReplaceWith(XElement.Parse("<B>" + el.Value + "</B>"));
                                break;
                            case "italic":
                                el.ReplaceWith(XElement.Parse("<I>" + el.Value + "</I>"));
                                break;
                        }
                    }
                    break;
            }
        }

问题在于,当我替换第一个span时,foreach循环中断并且另外两个spans仍未替换。 我认为这是因为.Elements()集合发生了变化,但我无法弄清楚,我应该如何更改代码。

1 个答案:

答案 0 :(得分:4)

通常,当您迭代它时,您无法对集合进行更改。解决这个问题的一种方法是复制你的集合并迭代:

foreach (XElement el in e.Elements().ToArray()) // or ToList
{
    // ...
}

这将在循环开始时找到e的所有子元素,并将它们存储在不同的集合中(使用Linq ToArray / ToList方法)。这样,元素集合可以在循环内自由修改。