Impossibile impostare InnerText utilizzando Html-Agility-Pack

html-agility-pack

Domanda

Dato un documento HTML, voglio identificare tutti i numeri nel documento e aggiungere tag personalizzati attorno ai numeri. In questo momento, io uso il seguente:

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

Una volta ottenuto il numeroColl, posso attraversare ogni partita e ottenere l'indice. Tuttavia, non posso modificare InnerText poiché è di sola lettura. Quello di cui ho bisogno è che se match.Value = 100 e match.Index = 25, voglio sostituire quello 25 con <span isIdentified='true'> 25 </span>

Qualsiasi aiuto su questo sarà molto apprezzato. Attualmente, dal momento che non sono in grado di modificare il testo interno, devo modificare InnerHtml ma alcuni elementi potrebbero avere 25 nel suo innerHtml. Questo non dovrebbe essere toccato. Ma come faccio a identificare se il numero è all'interno di un tag html cioè <table border = '1'> ha 1 nel tag.

Risposta accettata

Ecco cosa ho fatto per aggirare la limitazione di proprietà di sola lettura della proprietà InnerText di un nodo di testo , basta selezionare il nodo Genitore del nodo Testo e annotare l'indice del nodo Testo nelle raccolte di nodi figlio del nodo Genitore. Quindi fai 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));
            }
        }

Nel tuo caso, credo che tu abbia bisogno di creare un nuovo nodo Element che avvolga il testo in un HtmlElement e poi lo usi come una sostituzione del nodo Text.

O ancora meglio, vedi se puoi fare qualcosa come la risposta pubblicata qui: Sostituzione di un tag InnerText div con HTML Agility Pack


Risposta popolare

la creazione di un textnode non è ciò che dovrebbe fare in questo caso:

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

Il risultato dovrebbe essere qualcosa come & lt; script ....

ma è un compito di script di lavoro anche se lo aggiungo come "TEXT" non come html. Questo causa un tipo di problema di sicurezza per me perché il testo sarebbe un input da un utente anonimo.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché