[解決済み] Groovy XmlSlurperとXmlParserの比較
質問
私はこのトピックについてしばらく検索し、いくつかの結果も見つけました、私は記事の最後に記載されています。どなたか、以下の3つの質問に正確に答えるのを助けていただけませんか?
-
XmlSluperを使用することは、XmlParserよりも意味があり、またその逆も(API/構文の使いやすさの観点から)あるのでしょうか?
-
どちらがよりメモリ効率が良いですか?(Slurperのようです)
-
どちらが早く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" を照会したい場合、それはうまくいかないでしょう。
関連
-
[解決済み] Googles IMPORTXMLが「インポートされたコンテンツは空です」エラーを返す
-
[解決済み] XMLでタグのブロックをコメントアウトするにはどうすればよいですか?
-
[解決済み】SAXとDOMの違いは何ですか?
-
[解決済み] foo "を含む属性を選択するための正しいXPathは何ですか?
-
[解決済み] XMLの属性値で二重引用符をエスケープするには?
-
[解決済み] XPath contains()の使い方を教えてください。
-
[解決済み] XML インスタンスドキュメントから XSD スキーマを生成するためのツールはありますか?[クローズド]。
-
[解決済み] SVGをSVGで埋め込む?
-
[解決済み] スキーマ定義における<xsd:all>と<xsd:sequence>の違い?
-
[解決済み] xpathを使用してノードのN番目の子を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] XMLの<![CDATA[]]>は何を意味するのですか?
-
[解決済み] ある要素のn番目のインスタンスを取得するためのXPathクエリ
-
[解決済み] Notepad++:ファイルを読み込むときに自動的に言語をXmlに設定する方法
-
[解決済み] Eclipse で XML の検証を無効にする
-
[解決済み] XMLで一行だけコメントするにはどうしたらいいですか?
-
[解決済み] XPathを使用して、次の兄弟/XMLタグを選択する方法
-
[解決済み] ChromeでローカルファイルのXSL変換を行うことはできますか?
-
[解決済み] xsl:for-eachループ内のカウンタ
-
[解決済み] XPathによる兄弟の値に基づくノードのマッチング
-
[解決済み] XMLスキーマ(XSD)からJsonスキーマを生成する【非公開