使用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