Angenommen, ich möchte das span-Tag aus diesem HTML entfernen:
<html><span>we do like <b>bold</b> stuff</span></html>
Ich erwarte, dass dieser Codeabschnitt das tut, wonach ich suche
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'
Aber die Ausgabe sieht so aus:
<html> stuff<b>bold</b>we do like </html>
Es scheint die Kindknoten innerhalb der Spanne umzukehren. Mache ich etwas falsch?
Sieht aus wie ein Fehler in HtmlAgilityPack - sehen Sie sich deren Problemregister an:
http://htmlagilypack.codeplex.com/workitem/9113
Interessanterweise wurde das vor 4 Jahren ausgelöst ...
Hier ist ein Ausschnitt, der alle span-Tags (oder jedes andere von Ihnen angegebene Tag) entfernt und andere Knoten in der richtigen Reihenfolge hält.
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);
}
}
}
foreach (HtmlNode child in tag.ChildNodes)
{
tag.ParentNode.InsertBefore(child, tag);
}
tag.Remove();