Aggiungi newline nel codice sorgente HTML utilizzando HTML Agility Pack

html html-agility-pack vb.net

Domanda

Sto modificando un file HTML utilizzando l'HTML Agility Pack.

Ecco un esempio su un file HTML contenente tabelle:

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)

Ed ecco il risultato nel file HTML:

<div></div><div></div>

Quello che vorrei è:

<div></div>
<div></div>

Penso che questo dovrebbe essere implementato di default in quanto rende poco chiaro il mio file HTML.

Ho visto questa domanda (che è il mio problema esatto) qui ma la risposta non funziona per me (forse a causa di VB.NET e la risposta è C #).

Qualcuno può aiutare?

Risposta accettata

Non ho scritto alcun vb.net da molto tempo, quindi prima ho provato questo in 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());

Funziona alla grande - l'output:

<div>
<div></div>
<div></div>
</div>

Poi pensò, " non c'è modo .... non può essere " - nota le righe commentate:

Dim document = New HtmlDocument()
Dim div = HtmlNode.CreateNode("<div></div>")
' this writes the literal string...
Dim newline = HtmlNode.CreateNode("\r\n")
' this works!
' Dim newline = HtmlNode.CreateNode(Environment.NewLine)
div.AppendChild(newline)
For i = 1 To 2
    div.AppendChild(HtmlNode.CreateNode("<div></div>"))
    div.AppendChild(newline)
Next
document.DocumentNode.AppendChild(div)
Console.WriteLine(document.DocumentNode.WriteTo())

Sfortunatamente è così, e probabilmente perché la domanda a cui ti sei collegato non è stata contrassegnata come risposta : l'output:

<div>\r\n<div></div>\r\n<div></div>\r\n</div>

Infine, invece di utilizzare la stringa nuova linea come \r\n trovato Environment.NewLine , che funziona e uscite:

<div>
<div></div>
<div></div>
</div>

Funziona in entrambi i modi in C #.


Risposta popolare

In base a questa risposta è necessario aggiungere un nodo che rappresenta un ritorno a capo ( \r ) e un avanzamento riga ( \n ):

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

In base al tuo commento:

Ho provato questo, ma aggiunge '\ r \ n' nel mio codice HTML, non si torna alla linea.

Hai già provato questo e invece stampa la stringa letterale "\ r \ n". Anch'io sono riuscito a replicare questo problema.

Invece guarda usando il tag <br> che è un'interruzione di riga:

Dim newLineNode As HtmlNode = HtmlNode.CreateNode("<br>")

In base al tuo codice di esempio, il tuo codice sarà simile a questo:

Dim newLineNode As HtmlNode = HtmlNode.CreateNode("<br>")

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

Comunque tables.Descendants("tr").ToArray ha fornito un errore di compilazione per me. Dato che è fuori dallo scopo di questa domanda e non l'hai sollevato come problema, supporrò che funzioni per te.



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é