如何在C#中使用HTML字符串操作DOM?

Pat*_*ins 7 .net html c# dom .net-2.0

目前,我发现能够从包含HTML的字符串中操作DOM的最佳方法是:

WebBrowser webControl = new WebBrowser();
webControl.DocumentText = html;
HtmlDocument doc = webControl.Document;
Run Code Online (Sandbox Code Playgroud)

有两个问题:

  1. 需要WebBrowser对象!
  2. 这不能用于多个线程; 我需要一些可以在不同线程上工作的东西(主线程除外).

有任何想法吗?

Pat*_*ins 19

我搜索了GooglePlex for HTML,我发现Html Agility Pack我不知道是不是这样,我现在正在下载它试一试.


Jas*_*ing 8

取决于你想要做什么(也许你可以给我们更多细节?)并且取决于HTML是否格式正确,你可以将其转换为XmlDocument:

System.Xml.XmlDocument x = new System.Xml.XmlDocument();
x.LoadXml(html); // as long as html is well-formed, i.e. XHTML
Run Code Online (Sandbox Code Playgroud)

然后,您可以轻松地操作它,而无需WebBrowser实例.至于线程,我不太了解实现XmlDocument知道该部分的答案.


如果文档格式不正确,您可以使用NTidy(HTML Tidy的 .NET包装器)来使其初始化 ; 我不得不为一个项目做过一次这样的事情,这真的不是太糟糕.


Mar*_*ool 7

JasonBunting已经发布了这个,但它确实可以在HTML整理中使用.net包装并将其加载到XmlDocument中.

我之前使用过这个.net包装器:

http://www.codeproject.com/KB/cs/ZetaHtmlTidy.aspx

并实现它有点像这样:

string input = "<p>crappy html<br <img src=foo></div>";
HtmlTidy tidy = new HtmlTidy()
string output = tidy.CleanHtml(input, HtmlTidyOptions.ConvertToXhtml);
XmlDocument doc = new XmlDocument();
doc.LoadXml(output);
Run Code Online (Sandbox Code Playgroud)

对不起,如果考虑重新发布:)


Ash*_*bry 5

这是一个老问题了。现在有:

  • HTML Agility Pack(您已经找到了)
  • CsQuery,一个 .Net jQuery 端口,对于 jQuery 开发人员来说非常有用