2011-10-27 21 views
6

że chcę, aby usunąć tag rozpiętości od tego HTML:HTML Agility Pakiet removeChild - nie zachowuje się zgodnie z oczekiwaniami

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

Czekam ten fragment kodu, aby robić to, co ja jestem po

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' 

Ale wyjście wygląda następująco:

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

wydaje się być cofania węzły potomne w rozpiętości. czy robię coś źle?

Odpowiedz

11

Wygląda na błąd w HtmlAgilityPack - patrz ich problem zarejestrować:

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

Co ciekawe ten został podwyższony 4 lata temu ...

Oto fragment, który usunie wszystkie znaczniki SPAN (lub dowolny inny określony przez ciebie znacznik) i utrzymuje inne węzły we właściwej kolejności.

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

Co ciekawe jest to nadal dzieje się w 2017 roku – Lucas

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

tag.Remove(); 
3

tylko dla zapisów, to jest moja wersja, oparta na odpowiedziach na to pytanie:

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(); 
    } 
} 
Powiązane problemy