Entourer un nœud existant avec un autre nœud avec le pack Agility

c# html-agility-pack

Question

Comment voulez-vous entourer toutes les tables d'un nœud <div class="overflow"></div> ? Cela ne le fait apparemment pas:

if (oldElement.Name == "table")
{
    HtmlDocument doc = new HtmlDocument();
    HtmlNode newElement = doc.CreateElement("div");
    newElement.SetAttributeValue("class", "overflow");
    newElement.AppendChild(oldElement);
    oldElement.ParentNode.ReplaceChild(newElement, oldElement);
}

Rien ne se passe sur les tables lorsque j'essaie ce code. Mais si j'utilise:

if (oldElement.Name == "table")
{
    oldElement.Remove();
}

Toutes les tables sont en effet supprimées, donc je suis sûr d’accéder aux bons nœuds.

Réponse acceptée

C'est peut-être un peu moche, mais vous pouvez simplement modifier l'attribut InnerHtml du nœud oldElement.ParentNode de la manière suivante:

if (oldElement.Name == "table")
{
    oldElement.ParentNode.InnerHtml = "\r\n<div class=\"overflow\">\r\n"
        + oldElement.OuterHtml +
        "\r\n</div>\r\n";
}

De plus, il ne semble pas que vous puissiez modifier l'attribut OuterHtml de oldElement (c'est pourquoi vous devez d'abord obtenir le ParentNode). HtmlAgilityPack indique que vous pouvez obtenir / définir OuterHtml, mais VS2010 me disait que c'était une propriété en lecture seule.

modifier

Je jouais avec du code pour comprendre cela et j'ai vu que oldElement.ParentNode devient le nœud <div> après l'appel de AppendChild() . La solution que j'ai trouvée consiste à créer un autre HtmlNode au début du bloc if afin de contenir le parent, puis à appeler ReplaceChild() sur ce nœud à la fin:

if (oldElement.Name == "table")
{
    HtmlNode theParent = oldElement.ParentNode;

    HtmlDocument doc = new HtmlDocument();
    HtmlNode newElement = doc.CreateElement("div");
    newElement.SetAttributeValue("class", "overflow");
    newElement.AppendChild(oldElement);

    theParent.ReplaceChild(newElement, oldElement);
}

Réponse populaire

Jetez un coup d’œil à CsQuery , un port C # de jQuery. Cela peut facilement être accompli. Commencez par charger le document:

CQ doc = CQ.CreateFromFile(..)  // or
CQ doc = CQ.CreateFromUrl(..)   // or
CQ doc = CQ.Create(string)

Créez la structure à utiliser, voici quatre manières différentes de le faire.

var wrap = CQ.CreateFragment("<div class='overflow'></div>");   // or

// you can pass HTML as a selector as in jQuery. The property indexer for a CQ
// object is the default method, same as $(..)

var wrap = doc["<div class='overflow'></div>"];   // or

var wrap = doc["<div />"].AddClass("overflow");  // or

// creates an element directly, sames as browser DOM methods

var wrap = doc.Document.CreateElement("div");
wrap.ClassName="overflow";

Enveloppez toutes les tables avec la structure:

doc["table"].Wrap(wrap);          // or use longhand for the Select method

doc.Select("table").Wrap(wrap);   

Rendre le document complet en une chaîne:

string html = doc.Render();


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow