web-dev-qa-db-ja.com

Groovy XmlSlurperとXmlParser

私はこのトピックでしばらく検索し、いくつかの結果も見つけました。これについては投稿の最後で言及しています。誰かが私の下にリストされているケースのためにこれらの3つの質問に正確に答えるのを手伝ってもらえますか?

  1. XmlSluperを使用するユースケースは、XmlParserよりも理にかなっており、その逆も同じです(API /構文の使いやすさの観点から)?

  2. どちらがよりメモリ効率が良いですか? (Slurperのように見える)

  3. どのXMLをより速く処理しますか?

ケースa。 xmlのほぼすべてのノードを読み取る必要がある場合

ケースb。 (gpath式を使用するなど)いくつかのノードだけを読み取る必要がある場合

ケースc。 xmlを更新/変換する必要がありますか?

xmlドキュメントが単純なものではない場合(XMLの深さとレベルのレベルで)。

リソース

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html 状態:

XMLParserとXMLSlurperの違い:

XMLParserとXMLSlurperには単純な読み取りに使用する場合に類似点がありますが、高度な読み取りに使用する場合と、他の形式のXMLドキュメントを処理する場合には2つの間に違いがあります。

XMLParserは、ドキュメントの解析後に中間結果を保存します。しかし一方で、

XMLSlurperは、XMLドキュメントの処理後に内部結果を保存しません。

解析された情報を処理すると、実際の根本的な違いが明らかになります。ストリーミングシナリオで直接インプレースデータ操作および処理を行う場合です。

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

Groovyのドキュメント( XmlParserXmlSlurper )とgroovyのサイトはそれらについてよく説明しています( here および here )前述の質問を説明するのに素晴らしい仕事をしないでください。

73
kunal

XmlSlurperとXmlParserの大きな違いは、パーサーがDOMに似たものを作成するのに対して、Slurperは本当に必要な場合にのみ構造を作成しようとするため、遅延評価されるパスを使用することです。ユーザーにとっては、どちらも非常に同等に見えます。違いは、パーサー構造が1回だけ評価されることです。スラーパーパスは要求に応じて評価される場合があります。ここでは、オンデマンドは「よりメモリ効率が良いが遅い」と読むことができます。最終的には、実行するパス/リクエストの数に依存します。たとえば、XMLの特定の部分の属性の値のみを知り、それを使用したい場合、XmlParserはすべてを処理し、疑似DOMでクエリを実行します。そのため、多くのオブジェクトが作成され、メモリとCPUが消費されます。 XmlSlurperはオブジェクトを作成しないため、メモリとCPUを節約します。とにかくドキュメントのすべての部分が必要な場合、スラーパーは少なくともパーサーと同じ数のオブジェクトを作成するため、利点を失います。

どちらもドキュメントに対して変換を行うことができますが、slurperはそれが定数であると想定しているため、最初に変更を書き出し、新しいslurperを作成して新しいxmlを読み込む必要があります。パーサーは、変更をすぐに確認できます。

したがって、質問(1)の使用例では、XML全体を処理する必要がある場合はパーサーを使用し、XMLの一部のみを処理する場合はスラーパーを使用します。 APIと構文は、実際にはそれほど重要ではありません。 Groovyの人々は、これら2つのユーザーエクスペリエンスを非常に似たものにしようとしています。また、XMLにインクリメンタルな変更を加えたい場合は、slurperよりもパーサーをお勧めします。

上記のイントロは、よりメモリ効率が良いものも説明しています(質問(2))。スラーパーは、とにかくすべてを読まない限り、パーサーはそうかもしれませんが、違いがどれほど大きいかについての実際の数字はありません。

また、質問(3)はイントロで回答できます。複数の遅延評価パスがある場合は、再度評価する必要があります。これは、パーサーのように既存のグラフをナビゲートする場合よりも遅くなる可能性があります。そのため、使用状況に応じて、パーサーを高速化できます。

(3a)ほとんどすべてのノード自体を読み取ることは、それほど大きな違いをもたらさないと言えます。それは、要求が決定要因であるためです。しかし、(3b)の場合、いくつかのノードを読み取るだけで、スラーパーは高速になります。これは、メモリ内に完全な構造を作成する必要がないためです。

(3c)に関しては...最近はどちらもXMLを更新/変換できますが、実際にはXMLのどの部分を変更する必要があるかにより高速です。多くの部分がパーサーである場合、そうでない場合は、おそらくスラーパーです。しかし、例えばスラーパーで属性値を「Fred」から「John」に変更する場合、後で同じ「スラーパー」を使用してこの「John」を照会するだけでは機能しません。

101
blackdrag

私はあなたに鮮明な回答をします:

* XML ParserはXML Slurperよりも高速です。
* XML Slurperは、XMLパーサーよりも少ないメモリを消費します。
* XMLパーサーは、XMLを同時に解析および更新できます。
* XML Slurperでは、更新のたびにXMLをマークアップ構築する必要があります。
*パス式を使用する場合、XML Slurperはパーサーよりも優れています。
*ほぼすべてのノードのXMLパーサーの読み取りには問題ありません

それが役に立てば幸い

1
srinivasan