Umgeben Sie den vorhandenen Knoten mit einem anderen Knoten mit Agility Pack

c# html-agility-pack

Frage

Wie würden Sie alle Tabellen mit einem <div class="overflow"></div> -Knoten <div class="overflow"></div> ? Dies tut es anscheinend nicht:

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

Wenn ich diesen Code ausprobiere, passiert nichts mit den Tabellen. Aber wenn ich benutze:

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

Alle Tabellen sind tatsächlich entfernt, also bin ich mir sicher, dass ich auf die richtigen Knoten zugreife.

Akzeptierte Antwort

Es könnte ein bisschen hässlich sein, aber Sie könnten einfach das InnerHtml-Attribut des oldElement.ParentNode-Knotens wie folgt bearbeiten:

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

Es scheint auch nicht so, als könnten Sie das OuterHtml-Attribut von oldElement bearbeiten (deshalb müssen Sie zuerst den ParentNode holen). Das HtmlAgilityPack sagt, dass Sie OuterHtml bekommen / setzen können, aber VS2010 sagte mir, dass es eine schreibgeschützte Eigenschaft ist.

Bearbeiten

Ich habe mit etwas Code oldElement.ParentNode , um das herauszufinden, und habe gesehen, dass oldElement.ParentNode zum <div> -Knoten wird, nachdem AppendChild() aufgerufen wurde. Die Lösung, die ich gefunden habe, ist, einen weiteren HtmlNode am Anfang des if-Blocks HtmlNode , um den Elternknoten zu halten, und am Ende dann ReplaceChild() auf diesem Knoten ReplaceChild() :

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

Beliebte Antwort

Sehen Sie sich CsQuery an , einen C # -Port von jQuery. Dies kann leicht erreicht werden. Laden Sie zuerst das Dokument:

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

Erstellen Sie die Struktur, zu der Sie wechseln möchten. Hier sind vier verschiedene Möglichkeiten, wie Sie das tun können.

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

Alle Tabellen mit der Struktur umbrechen:

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

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

Rendern Sie das gesamte Dokument in eine Zeichenfolge:

string html = doc.Render();


Related

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