Circondare il nodo esistente con un altro nodo con Agility Pack

c# html-agility-pack

Domanda

Come andresti a circondare tutte le tabelle con un nodo <div class="overflow"></div> ? Questo a quanto pare non lo fa:

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

Non succede nulla ai tavoli quando provo quel codice. Ma se io uso:

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

Tutte le tabelle sono effettivamente rimosse, quindi sono sicuro che sto accedendo ai nodi corretti.

Risposta accettata

Potrebbe essere un po 'brutto, ma è sufficiente modificare l'attributo InnerHtml del nodo oldElement.ParentNode in questo modo:

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

Inoltre, non sembra che tu possa modificare l'attributo OuterHtml di oldElement (che è il motivo per cui devi prima ottenere il ParentNode). HtmlAgilityPack dice che puoi ottenere / impostare OuterHtml, ma VS2010 mi stava dicendo che è una proprietà di sola lettura.

modificare

Stavo giocando con del codice per capirlo e ho visto che oldElement.ParentNode diventa il nodo <div> dopo che si chiama AppendChild() . La soluzione che ho trovato è quella di creare un altro HtmlNode all'inizio del blocco if per contenere il parent e quindi chiamare ReplaceChild() su quel nodo alla fine:

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

Risposta popolare

Dai un'occhiata a CsQuery , una porta C # di jQuery. Questo può essere facilmente realizzato. Prima carica il documento:

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

Crea la struttura per avvolgere, qui ci sono quattro modi diversi per farlo.

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

Avvolgi tutti i tavoli con la struttura:

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

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

Rendi il documento completo in una stringa:

string html = doc.Render();


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow