Agregue una nueva línea en el código fuente HTML usando HTML Agility Pack

html html-agility-pack vb.net

Pregunta

Estoy modificando un archivo HTML usando el paquete de agilidad HTML.

Aquí hay un ejemplo en un archivo HTML que contiene tablas:

Dim document As New HtmlDocument
Dim tables As Array

document.Load(path_html)

Dim div1 As HtmlNode = HtmlNode.CreateNode("<div></div>")
Dim div2 As HtmlNode = HtmlNode.CreateNode("<div></div>")

tables = document.DocumentNode.Descendants("table").ToArray()

For Each tr As HtmlNode In tables.Descendants("tr").ToArray
   tr.AppendChild(div1)
   tr.AppendChild(div2)
Next

document.save(path_html)

Y aquí está el resultado en el archivo HTML:

Dim document As New HtmlDocument
Dim tables As Array

document.Load(path_html)

Dim div1 As HtmlNode = HtmlNode.CreateNode("<div></div>")
Dim div2 As HtmlNode = HtmlNode.CreateNode("<div></div>")

tables = document.DocumentNode.Descendants("table").ToArray()

For Each tr As HtmlNode In tables.Descendants("tr").ToArray
   tr.AppendChild(div1)
   tr.AppendChild(div2)
Next

document.save(path_html)

Lo que me gustaría es:

Dim document As New HtmlDocument
Dim tables As Array

document.Load(path_html)

Dim div1 As HtmlNode = HtmlNode.CreateNode("<div></div>")
Dim div2 As HtmlNode = HtmlNode.CreateNode("<div></div>")

tables = document.DocumentNode.Descendants("table").ToArray()

For Each tr As HtmlNode In tables.Descendants("tr").ToArray
   tr.AppendChild(div1)
   tr.AppendChild(div2)
Next

document.save(path_html)

Creo que esto debería implementarse por defecto, ya que hace que mi archivo HTML no esté claro.

Vi esta pregunta (que es mi problema exacto) aquí, pero la respuesta no funciona para mí (tal vez debido a VB.NET y la respuesta es C #).

¿Alguien puede ayudar?

Respuesta aceptada

No he escrito ningún vb.net en mucho tiempo, así que primero probé esto en C# :

var document = new HtmlDocument();
var div = HtmlNode.CreateNode("<div></div>");
var newline = HtmlNode.CreateNode("\r\n");
div.AppendChild(newline);
for (int i = 0; i < 2; ++i)
{
    div.AppendChild(HtmlNode.CreateNode("<div></div>"));
    div.AppendChild(newline);
}
document.DocumentNode.AppendChild(div);
Console.WriteLine(document.DocumentNode.WriteTo());

Funciona muy bien - la salida:

var document = new HtmlDocument();
var div = HtmlNode.CreateNode("<div></div>");
var newline = HtmlNode.CreateNode("\r\n");
div.AppendChild(newline);
for (int i = 0; i < 2; ++i)
{
    div.AppendChild(HtmlNode.CreateNode("<div></div>"));
    div.AppendChild(newline);
}
document.DocumentNode.AppendChild(div);
Console.WriteLine(document.DocumentNode.WriteTo());

Luego pensó: "de ninguna manera ... no puede ser " - note las líneas comentadas:

var document = new HtmlDocument();
var div = HtmlNode.CreateNode("<div></div>");
var newline = HtmlNode.CreateNode("\r\n");
div.AppendChild(newline);
for (int i = 0; i < 2; ++i)
{
    div.AppendChild(HtmlNode.CreateNode("<div></div>"));
    div.AppendChild(newline);
}
document.DocumentNode.AppendChild(div);
Console.WriteLine(document.DocumentNode.WriteTo());

Desafortunadamente, es así, y probablemente el motivo por el que la pregunta a la que se vinculó no se marcó como respuesta : el resultado

var document = new HtmlDocument();
var div = HtmlNode.CreateNode("<div></div>");
var newline = HtmlNode.CreateNode("\r\n");
div.AppendChild(newline);
for (int i = 0; i < 2; ++i)
{
    div.AppendChild(HtmlNode.CreateNode("<div></div>"));
    div.AppendChild(newline);
}
document.DocumentNode.AppendChild(div);
Console.WriteLine(document.DocumentNode.WriteTo());

Por último, en lugar de utilizar la cadena de nueva línea como \r\n tratado Environment.NewLine , que funciona y salidas:

var document = new HtmlDocument();
var div = HtmlNode.CreateNode("<div></div>");
var newline = HtmlNode.CreateNode("\r\n");
div.AppendChild(newline);
for (int i = 0; i < 2; ++i)
{
    div.AppendChild(HtmlNode.CreateNode("<div></div>"));
    div.AppendChild(newline);
}
document.DocumentNode.AppendChild(div);
Console.WriteLine(document.DocumentNode.WriteTo());

Funciona de cualquier manera en C #.


Respuesta popular

En función de esta respuesta , deberá agregar un nodo que represente un retorno de carro ( \r ) y un avance de línea ( \n ):

Dim newLineNode As HtmlNode = HtmlNode.CreateNode("\r\n")

Basado en tu comentario:

Intenté esto pero agrega '\ r \ n' en mi HTML, no volverá a la línea.

Ya lo has intentado y en su lugar imprime la cadena literal "\ r \ n". Yo también he logrado replicar este problema.

En su lugar, observa la etiqueta <br> que es un salto de línea:

Dim newLineNode As HtmlNode = HtmlNode.CreateNode("\r\n")

Basado en su código de ejemplo, su código se vería así:

Dim newLineNode As HtmlNode = HtmlNode.CreateNode("\r\n")

Sin embargo tables.Descendants("tr").ToArray proporcionó un error de compilación para mí. Como está fuera del alcance de esta pregunta y no lo ha planteado como un problema, supondré que funciona para usted.




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é