2011-10-27 30 views
6

Nói rằng tôi muốn loại bỏ thẻ span từ html này:HTML Agility Pack removeChild - không cư xử như mong đợi

<html><span>we do like <b>bold</b> stuff</span></html> 

Tôi đang mong đợi đoạn mã này để làm những gì tôi sau

string html = "<html><span>we do like <b>bold</b> stuff</span></html>"; 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 

HtmlNode span = doc.DocumentNode.Descendants("span").First(); 
span.ParentNode.RemoveChild(span, true); //second parameter is 'keepGrandChildren' 

Nhưng đầu ra trông như thế này:

<html> stuff<b>bold</b>we do like </html> 

Nó dường như đảo ngược các nút con trong khoảng. Tôi có làm điều gì sai?

Trả lời

11

Trông giống như một lỗi trong HtmlAgilityPack - xem vấn đề của họ đăng ký:

http://htmlagilitypack.codeplex.com/workitem/9113

Điều thú vị này đã được nâng lên 4 năm trước ...

Dưới đây là một đoạn mã đó sẽ loại bỏ tất cả các thẻ span (hoặc bất kỳ thẻ nào khác mà bạn chỉ định) và giữ các nút khác theo đúng thứ tự.

void Main() 
{ 
    string html = "<html><span>we do like <b>bold</b> stuff</span></html>"; 
    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(html); 
    RemoveTags(doc, "span"); 
    Console.WriteLine(doc.DocumentNode.OuterHtml); 
} 

public static void RemoveTags(HtmlDocument html, string tagName) 
{ 
    var tags = html.DocumentNode.SelectNodes("//" + tagName); 
    if (tags!=null) 
    { 
     foreach (var tag in tags) 
     { 
      if (!tag.HasChildNodes) 
      { 
       tag.ParentNode.RemoveChild(tag); 
       continue; 
      } 

      for (var i = tag.ChildNodes.Count - 1; i >= 0; i--) 
      { 
       var child = tag.ChildNodes[i]; 
       tag.ParentNode.InsertAfter(child, tag); 
      } 
      tag.ParentNode.RemoveChild(tag); 
     } 
    } 
} 
+1

Điều thú vị này vẫn xảy ra vào năm 2017 – Lucas

4
foreach (HtmlNode child in tag.ChildNodes) 
{ 
    tag.ParentNode.InsertBefore(child, tag); 
} 

tag.Remove(); 
3

Chỉ cần cho các hồ sơ, đây là phiên bản của tôi, dựa trên câu trả lời của câu hỏi này:

using HtmlAgilityPack; 

internal static class HtmlAgilityPackExtensions 
{ 
    public static void RemoveNodeKeepChildren(this HtmlNode node) 
    { 
     foreach (var child in node.ChildNodes) 
     { 
      node.ParentNode.InsertBefore(child, node); 
     } 
     node.Remove(); 
    } 
} 
Các vấn đề liên quan