Fügen Sie mit HTML Agility Pack einen neuen HTML-Quellcode hinzu

html html-agility-pack vb.net

Frage

Ich ändere eine HTML-Datei mit dem HTML Agility Pack.

Hier ist ein Beispiel für eine HTML-Datei, die Tabellen enthält:

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)

Und hier ist das Ergebnis in der HTML-Datei:

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

Was ich möchte ist:

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

Ich denke, das sollte standardmäßig implementiert werden, da es meine HTML-Datei unklar macht.

Ich habe diese Frage (die genau mein Problem ist) hier gesehen, aber die Antwort funktioniert nicht für mich (vielleicht wegen VB.NET und die Antwort ist C #).

Kann jemand helfen?

Akzeptierte Antwort

Habe vb.net langer Zeit kein vb.net mehr geschrieben, also vb.net zuerst 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());

Funktioniert gut - die Ausgabe:

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

Dann dachte " Nein, so kann es nicht sein " - beachte die kommentierten Zeilen:

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())

Leider ist es so, und wahrscheinlich, warum die Frage, die du verlinkt hast, nicht als beantwortet markiert wurde - die Ausgabe:

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

Schließlich, statt den Newline-String als \r\n versucht Environment.NewLine , die funktioniert und gibt aus:

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

Funktioniert in C #.


Beliebte Antwort

Basierend auf dieser Antwort müssen Sie einen Knoten hinzufügen, der einen Wagenrücklauf ( \r ) und einen Zeilenvorschub ( \n ) darstellt:

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

Basierend auf Ihrem Kommentar:

Ich habe das versucht, aber es fügt "\ r \ n" in meinem HTML-Code hinzu, es geht nicht zurück in die Zeile.

Sie haben dies bereits versucht und stattdessen das String-Literal "\ r \ n" ausgegeben. Ich habe es auch geschafft, dieses Problem zu replizieren.

Sehen Sie sich stattdessen ein <br> -Tag an, bei dem es sich um einen Zeilenumbruch handelt:

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

Basierend auf Ihrem Beispielcode würde Ihr Code etwa so aussehen:

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

tables.Descendants("tr").ToArray hat einen Kompilierfehler für mich tables.Descendants("tr").ToArray . Da dies nicht in den Rahmen dieser Frage fällt und Sie es nicht als Problem angesprochen haben, werde ich davon ausgehen, dass es für Sie funktioniert.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum