使用Agility Pack將另一個節點環繞在現有節點上

c# html-agility-pack

你會如何用<div class="overflow"></div>節點圍繞所有表?這顯然不會這樣做:

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

當我嘗試該代碼時,表中沒有任何事情發生。但如果我使用:

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

確實刪除了所有表,所以我確定我正在訪問正確的節點。

一般承認的答案

它可能有點難看,但你可以像這樣編輯oldElement.ParentNode節點的InnerHtml屬性:

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

它似乎也不能編輯oldElement的OuterHtml屬性(這就是為什麼你必須先得到ParentNode)。 HtmlAgilityPack說你可以獲取/設置OuterHtml,但VS2010告訴我它是一個只讀屬性。

編輯

我正在玩一些代碼來解決這個問題,並且在調用AppendChild()之後看到oldElement.ParentNode成為<div>節點。我找到的解決方案是在if塊的開頭創建另一個HtmlNode以保存父節點,然後在該節點上調用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);
}

熱門答案

看看CsQuery ,一個jQuery的C#端口。這很容易實現。首先加載文檔:

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

創建要包裝的結構,這裡有四種不同的方法。

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

用結構包裝所有表:

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

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

將完整文檔呈現為字符串:

string html = doc.Render();


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow