Sto tentando di sostituire questa terribile collezione di espressioni regolari divina che viene attualmente utilizzata per ripulire i blocchi di HTML mal formato e inciampare nel pacchetto di agilità HTML per C #. Sembra molto potente ma, tuttavia, non sono riuscito a trovare un esempio di come voglio usare il pacchetto che, nella mia mente, sarebbe una funzionalità desiderata inclusa in esso. Sono sicuro di essere un idiota e non riesco a trovare un metodo adatto nella documentazione.
Lasciami spiegare ... diciamo che avevo il seguente HTML:
<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>
... che voglio assomigliare a:
<p>
this is some text
<a href="somepage.html">Some link</a>
</p>
Quando utilizzo il metodo HtmlNode.Remove () rimuove il nodo e tutti i suoi figli. C'è un modo per rimuovere il nodo preservando i bambini?
Su HtmlNode, il metodo RemoveChild ha questo sovraccarico:
public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);
Quindi questo è come lo faresti:
HtmlDocument doc = new HtmlDocument();
doc.Load("yourfile.htm");
foreach (HtmlNode font in doc.DocumentNode.SelectNodes("//font"))
{
font.ParentNode.RemoveChild(font, true);
}
EDIT: Sembra che l'opzione Replace w / keepGrandChildren non funzioni come previsto, quindi ecco un'implementazione alternativa:
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);
}
}
Invece potresti provare ad usare AngleSharp .
var parser = new HtmlParser();
var document = parser.Parse(html);
using (var writer = new StringWriter())
{
document.ToHtml(writer, new PrettyMarkupFormatter());
return writer.ToString();
}