4

現時点でAngleSharpを使用してHTML5を解析していますそれ?つまり、特定の要素を直接解析し、構造が実際に HTML5 であることを検証しますか?

4

1 に答える 1

9

うーん、ちょっとした例がいいでしょう。しかし、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
}

通常、すべてのノードはITextorIElement型になります。コメント ( IComment) も可能です。そのような にアタッチされたIDocumentまたはノードが表示されることはありません。ただし、HTML5 は非常に堅牢であるため、この方法を使用しても「エラー」が発生することはほとんどありません。IDocumentFragmentINodeList

できることは、(解析) エラーを探すことです。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) { }
}

構成でイベント アグリゲーターを使用する最も簡単な方法は、新しい (提供された) をインスタンス化することConfigurationです。サンプルスニペットとしてここに。

using AngleSharp;
// ...

var errorEvents = new SimpleEventAggregator();
var config = new Configuration(events: errorEvents);

注意: 報告されるエラーはすべて「公式」エラーです (W3C 仕様による)。これらのエラーは、提供されたコードが悪質または無効であることを示すものではなく、何かが仕様に従っておらず、フォールバックを適用する必要があることを示しているだけです。

これがあなたの質問に答えることを願っています。そうでない場合は、お知らせください。

更新AngleSharp の最新バージョンの回答を更新しました。

于 2014-08-12T17:35:30.050 に答える