Je tente de remplacer cette guidique collection d'expressions régulières actuellement utilisées pour nettoyer les blocs de HTML mal formé et trébubli sur le pack d'agilité HTML pour C #. Il a l'air très puissant mais pourtant, je n'ai pas pu trouver un exemple de la façon dont je veux utiliser le peloton qui, dans mon esprit, serait une fonctionnalité souhaitée incluse. Je suis sûr que je suis un idiot et je ne trouve pas une méthode appropriée dans la documentation.
Permettez-moi d'expliquer ... Dites que j'avais le suivant HTML: P>
<p> this is some text <a href="somepage.html">Some link</a> </p>
3 Réponses :
Une fois que vous avez trouvé que l'élément
utilise la méthode Innertext pour obtenir le texte, puis effectuez la suppression, puis insérez le texte. P>
Désolé, je suppose que mes exemples HTML étaient trop simplistes. Il doit copier plus que l'Innertext vers l'élément parent. S'il vous plaît voir mes exemples révisés / édités.
sur htmlnode, la méthode Removechild a cette surcharge: Voici comment vous le feriez: P> 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);
}
}
Cela semble prometteur avec un problème. Il inverse l'ordre des petits-enfants de l'original.
@nokturnal - bonne prise! hhmmm. On dirait un bug pour moi. J'ai mis à jour ma réponse.
Cela ressemble à la bonne réponse, mais il y a des défauts dans le pack d'agilité HTML avec qui m'éloignera probablement pour ce projet.
La première solution (avant que le edit i>) semble fonctionner correctement pour moi.
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(); }
Totalement une libération étonnante (de même que c'est pseudo-prédécesseur Csquery), et je recommanderais totalement ceci maintenant ... cela n'existait tout simplement pas en 2011 :)
Actuellement, au lieu de parser.parse code>, vous devez utiliser
parser.parseDocument code>.