No se puede establecer texto interno usando Html-Agility-Pack

html-agility-pack

Pregunta

Dado un documento HTML, quiero identificar todos los números en el documento y agregar etiquetas personalizadas alrededor de los números. En este momento, uso lo siguiente:

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

Una vez que obtenga los númerosColl, puedo atravesar cada partida y obtener el índice. Sin embargo, no puedo cambiar el texto interno ya que es de solo lectura. Lo que necesito es que si match.Value = 100 y match.Index = 25, quiero reemplazar esos 25 con <span isIdentified='true'> 25 </span>

Cualquier ayuda en esto será apreciada grandemente Actualmente, ya que no puedo modificar el texto interno, tengo que modificar el InnerHtml pero algún elemento puede tener 25 en el innerHtml. Eso no debe ser tocado. Pero, ¿cómo identifico si el número está dentro de una etiqueta html? Es decir, <table border = '1'> tiene 1 en la etiqueta.

Respuesta aceptada

Esto es lo que hice para solucionar la limitación de la propiedad de solo lectura de la propiedad de texto interno de un nodo de Texto , simplemente seleccione el nodo Padre del nodo Texto y observe el índice del nodo Texto en las colecciones del nodo hijo del nodo Padre. Luego simplemente haz 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));
            }
        }

En su caso, creo que necesita crear un nuevo nodo Elemento que envuelva el texto en un elemento HTML y luego usarlo como reemplazo del nodo Texto.

O incluso mejor, vea si puede hacer algo como la respuesta publicada aquí: Reemplazar una etiqueta HTML InnerText usando HTML Agility Pack


Respuesta popular

crear un nodo de texto no hace lo que debería hacer en este caso:

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

El resultado debería ser algo así como & lt; script ....

pero es una tarea de script de trabajo, incluso si la agrego como "TEXTO" no como html. Esto me causa un tipo de problema de seguridad porque el texto sería una entrada de un usuario anónimo.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué