如何只加载AngleSharp中的特定元素?

Eya*_*nik 4 c# html5 parsing anglesharp

我正在使用AngleSharp解析HTML5,我正在做的是用一些HTML包装我想要解析的元素,使其成为有效的HTML5然后使用解析器,是否有更好的做法它?意思是,直接解析特定元素并验证结构确实是HTML5?

Flo*_*ppl 8

嗯,一个小例子会很好.但是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
}
Run Code Online (Sandbox Code Playgroud)

通常所有节点都是ITextIElement类型.也可以评论(IComment).你永远不会看到IDocumentIDocumentFragment节点附加到这样的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) { }
}
Run Code Online (Sandbox Code Playgroud)

将事件聚合器与配置一起使用的最简单方法是实例化一个新的(提供的)Configuration.这里作为示例代码段.

using AngleSharp;
// ...

var errorEvents = new SimpleEventAggregator();
var config = new Configuration(events: errorEvents);
Run Code Online (Sandbox Code Playgroud)

请注意:报告的每个错误都是"官方"错误(根据W3C规范).这些错误并不表示所提供的代码是恶意的或无效的,只是某些内容不符合规范并且必须应用回退.

希望这能回答你的问题.如果没有,请告诉我.

更新更新了AngleSharp的最新版本的答案.