在HtmlAgilityPack中复制HtmlNode?

时间:2012-08-23 14:35:08

标签: c# xpath html-agility-pack

我正在使用HTML Agility Pack在同一页面上执行两项不同的操作 对于第一个我需要删除像脚本,样式等元素。 但是对于第二个,我必须保留所有元素。

由于我不能在第一部分之前完成第二部分,我正在寻找一种方法来复制对象,所以我可以保存第二部分的所有元素。 这是我尝试过的代码,但是对于某些共鸣,我没有得到它内部的节点。

        HtmlDocument HTMLdoc = new HtmlDocument();
        HTMLdoc.LoadHtml(sFetch);

        //duplicate document node
        var webPage = HtmlNode.CreateNode("<html></html>");
        webPage.CopyFrom(HTMLdoc.DocumentNode,true);

我想到的另一种方法是反转选择我要移除的所有元素的xpath。所以我将能够选择它们,而无需从对象中删除元素。 但我无法弄清楚如何使用XPath“not()”函数来反转我的查询。 这是我的XPath查询:

"//script | //style | //iframe | //select | //textarea | //comment() | //a[@href]"

感谢您的时间和帮助:)

2 个答案:

答案 0 :(得分:0)

以下是XPath表达式的倒置版本:

var nodes = doc.DocumentNode
    .SelectNodes("//node()[not(self::script or self::style or self::iframe or self::select or self::textarea or self::comment() or self::a[@href])]")
    .ToList();

这将选择除脚本,样式等之外的节点

答案 1 :(得分:0)

我正在做类似的事情。我必须获取此信息,然后将其转换为XML。这就是你需要的:

        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
        htmlDoc.LoadHtml(sfetch);

        HtmlNodeCollection page = htmlDoc.DocumentNode.SelectNodes("//table");//whatever tags your are looking for in your doc

        foreach (HtmlNode value in page)
        {
            richTxtboxFilteredHTML.Text += value.InnerText;
        }

如果您要进一步处理此问题,则需要继续引用每个HtmlNode。