In ein Element mit HtmlAgilityPack einbinden?

c# html-agility-pack

Frage

Ich habe ein HtmlDocument , das möglicherweise einen richtigen <head> und <body> -Abschnitt hat oder vielleicht ein HTML-Fragment ist. So oder so, ich möchte es durch eine Funktion ausführen, die sicherstellen wird, dass es eine (mehr) richtige HTML-Struktur hat.

Ich weiß, dass ich prüfen kann, ob es einen Körper hat, wenn ich sehe

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

ist Null. Wenn es keinen Body hat, wie würde ich den Inhalt von doc.DocumentNode in ein <body> -Element HtmlDocument und es dem HtmlDocument ?

Edit: Es scheint einige Verwirrung darüber zu geben, was ich tun möchte. In jQuery ausgedrückt:

$doc = $(document);
if( !$doc.has('body') ) {
    $doc.wrapInner('body');
}

Wenn es kein Körperelement gibt, lege grundsätzlich ein Körperelement um alles.

Akzeptierte Antwort

Du könntest so etwas tun:

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;
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum