Impossible de définir InnerText avec Html-Agility-Pack

html-agility-pack

Question

Avec un document HTML, je souhaite identifier tous les numéros du document et ajouter des balises personnalisées autour des numéros. En ce moment, j'utilise ce qui suit:

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//body");
MatchCollection numbersColl = Regex.Matches(htmlNode.InnerText, <some regex>);

Une fois que je reçois le numbersColl, je peux parcourir chaque match et obtenir l'index. Cependant, je ne peux pas changer InnerText car il est en lecture seule. Ce dont j'ai besoin, c'est que si match.Value = 100 et match.Index = 25, je souhaite remplacer ce 25 par <span isIdentified='true'> 25 </span>

Toute aide à ce sujet sera grandement appréciée. Actuellement, étant donné que je ne suis pas en mesure de modifier le texte interne, je dois modifier InnerHtml, mais un élément peut en avoir 25 dans innerHtml. Cela ne devrait pas être touché. Mais comment puis-je identifier si le numéro est dans une balise HTML, c'est-à-dire que <table border = '1'> a 1 dans la balise.

Réponse acceptée

Voici ce que j'ai fait pour contourner la limitation de propriété en lecture seule de la propriété InnerText d'un nœud Text , il suffit de sélectionner le nœud parent du nœud Text et de noter l'index du nœud Text dans les collections de nœuds enfants du nœud Parent. Ensuite, faites juste un ReplaceChild(...) .

       private void WriteText(HtmlNode node, string text)
        {
            if (node.ChildNodes.Count > 0)
            {
                node.ReplaceChild(htmlDocument.CreateTextNode(text), node.ChildNodes.First());
            }
            else
            {
                node.AppendChild(htmlDocument.CreateTextNode(text));
            }
        }

Dans votre cas, je pense que vous devez créer un nouveau nœud d'élément qui enveloppe le texte dans un objet HtmlElement, puis l'utiliser comme remplacement du nœud de texte.

Ou mieux encore, voyez si vous pouvez faire quelque chose comme la réponse publiée ici: Remplacement d'une balise InnerText HTML div à l'aide de HTML Agility Pack


Réponse populaire

créer un textnode ne fait pas ce qu'il devrait faire dans ce cas:

myParentNode.AppendChild(D.CreateTextNode("<script>alert('a');</script>"));
Console.Write(myParentNode.InnerHtml);

Le résultat devrait ressembler à & lt; script ....

mais c’est une tâche de script qui fonctionne même si je l’ajoute en tant que "TEXT" et non en HTML. Cela provoque un type de problème de sécurité pour moi car le texte serait une entrée d'un utilisateur anonyme.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi