C# 使用另一个具有Agility Pack的节点包围现有节点

C# 使用另一个具有Agility Pack的节点包围现有节点,c#,html-agility-pack,C#,Html Agility Pack,如何使用节点围绕所有表?这显然不行: if (oldElement.Name == "table") { HtmlDocument doc = new HtmlDocument(); HtmlNode newElement = doc.CreateElement("div"); newElement.SetAttributeValue("class", "overflow"); newElement.AppendChild(oldElement); old

如何使用
节点围绕所有表?这显然不行:

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();
}
所有的表都被删除了,所以我确信我正在访问正确的节点。

看看jQuery的C#port。这是很容易做到的。首先加载文档:

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";
将完整文档呈现为字符串:

string html = doc.Render();

这可能有点难看,但您可以编辑oldElement.ParentNode节点的InnerHtml属性,如下所示:

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

哇,我肯定会在未来的项目中使用它,看起来你已经在那里创建了一些非常可靠的东西:)但是我恐怕我无法在我当前的项目中实现它,因为我现在时间有点短,我不想混合解析器。这需要一段时间才能开始,但现在有一个活跃用户的核心,它似乎正在流行!很高兴你也感兴趣。啊,这就是问题所在。我真的不明白为什么代码什么都没做。但你的解决方案很有魅力:)
if (oldElement.Name == "table")
{
    oldElement.ParentNode.InnerHtml = "\r\n<div class=\"overflow\">\r\n"
        + oldElement.OuterHtml +
        "\r\n</div>\r\n";
}
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);
}