Html Agility Pack - Supprimer un élément, mais pas innerHtml
Je peux facilement retirer l'élément simplement en note.Remove() lik ceci:
HtmlDocument html = new HtmlDocument();
html.Load(Server.MapPath(@"~\Site\themes\default\index.cshtml"));
foreach (var item in html.DocumentNode.SelectNodes("//removeMe"))
{
item.Remove();
}
Mais qui supprime le innerHtml.
Que faire si je ne veux supprimer la balise, et de garder la innerHtml?
Exemple:
<ul>
<removeMe>
<li>
<a href="#">Keep me</a>
</li>
</removeMe>
</ul>
Toute aide serait appréciée 🙂
Trouver le nœud parent du
Pensé, mais que faire si le nœud parent contient 5 nœuds imbriqués, et removeMe est le numéro 3, alors si j'ai ajouter le innerHtml de removeMe au nœud parent, la position n'est plus la même.
Eh bien peut-être que vous pouvez en fait remplacer le removeMe nœud par son innerHtml, ou d'insérer, après le nœud précédent, n'ont pas obtenu beaucoup d'expérience remplacer HTML à l'aide de HTMLAP, mais la navigation et la marche de l'arbre du DOM est vraiment facile.
Une autre solution serait d'utiliser la InsertAfter sur la suppression de moi, et insérez le innerHtml, puis retirez removeMe, mais je ne sais pas comment utiliser insertAfter correctement.
Bonne idée de l'essayer maintenant. Edit, il n'y a pas de remplacement de la méthode, seulement un replaceChild méthode.
removeMe
nœud et ajouter le innerHtml de la removeMe
nœud parent du nœud innerHtml et supprimer? 🙂Pensé, mais que faire si le nœud parent contient 5 nœuds imbriqués, et removeMe est le numéro 3, alors si j'ai ajouter le innerHtml de removeMe au nœud parent, la position n'est plus la même.
Eh bien peut-être que vous pouvez en fait remplacer le removeMe nœud par son innerHtml, ou d'insérer, après le nœud précédent, n'ont pas obtenu beaucoup d'expérience remplacer HTML à l'aide de HTMLAP, mais la navigation et la marche de l'arbre du DOM est vraiment facile.
Une autre solution serait d'utiliser la InsertAfter sur la suppression de moi, et insérez le innerHtml, puis retirez removeMe, mais je ne sais pas comment utiliser insertAfter correctement.
Bonne idée de l'essayer maintenant. Edit, il n'y a pas de remplacement de la méthode, seulement un replaceChild méthode.
OriginalL'auteur BjarkeCK | 2012-08-23
Vous devez vous connecter pour publier un commentaire.
nice, ça marche pour vous? j'obtiens toujours cette Exception: Nœud "<previousNode><previousNode>" n'a pas été trouvé dans la collection de mon test html: <ul><test></test><removeMe><li><a href=\"#\">Gardez-moi</a></li></removeMe></ul> - aussi quand je l'ai tester avec ça : "<ul><removeMe><li><a href=\"#\">Gardez-moi</a></li></removeMe></ul>"puis-je obtenir de l'erreur Inattendue.
Ce qui est étrange, ça fonctionne pour moi, même quand il n'y a pas de nœud parent.
fonctionne pour moi aussi....
Si le removeme balise avait de texte, le texte sera aussi supprimé. Par exemple <removeme>texte<p>texte</p></removeme> devenir <p>texte</p>
OriginalL'auteur L.B
Cela devrait fonctionner:
Cela n'a pas fonctionné pour mon cas de test. 🙂 Je ne suis pas sûr de savoir pourquoi vous avez le code HTML de concaténation de la partie.
Ceci va produire une commande de bug si il y a des précédents frères et sœurs, vous avez à parcourir le childnodes collection en arrière.
OriginalL'auteur user1519979
Il y a un problème avec le bool KeepGrandChildren mise en œuvre pour les personnes qui pourraient avoir le texte dans l'élément qu'ils sont en essayant de l'enlever. Si le removeme balise avait de texte, le texte sera aussi supprimé. Par exemple
<removeme>text<p>more text</p></removeme>
deviendra<p>more text</p>
Essayez ceci:
La libération de mon travail, de ne pas inverser l'ordre donc je ne sais pas à quoi vous faites allusion.
Désolé, je vois que vous vous adressiez à un autre bug. Ici est le seul dont je parle: htmlagilitypack.codeplex.com/discussions/79587 Si vous regardez le code source pour
HtmlNode.RemoveChildren()
vous verrez votre code inclut le même bug, vous avez besoin de processus et d'insérer des petits-enfants dans l'ordre inverse pour eux de sortir à droite.OriginalL'auteur jnoreiga
Il existe un moyen simple:
OriginalL'auteur Fernando JS
Ajouter mon grain de sel parce qu'aucune de ces approches traitées ce que je voulais (pour supprimer un ensemble de mots-clés donnés comme
p
etdiv
et poignée de nidification correctement tout en préservant l'intérieur de balises).Voici ce que j'ai trouvé et passe tous mes tests unitaires avec ce que je considère la plupart des cas, j'ai besoin de traiter avec:
Voici les cas que j'ai utilisé pour le test:
Il ne peut pas tout gérer, sans doute, mais il fonctionne pour mes besoins.
OriginalL'auteur kamranicus
Peut-être cela pourrait être ce que vous recherchez?
Edit: L. B, la réponse est beaucoup plus propre. Aller avec son!
OriginalL'auteur Ichabod Clay
Comment à ce sujet?
OriginalL'auteur Hoy Cheung
Normalement l'expression correcte serait
node.ParentNode.RemoveChildren(node, true)
.En raison d'un bug dans la commande
HtmlNode.RemoveChildren()
(http://htmlagilitypack.codeplex.com/discussions/79587), j'ai créé une méthode qui est similaire. Désolé c'est en VB. Si quelqu'un veut une traduction, je vais en écrire un.J'ai testé ce code avec le test suivant le balisage:
La sortie est:
OriginalL'auteur pseudocoder
avec la regex que vous pouvez faire ou que vous devez faire avec htmlagilitypack?
OriginalL'auteur user1519979