【问题标题】:Add newline in HTML source code using HTML Agility Pack使用 HTML Agility Pack 在 HTML 源代码中添加换行符
【发布时间】:2017-03-07 14:49:53
【问题描述】:

我正在使用 HTML Agility Pack 修改 HTML 文件。

这是一个包含表格的 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 文件不清楚。

我看到了这个问题(这是我的确切问题)here,但答案对我不起作用(可能是因为 VB.NET 而答案是 C#)。

谁能帮忙?

【问题讨论】:

  • 你添加newLineNode了吗?这将是Dim newLineNode As HtmlNode = HtmlNode.CreateNode("\r\n")。然后你会使用tr.AppendChild(div1)...tr.AppendChild(newLineNode)...tr.AppendChild(div2)
  • 我试过了,但它在我的 HTML 中添加了 '\r\n',它不会回到原来的位置。
  • tables.Descendants("tr").ToArray 为我抛出了一个编译错误。也许这就是问题所在?您能否在问题中提供您的初始 HTML 或至少提供一个示例?

标签: html vb.net html-agility-pack


【解决方案1】:

很长时间没有写过任何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())

不幸的是,这可能是为什么question you linked to was not marked answered - 输出:

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

最后,尝试Environment.NewLine,而不是使用换行符作为\r\n确实工作并输出:

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

在 C# 中以任何方式工作。

【讨论】:

    【解决方案2】:

    基于此answer,您需要添加一个表示回车 (\r) 和换行 (\n) 的节点:

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

    根据您的评论:

    我试过了,但它在我的 HTML 中添加了 '\r\n',它不会回到原来的位置。

    您已经尝试过这个,而是打印字符串文字“\r\n”。我也设法复制了这个问题。

    改为使用&lt;br&gt;标签,这是一个换行符:

    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 确实为我提供了编译错误。由于这超出了此问题的范围,并且您尚未将其作为问题提出,因此我假设它对您有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多