HTMLAgilityPack - 删除节点但保留其值

时间:2016-11-18 01:30:31

标签: c# html html-agility-pack

我已经在这个网站上读过这个问题。但我尝试了代码,但它无法正常工作

所有答案都是一样的。使用单一代码

item.ParentNode.RemoveChild(item, true);

但我在我的代码中使用了它,但它不起作用。我收到了错误

Collection was modified; enumeration operation may not execute.

这是我现在的代码

try
            {
                string html = "<xml><span> some text </span><p><span> Hello</span> </p></xml>";
                var htmlSpan = new HtmlDocument();
                htmlSpan.LoadHtml(html);
                var rootSpan = htmlSpan.DocumentNode;
                var anchorsSpan = rootSpan.Descendants("span");
                foreach (var item in anchorsSpan)
                {
                    item.ParentNode.RemoveChild(item, true);
                }
                //htmlSpan.Save(fileName);
                Console.WriteLine(htmlSpan.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

我在做什么是删除span标记,但保留是文本

所以输出必须是

<xml> some text <p> Hello </p></xml>

1 个答案:

答案 0 :(得分:1)

使用

            foreach (var item in anchorsSpan.ToArray())
            {
                item.ParentNode.RemoveChild(item, true);
            }

Descendants函数返回遍历它时构建的子元素的动态列表。因此,在遍历动态列表时不允许更改文档。解决方案是预先制作列表的静态副本(使用ToArray)并遍历该数组。