Racchiudere un elemento con HtmlAgilityPack?

c# html-agility-pack

Domanda

Ho un HtmlDocument che può o potrebbe avere una sezione <head> e <body> appropriata o potrebbe essere solo un frammento html. Ad ogni modo, voglio eseguirlo attraverso una funzione che assicurerà che ha (più) una struttura html adeguata.

So che posso controllare se ha un corpo vedendo se

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

è zero. Se non ha un corpo, come faccio a racchiudere il contenuto di doc.DocumentNode in un elemento <body> e assegnarlo nuovamente a HtmlDocument ?

Modifica: Sembra che ci sia una certa confusione su ciò che voglio fare. In termini jquery:

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

Fondamentalmente, se non c'è alcun elemento del corpo, metti un elemento del corpo attorno a tutto.

Risposta accettata

Potresti fare qualcosa del genere:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché