使用Agility Pack将现有节点与另一个节点环绕

Chr*_*son 4 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);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试该代码时,表中没有任何反应.但如果我使用:

if (oldElement.Name == "table")
{
    oldElement.Remove();
}
Run Code Online (Sandbox Code Playgroud)

确实删除了所有表,所以我确定我正在访问正确的节点.

Ich*_*lay 7

它可能有点难看,但你可以像这样编辑oldElement.ParentNode节点的InnerHtml属性:

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

它似乎也不能编辑oldElement的OuterHtml属性(这就是为什么你必须先得到ParentNode).HtmlAgilityPack说你可以获取/设置OuterHtml,但是VS2010告诉我它是一个只读属性.

编辑

我正在玩一些代码来解决这个问题,看到它oldElement.ParentNode成为调用<div>之后的节点AppendChild().我找到的解决方案是HtmlNode在if块的开头创建另一个来保存父节点,然后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);
}
Run Code Online (Sandbox Code Playgroud)