2016-11-18 152 views
1

我讀過此網站,此問題之前詢問。但我試過的代碼,但它不工作HTMLAgilityPack - 刪除節點,但保留其值

所有的答案都是一樣的。使用單一的代碼

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); 
      } 

我在做什麼是消除跨度標籤,但保留是文本

所以輸出必須

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

看看[刪除不需要的標籤而不刪除內容](http://stackoverflow.com/a/12836974/3796048) –

回答

1

使用

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

Descendants函數返回在遍歷它時構建的子元素的動態列表。因此,在遍歷動態列表時不允許更改文檔。解決方法是預先製作列表的靜態副本(使用ToArray)並遍歷該數組。

+0

謝謝。它現在有效。但爲什麼它的輸出是 一些文字

你好

爲什麼是創建另一個XML標記? –

+0

@pdfasker無法重現該問題。我得到了預期的結果,沒有添加任何文本。 – NineBerry