1. ホーム
  2. xml

[解決済み] Groovy XmlSlurperとXmlParserの比較

2023-07-23 08:30:55

質問

私はこのトピックについてしばらく検索し、いくつかの結果も見つけました、私は記事の最後に記載されています。どなたか、以下の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は、単純な読み込みに使う分には似ているところがあります。 XMLParser と XMLSlurper は単純な読み込みに使う分には似ていますが、高度な読み込みや他の形式の XML 文書の処理に使う場合には 他の形式のXMLドキュメントを処理する場合、両者には違いがあります。 があります。

XMLParserはドキュメントをパースした後、中間結果を保存します。しかし 一方

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

本当の意味で根本的な違いは、パースされた情報を処理するときに明らかになります。 パースされた情報を処理する際に明らかになります。つまり、直接インプレース データ操作で処理する場合と、ストリーミング シナリオで処理する場合です。 の操作とストリーミングシナリオでの処理の場合です。

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

groovyのドキュメント( XmlParser , XmlSlurper ) があり、groovyのサイトでもよく説明されています( こちら はこちら )ですが、前述の質問を説明する上で、あまり良い仕事ではありません。

どのように解決するのですか?

XmlSlurperとXmlParserの大きな違いは、ParserがDOMに似たものを作成するのに対し、Slurperは本当に必要な場合のみ構造を作成しようとし、その結果、遅延評価されるパスを使用することです。ユーザーにとっては、どちらも同じように見えるかもしれない。違いは、パーサーの構造は一度だけ評価されるのに対し、スラーパーのパスは必要に応じて評価される点です。オンデマンドというのは、「よりメモリ効率は良いが、より遅い」という意味です。結局のところ、どれだけの数のパスやリクエストを行うかによります。例えば、XMLのある部分の属性の値を知りたいだけなら、XmlParserはすべてを処理し、擬似DOM上でクエリを実行します。この場合、多くのオブジェクトが生成され、メモリとCPUが消費されます。XmlSlurperはオブジェクトを作らないので、メモリとCPUを節約できる。もしあなたがドキュメントのすべての部分を必要とするなら、スラーパーはパーサーが作成するのと少なくとも同じ数のオブジェクトを作成するので、優位性を失います。

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

つまり、質問(1)、ユースケースの答えは、XML全体を処理する必要がある場合はパーサーを使い、一部だけを処理する場合はスラーパーを使うということです。APIや文法はあまり関係ありません。Groovyの人たちは、この2つをユーザーエクスペリエンスにおいて非常に近いものにしようとしています。また、XMLに漸進的な変更を加えたい場合は、スラーパーよりもパーサーの方が好ましいでしょう。

上記のイントロは、質問(2)のどちらがよりメモリ効率が高いかについても説明しています。スラーパーは、とにかくすべてを読み込むのでなければ、パーサーの方が良いかもしれませんが、その差がどれほど大きいかについての実際の数値は持っていません。

また、質問(3)はイントロで答えられると思います。遅延評価されたパスが複数ある場合、再度評価する必要があり、パーサーのように既存のグラフを移動する場合よりも遅くなる可能性があります。つまり、使い方によってはパーサーの方が速くなる可能性があります。

つまり、(3a)の場合、ほぼすべてのノードを読み込むこと自体に大きな違いはなく、要求がより決定的に重要な要素になります。しかし、(3b)の場合は、いくつかのノードを読むだけであれば、スラーパーはメモリ上に完全な構造を作成する必要がないため、それ自体がすでに時間とメモリのコストであると言えるでしょう。

(3c)については...最近ではどちらもXMLを更新/変換することができますが、どちらが速いかは、XMLのどの部分を変更しなければならないかに関連しています。もし多くの部分を変更するのであれば、パーサーを、そうでなければ、スラーパーが良いでしょう。しかし、たとえば、スラーパーで属性値を "Fred" から "John" に変更し、後で同じスラーパーでこの "John" を照会したい場合、それはうまくいかないでしょう。