J'essaie de remplacer cette horrible collection d'expressions régulières qui est actuellement utilisée pour nettoyer des blocs de code HTML mal formé et qui est tombé sur le pack d'agilité HTML pour C #. Il a l'air très puissant mais pour l'instant, je n'ai pas trouvé d'exemple de la façon dont je veux utiliser le pack qui, à mon avis, serait une fonctionnalité souhaitée incluse. Je suis sûr que je suis un idiot et que je ne trouve pas de méthode appropriée dans la documentation.
Laissez-moi vous expliquer ... disons que j'avais le code HTML suivant:
<p class="someclass">
<font size="3">
<font face="Times New Roman">
this is some text
<a href="somepage.html">Some link</a>
</font>
</font>
</p>
... à quoi je veux ressembler:
<p>
this is some text
<a href="somepage.html">Some link</a>
</p>
Lorsque j'utilise la méthode HtmlNode.Remove (), elle supprime le nœud et tous ses enfants. Existe-t-il un moyen de supprimer le nœud en préservant les enfants?
Sur HtmlNode, la méthode RemoveChild a cette surcharge:
public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);
Alors voici comment vous le feriez:
HtmlDocument doc = new HtmlDocument();
doc.Load("yourfile.htm");
foreach (HtmlNode font in doc.DocumentNode.SelectNodes("//font"))
{
font.ParentNode.RemoveChild(font, true);
}
EDIT: Il semble que l'option Remplacer avec keepGrandChildren ne fonctionne pas comme prévu. Voici donc une autre implémentation:
public static HtmlNode RemoveChild(HtmlNode parent, HtmlNode oldChild, bool keepGrandChildren)
{
if (oldChild == null)
throw new ArgumentNullException("oldChild");
if (oldChild.HasChildNodes && keepGrandChildren)
{
HtmlNode prev = oldChild.PreviousSibling;
List<HtmlNode> nodes = new List<HtmlNode>(oldChild.ChildNodes.Cast<HtmlNode>());
nodes.Sort(new StreamPositionComparer());
foreach (HtmlNode grandchild in nodes)
{
parent.InsertAfter(grandchild, prev);
}
}
parent.RemoveChild(oldChild);
return oldChild;
}
// this helper class allows to sort nodes using their position in the file.
private class StreamPositionComparer : IComparer<HtmlNode>
{
int IComparer<HtmlNode>.Compare(HtmlNode x, HtmlNode y)
{
return y.StreamPosition.CompareTo(x.StreamPosition);
}
}
Vous pouvez essayer d'utiliser AngleSharp à la place.
var parser = new HtmlParser();
var document = parser.Parse(html);
using (var writer = new StringWriter())
{
document.ToHtml(writer, new PrettyMarkupFormatter());
return writer.ToString();
}