5

ツリーパーサーとストリームパーサーの説明を探しています。

私が調査してきたことから、Android の JSON 組み込みパーサーはツリー パーサーであり、Jackson Json パーサーはストリーム パーサーです。また、android の xml プル パーサーはストリーム パーサーです。

私の質問は、ツリー パーサーとは何ですか。ストリーム パーサーとツリー パーサーの違いを説明していただけますか? From Google I/O プレゼンターは、ツリー パーサーはバッテリー寿命を大幅に浪費するため、ストリーム パーサーの代わりに使用することは避けるべきであると述べました。

更新: ツリー パーサーは Dom パーサーと同じですか? つまり、用語は同じですか?

4

1 に答える 1

4

ツリー パーサーは、テキストの完全な解析を返します。したがって、テキスト全体が解析されるまで、答えは得られません。

対照的に、ストリーム パーサーは、テキストの処理中に情報を返します。必要に応じて、ツリーを構築するのはあなた次第です。アルゴリズムでは、この違いは、いわゆるバッチまたはオフライン アルゴリズム (ツリー解析) とオンライン アルゴリズム (ストリーム パーサー) の違いです。

オンライン アルゴリズムとオフライン アルゴリズムの違いを参照してください。.

では、なぜどちらか一方を選択するのでしょうか。Google I/O プレゼンターは、バッテリー寿命について言及しました。しかし、これは、テキスト全体のツリーを格納するためにより多くのメモリが必要であり、テキスト全体を読み取るためにより多くの処理時間が必要な、より一般的な原則の結果です (ストリーム パーサーが早期に終了できると仮定します)。

DOM または XML ドキュメントの最初のタグを見つけるなど、テキストの小さな部分を使用する特定の情報を探している場合は、おそらくストリーム アプローチが適しています。

一方で、すべてのタグ、およびドキュメントのいくつかの概念的なパスとして考えられるさまざまな種類のタグを見つける必要がある場合、またはそのテキスト/ツリーに何度も戻ってくる場合は、テキストに対して複数のパスを作成するのではなく、解析を 1 回実行して、結果のツリーを処理する必要があります。

同様に、必要な情報の種類が、問題をツリーとして考えることによって最もよく答えられる場合: 子ノード、兄弟ノード、および/または祖先ノードから情報を取得または渡す場合は、おそらくツリー アプローチを使用することをお勧めします。しかし...

理論的には、作業を進めながらツリーを構築する作業を行うことで、いつでもストリーミング パーサーをツリー パーサーに変えることができます。そして、それはあなたが書かなければならない追加のコードです。

ストリーム パーサーとツリー パーサーの違いは、Python のイテレーター/ジェネレーターとリスト (Ruby の列挙型と配列) の違いに似ています。

于 2016-09-23T16:43:45.467 に答える