【问题标题】:Replacing A Node Using HtmlAgilityPack Throwing Strange Error使用 HtmlAgilityPack 替换节点抛出奇怪的错误
【发布时间】:2012-08-16 00:27:54
【问题描述】:

我有一个显示用户可以编辑的表格的网页。进行编辑后,我想将表格另存为 .html 文件,以后可以将其转换为图像。我通过覆盖渲染方法来做到这一点。但是,我想从最终版本中删除两个按钮和一个 DropDownList,以便我自己获取表格。这是我目前正在尝试的代码:

protected override void Render(HtmlTextWriter writer)
{
    using (HtmlTextWriter htmlwriter = new HtmlTextWriter(new StringWriter()))
    {
        base.Render(htmlwriter);
        string renderedContent = htmlwriter.InnerWriter.ToString();
        string output = renderedContent.Replace(@"<input type=""submit"" name=""viewReport"" value=""View Report"" id=""viewReport"" />", "");
        output = output.Replace(@"<input type=""submit"" name=""redoEdits"" value=""Redo Edits"" id=""redoEdits"" />", "");

        var doc = new HtmlDocument();
        doc.LoadHtml(output);

        var query = doc.DocumentNode.Descendants("select");
        foreach (var item in query.ToList())
        {
            var newNodeStr = "<div></div>";
            var newNode = HtmlNode.CreateNode(newNodeStr);
            item.ParentNode.ReplaceChild(newNode, item);
        }

        File.WriteAllText(currDir + "\\outputFile.html", output);

        writer.Write(renderedContent);
    }
}

我在另一个 SO post 中找到了关于用 HtmlAgilityPack 替换节点的解决方案:

var htmlStr = "<b>bold_one</b><strong>strong</strong><b>bold_two</b>";
var doc = new HtmlDocument();
doc.LoadHtml(htmlStr);

var query = doc.DocumentNode.Descendants("b");
foreach (var item in query.ToList())
{
    var newNodeStr = "<foo>bar</foo>";
    var newNode = HtmlNode.CreateNode(newNodeStr);
    item.ParentNode.ReplaceChild(newNode, item);
}

这是我要更改的渲染 HTML:

<select name="Archives" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;Archives\&#39;,\&#39;\&#39;)&#39;, 0)" id="Archives" style="width:200px;">
    <option selected="selected" value="Dashboard_Jul-2012">Dashboard_Jul-2012</option>
    <option value="Dashboard_Jun-2012">Dashboard_Jun-2012</option>
</select>

对 Replace 的两个调用按预期工作并删除了按钮。然而这一行:

var query = doc.DocumentNode.Descendants("select");

正在抛出此错误:

Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.

感谢任何建议。

问候。

【问题讨论】:

    标签: c# html parsing html-agility-pack


    【解决方案1】:

    似乎您在针对 .Net 或更低版本的项目中使用 .Net 4.5 版本的敏捷包,您只需将 Dll 的引用更改为为您的 Framework 版本编译的引用或将您的项目更改为.Net 4.5(如果您使用的是 VS 2012)。

    【讨论】:

    • 非常感谢。这解决了错误。但是现在该节点没有被空 div 替换。你有什么建议吗?
    • 好的,找到了。我需要doc.Save(&lt;filename&gt;)。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多