Ajouter une nouvelle ligne dans le code source HTML à l'aide de HTML Agility Pack

html html-agility-pack vb.net

Question

Je modifie un fichier HTML à l'aide du pack d'agilité HTML.

Voici un exemple de fichier HTML contenant des tableaux:

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)

Et voici le résultat dans le fichier 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)

Ce que j'aimerais, c'est:

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)

Je pense que cela devrait être implémenté par défaut car cela rend mon fichier HTML peu clair.

J'ai vu cette question (qui est mon problème exact) ici mais la réponse ne fonctionne pas pour moi (peut-être à cause de VB.NET et la réponse est C #).

Quelqu'un peut-il aider?

Réponse acceptée

N'ayant pas écrit vb.net depuis longtemps , j'ai d'abord essayé ceci 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());

Fonctionne très bien - la sortie:

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

Alors pensé, " no way .... ça ne peut pas être " - notez les lignes commentées:

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

Malheureusement, il en est ainsi, et probablement la raison pour laquelle la question à laquelle vous avez lié le lien n'a pas été marquée - la sortie:

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

Enfin, au lieu d'utiliser la chaîne de retour à la ligne comme \r\n essayé Environment.NewLine , qui fonctionne et les résultats:

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

Fonctionne dans les deux sens en C #.


Réponse populaire

Sur la base de cette réponse, vous devrez ajouter un nœud représentant un retour chariot ( \r ) et un saut de ligne ( \n ):

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

Basé sur votre commentaire:

J'ai essayé ceci mais cela ajoute '\ r \ n' dans mon HTML, ça ne retourne pas à la ligne.

Vous avez déjà essayé cela et à la place, il affiche le littéral de chaîne "\ r \ n". J'ai moi aussi réussi à reproduire ce problème.

Au lieu de cela, utilisez la balise <br> qui est un saut de ligne:

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

Basé sur votre exemple de code, votre code ressemblerait à ceci:

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

Cependant, tables.Descendants("tr").ToArray m'a fourni une erreur de compilation. Étant donné que cela dépasse le cadre de cette question et que vous ne l'avez pas évoquée, je supposerai que cela fonctionne pour vous.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi