OmniXamlプロジェクトの一部としてプル パーサーを作成しました。XML ファイルを読み取り、それを列挙可能な XAML ノードに変換します。しかし、私はこの結果に満足していないので、よりエレガントな方法で別のものを作成することにしました。
これが、 Spracheを使用してパーサーを作成しようとした理由です。
問題は、どうやって始めたらいいのかわからないということです。XAML の解析はコンテキストに大きく依存するため、1 つの Xaml ノードを生成する場合は、次のノードを先読みして処理する必要がある場合があります。現在、XmlReader を使用して XAML を読み取ります。
ここでは、私が何をしたいのかを理解するために、入力/出力の例をいくつかリストしています。入力は XAML コードで、出力は XAML ノードのリストです。XAML ノードは、XAML で表されるオブジェクトを再作成するために必要なデータを保持する構造です。それらはCPUの命令のようなものです。
例 1
入力 (XAML):
<DummyClass xmlns="root" SampleProperty="Property!">
</DummyClass>
出力 (XAML ノードのリスト)
- 接頭辞「」を持つ「root」のネームスペース宣言
- DummyClass 型のオブジェクトの開始
- タイプ「DummyClass」からのメンバー「SampleProperty」の開始
- 値ノード:「プロパティ!」
- メンバーの終わり
- なし
- オブジェクトの終わり
例 2
入力:
<DummyClass xmlns="root">
<DummyClass.Child>
<ChildClass></ChildClass>
</DummyClass.Child>
</DummyClass>
出力:
- 接頭辞「」を持つ「root」のネームスペース宣言
- DummyClass 型のオブジェクトの開始
- なし
- タイプ「DummyClass」からのメンバー「Child」の開始
- タイプ「ChildClass」のオブジェクトの開始
- なし
- オブジェクトの終わり
- メンバーの終了
- オブジェクトの終わり
例 3
入力:
<DummyClass xmlns="root">
<DummyClass.Items>
<Item/>
<Item/>
<Item/>
</DummyClass.Items>
</DummyClass>
出力:
- 接頭辞「」を持つ「root」のネームスペース宣言
- DummyClass 型のオブジェクトの開始
- なし
- タイプ「DummyClass」から のメンバー「アイテム」の開始</li>
- [Get Object] ディレクティブ
- [項目の開始] ディレクティブ
- タイプ「アイテム」 のオブジェクトの開始</li>
- なし
- オブジェクトの終わり
- タイプ「アイテム」 のオブジェクトの開始</li>
- なし
- オブジェクトの終わり
- タイプ「アイテム」 のオブジェクトの開始</li>
- なし
- オブジェクトの終わり
- メンバーの終了
- オブジェクトの終わり
- メンバーの終了
- オブジェクトの終わり
質問: これをどのように開始しますか?
いくつかのサンプル/ガイドラインを提供していただけますか? ありがとう!