我现在正在使用AngleSharp解析 HTML5 我正在做的是用一点 HTML 包装我想要解析的元素,使其成为有效的 HTML5,然后在上面使用解析器,有没有更好的做法它?意思是,直接解析特定元素并验证结构确实是 HTML5?
1 回答
嗯,举个小例子就好了。但是 AngleSharp 确实支持片段解析,这听起来像是你想要的。InnerHtml
通常,当您设置诸如将字符串转换为 DOM 节点的属性时,也会应用片段解析。
您可以使用该类的ParseFragment
方法HtmlParser
来获取给定源代码中包含的节点列表。一个例子:
using AngleSharp.Parser.Html;
// ...
var source = "<div><span class=emphasized>Works!</span></div>";
var parser = new HtmlParser();
var nodes = parser.ParseFragment(source, null);//null = no context given
if (nodes.Length == 0)
Debug.WriteLine("Apparently something bad happened...");
foreach (var node in nodes)
{
// Examine the node
}
通常所有节点都将是IText
或IElement
类型。注释 ( IComment
) 也是可能的。您将永远不会看到IDocument
或IDocumentFragment
连接到这样的INodeList
. 然而,由于 HTML5 非常健壮,使用这种方法您很可能永远不会遇到“错误”。
您可以做的是查找(解析)错误。您需要提供一个IConfiguration
公开事件聚合器的事件聚合器,该聚合器收集此类事件。仅聚合此类事件(不可能添加/删除多个处理程序)的最简单实现如下:
using AngleSharp.Events;
// ...
class SimpleEventAggregator : IEventAggregator
{
readonly List<HtmlParseErrorEvent> _errors = new List<HtmlParseErrorEvent>();
public void Publish<TEvent>(TEvent data)
{
var error = data as HtmlParseErrorEvent;
if (error != null)
_errors.Add(error);
}
public List<HtmlParseErrorEvent> Errors
{
get { return _errors; }
}
public void Subscribe<TEvent>(ISubscriber<TEvent> listener) { }
public void Unsubscribe<TEvent>(ISubscriber<TEvent> listener) { }
}
将事件聚合器与配置一起使用的最简单方法是实例化一个 new (provided) Configuration
。这里作为示例片段。
using AngleSharp;
// ...
var errorEvents = new SimpleEventAggregator();
var config = new Configuration(events: errorEvents);
请注意:报告的每个错误都是“官方”错误(根据 W3C 规范)。这些错误并不表示提供的代码是恶意的或无效的,只是表明某些内容不符合规范并且必须应用回退。
希望这能回答你的问题。如果没有,请告诉我。
更新更新了最新版 AngleSharp 的答案。