文章目录
所需
AngleSharp目前有两种版本:Windows for.NET 4.6和普通的.NET标准2.0平台。
库的大多数特性都不需要.NET 4.6,这意味着您可以创建自己的分叉并修改它以使用以前版本的.NET-Framework。
通过NuGet获取AngleSharp。
将AngleSharp集成到项目中的最简单方法是使用NuGet。您可以通过打开包管理器控制台(PM)并输入以下语句来安装AngleSharp:
Install-Package AngleSharp
您还可以使用图形库包管理器(“管理用于解决方案的NuGet包”)。在官方的NuGet在线提要中搜索“AngleSharp”将找到这个库。
第一步
在最简单的情况下,您已经有了一个文档源,并希望对其进行解析。这可能如下所示:
using System;
using AngleSharp;
using AngleSharp.Html.Parser;
class MyClass {
static async void Main() {
//Use the default configuration for AngleSharp
var config = Configuration.Default;
//Create a new context for evaluating webpages with the given config
var context = BrowsingContext.New(config);
//Source to be parsed
var source = "<h1>Some example source</h1><p>This is a paragraph element";
//Create a virtual request to specify the document to load (here from our fixed string)
var document = await context.OpenAsync(req => req.Content(source));
//Do something with document like the following
Console.WriteLine("Serializing the (original) document:");
Console.WriteLine(document.DocumentElement.OuterHtml);
var p = document.CreateElement("p");
p.TextContent = "This is another paragraph.";
Console.WriteLine("Inserting another element in the body ...");
document.Body.AppendChild(p);
Console.WriteLine("Serializing the document again:");
Console.WriteLine(document.DocumentElement.OuterHtml);
}
}
当然,还可以进一步执行更多DOM操作。
IBrowsingContext
表示进行文档评估的浏览上下文。这是解析任何HTML页面所必需的构造。它还允许提交表格,以下链接,下载资源,等等。我们可以把它想象成标准浏览器中的一个选项卡。
或者,我们可以在开始时使用以下代码:
var context = BrowsingContext.New(config);
var parser = context.GetService<IHtmlParser>();
var source = "<h1>Some example source</h1><p>This is a paragraph element";
var document = parser.ParseDocument(source);
那么什么是IHtmlParser?这是一个表示HTML 5解析器前端的类。它具有创建以下实例的方法:IHtmlDocument,其中包含解析的DOM。由于HTML对于可能出现的错误非常宽松,所以没有什么比异常更好的了。我们可能只会收到一些错误信息。这些消息可以通过一个特殊的接口接收,并且应该被视为警告。
DOM
AngleSharp背后的想法是提供最先进的解析器(用于css、HTML和相关对象,如URL),这些解析器生成与现代浏览器相同的DOM。相同的DOM意味着在JavaScript/当前浏览器中使用相同的API。这个API是标准化的,并且在web开发人员中是众所周知的.此外,DOM交互的生动活泼不仅限于JavaScript或浏览器托管场景。AngleSharp将使将现代浏览器的核心引入您的代码成为可能。
整个DOM已被传输到逻辑类结构中。如下图所示,可以解析此结构的一部分。请注意,图中显示了一个较旧的DOM模型。当前版本的AngleSharp实现了最新的DOM模型,这略有不同。尽管如此,这幅画仍然是有用的,以获得正确的想法。
The DOM as class relations
DOM有一些限制:
一般情况下,不能仅仅创建元素-几乎总是有工厂在IDocument实例或专门化,例如IHtmlDocument
已知元素的继承是不可能的。
DOM的修改必须遵循给定的路径
这意味着不能编写类似的代码(注意:HtmlParagraphElement元素是内部的-它是IHtmlParagraphElement接口),
var paragraph = new HTMLParagraphElement();
因为这在JavaScript中也是不可能的。需要的是IDocument接口。如果我们假设这个实例被调用document我们现在可以写
var paragraph = document.CreateElement("p");
它创建段落 (<p>
)元素,并将给定的文档指定为节点的所有者。与JavaScript/DOM世界一样,我们没有在文档中的任何地方追加该段。当一个元素没有被追加时,它没有父元素,因此不会出现在DOM树中。因此,它将不再序列化,某些特殊操作将毫无意义。此外,DOM树上的查询不会显示给定的元素。
另一方面,这些限制导致将所有构造函数标记为internal…这会防止继承(即使类可能不是sealed),并要求用户遵循给定的路径。
JavaScript等脚本语言的优点是即使CreateElement只返回IElement,您甚至可以访问以下方面的专门属性和方法:IHtmlElement,如果有的话。在静态类型化语言(如C#)中,我们需要强制转换。一种解决办法是使用dynamic,或者方便的扩展方法,如
var paragraph = document.CreateElement<IHtmlParagraphElement>();
此操作并直接返回类型的对象。IHtmlParagraphElement…不需要强制转换,保存了一个(可疑的)字符串分配。这个特定的扩展方法被放置在命名空间中。AngleSharp.Dom.
超越DOM
AngleSharp提供了一些无法通过标准DOM属性和方法访问的属性和方法。要区分标准化和扩展的简单属性类,称为DomNameAttribute已经被添加了。该属性应用于