HtmlAgilityPack remplace les balises de paragraphe par des sauts de ligne

c# html-agility-pack html-parsing

Question

La troisième application d'exportation que nous utilisons ne rendra pas correctement les balises de paragraphe (n'inclut pas la ligne supplémentaire entre les paragraphes). J'essaie donc de remplacer toutes les balises de paragraphe par deux balises de saut de ligne à l'aide de HtmlAgilityPack.

Voici ce que j'ai jusqu'à présent ...

// Shortened for this example
string rawHtml = "<p><strong><span>1.0 Purpose</span></strong></p><p><span>The role</span></p><p><span>NOTE: Defined...</span></p>";

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.LoadHtml(rawHtml);
doc.OptionWriteEmptyNodes = true;

// Updated using suggestion from Petr
HtmlNode linebreak = doc.CreateElement("br"); 
var paragraphTags = doc.DocumentNode.SelectNodes("p");
for (int i = 0; i < paragraphTags.Count; i++)
{
    HtmlNode childNode = HtmlNode.CreateNode(paragraphTags[i].InnerHtml);
    HtmlNode nextNode = paragraphTags[i];

    if (i > 0)
    {
        nextNode = doc.DocumentNode.InsertAfter(linebreak, nextNode);
        nextNode = doc.DocumentNode.InsertAfter(linebreak, nextNode);
    }
    doc.DocumentNode.InsertAfter(childNode, nextNode);
    paragraphTags[i].Remove();
}

Il supprime la balise de paragraphe mais ne rend qu'un saut de ligne. J'ai cherché sur Internet pour aller aussi loin que moi mais rien ne semble fonctionner.

OuterHtml ressemble à ceci ....

<strong><span>1.0 Purpose</span></strong><br /><span>The role</span><br /><span>NOTE: Defined...</span>

Une idée de ce que je fais mal? J'ai l'impression qu'il DOIT y avoir un moyen plus facile, n'est-ce pas?

Réponse acceptée

Deviner. Upvote à Petr et Simon pour les suggestions. La clé semblait être que j'avais besoin de deux noeuds différents.

string rawHtml = "<p><strong><span>1.0 Purpose</span></strong></p><p><span>The role</span></p><p><span>NOTE: Defined...</span></p>";

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags["br"] = HtmlElementFlag.Empty;
doc.LoadHtml(rawHtml);
doc.OptionWriteEmptyNodes = true;

HtmlNode linebreak1 = doc.CreateElement("br");
HtmlNode linebreak2 = doc.CreateElement("br");
var paragraphTags = doc.DocumentNode.SelectNodes("p");
for (int i = 0; i < paragraphTags.Count; i++)
{
    if (i > 0)
    {
        doc.DocumentNode.InsertBefore(linebreak1, paragraphTags[i]);
        doc.DocumentNode.InsertBefore(linebreak2, paragraphTags[i]);
    }
    doc.DocumentNode.InsertBefore(HtmlNode.CreateNode(paragraphTags[i].InnerHtml), paragraphTags[i]);
    paragraphTags[i].ParentNode.RemoveChild(paragraphTags[i]);
}

Réponse populaire

Est-ce que ça aide si vous utilisez

HtmlNode linebreak = doc.CreateElement("br");

créer un noeud de saut de ligne?




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