Envelopper dans un élément avec HtmlAgilityPack?

c# html-agility-pack

Question

J'ai un document HtmlDocument qui peut ou peut avoir une section <head> et <body> appropriée ou peut-être juste un fragment html. Quoi qu'il en soit, je veux le faire passer par une fonction qui garantira qu’il a (plus) une structure html appropriée.

Je sais que je peux vérifier s'il a un corps en vérifiant si

doc.DocumentNode.SelectSingleNode("//body");

est nul. S'il n'a pas de corps, comment pourrais-je envelopper le contenu de doc.DocumentNode dans un élément <body> et le HtmlDocument au HtmlDocument ?

Edit: Il semble y avoir une certaine confusion à propos de ce que je veux faire. En termes jquery:

doc.DocumentNode.SelectSingleNode("//body");

Fondamentalement, s'il n'y a pas d'élément body, placez un élément body autour de tout.

Réponse acceptée

Vous pouvez faire quelque chose comme ça:

HtmlDocument doc = new HtmlDocument();
doc.Load(MyTestHtm);
HtmlNode body = doc.DocumentNode.SelectSingleNode("//body");
if (body == null)
{
    HtmlNode html = doc.DocumentNode.SelectSingleNode("//html");
    // we presume html exists

    body = CloneAsParentNode(html.ChildNodes, "body");
}


static HtmlNode CloneAsParentNode(HtmlNodeCollection nodes, string name)
{
    List<HtmlNode> clones = new List<HtmlNode>(nodes);
    HtmlNode parent = nodes[0].ParentNode;

    // create a new parent with the given name
    HtmlNode newParent = nodes[0].OwnerDocument.CreateElement(name);

    // insert before the first node in the selection
    parent.InsertBefore(newParent, nodes[0]);

    // clone all sub nodes
    foreach (HtmlNode node in clones)
    {
        HtmlNode clone = node.CloneNode(true);
        newParent.AppendChild(clone);
    }

    // remove all sub nodes
    foreach (HtmlNode node in clones)
    {
        parent.RemoveChild(node);
    }
    return newParent;
}



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