Добавьте новую строку в исходный HTML-код, используя HTML Agility Pack

html html-agility-pack vb.net

Вопрос

Я изменяю HTML-файл с помощью пакета Agility Pack.

Ниже приведен пример файла 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)

И вот результат в файле HTML:

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

Я бы хотел:

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

Я думаю, что это должно быть реализовано по умолчанию, поскольку это делает мой HTML-файл неясным.

Я видел этот вопрос (который является моей точной проблемой) здесь, но ответ не работает для меня (возможно, из-за VB.NET и ответа C #).

Может ли кто-нибудь помочь?

Принятый ответ

Не писал ни одного vb.net за долгое время, поэтому сначала попробовал это в 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());

Отлично работает - выход:

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

Затем подумал: « никоим образом ... это не может быть » - обратите внимание на прокомментированные строки:

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

К сожалению, это так, и, вероятно, почему на вопрос, на который вы ссылались, не было отмечено ответ - вывод:

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

И, наконец, вместо того чтобы использовать строку новой строки в \r\n пытались Environment.NewLine , который делает работу и выходы:

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

Работает в C # в любом случае.


Популярные ответы

На основании этого ответа вам нужно будет добавить узел, представляющий возврат каретки ( \r ) и линейный канал ( \n ):

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

Основываясь на вашем комментарии:

Я пробовал это, но он добавляет '\ r \ n' в мой HTML, он не возвращается к строке.

Вы уже пробовали это, и вместо этого он печатает строковый литерал «\ r \ n». Мне тоже удалось воспроизвести эту проблему.

Вместо того, чтобы посмотреть на использование <br> тега , который является разрывом строки:

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

На основе вашего кода примера ваш код будет выглядеть примерно так:

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 предоставил мне компиляцию. Поскольку это выходит за рамки этого вопроса, и вы не подняли его как проблему, я сделаю предположение, что он работает для вас.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow