Javaに最適なXMLパーサー[終了]


387

小さめの(せいぜい数MB、UTF-8でエンコードされた)XMLファイルを読み、さまざまな要素と属性を見て回って、おそらくいくつかを変更して、XMLをディスクに書き戻す必要があります(できれば、インデントされた書式で) 。

私のニーズに最適なXMLパーサーは何でしょうか?たくさんの選択肢があります。私が知っているいくつかは:

そしてもちろん、JDKの1つです(私はJava 6を使用しています)。私はXercesに精通していますが、それは不格好です。

推奨事項?


6
私は、ここでより多くのプレイヤーを見つけることができると思います:xml.com/lpt/a/1703
dma_k

1
この質問には本当に問題があると思います。1は、まったく異なるものを比較していることです。集中操作パーサー(xerces、crimson)とdom操作ライブラリ(dom4j、xom、jdom)を比較しています。また、答えは擁護に向かう傾向があり、それほど建設的ではありません。
Nathan Hughes

51
+220で建設的ではありません。明らかに、モデレーターとユーザーは何が建設的かについて異なる見方をしています。
tbroberg 2014年

5
はい、それはこのような質問になると改造は近視眼的であるようです。はい、答えは意見が分かれますが、間違いなく経験とほとんどの場合、答えは定量化されています。Modはおそらく、建設的な批判と結果をもたらす議論の余地があるこの質問を移動するために、別のタグを作成する必要があります。
Ashraff Ali Wahab 2016

@dma_kリンクが機能していません。
gaurav

回答:


81

速度とメモリに問題がない場合は、dom4j最適です。速度が必要な場合は、WoodstoxのようなStAXパーサーを使用するのが正しい方法ですが、物事を成し遂げるためにより多くのコードを記述し、ストリームでXMLを処理するために慣れる必要があります。


6
dom4jはかなり良いですが、間違いなく問題がないわけではありません。dom4jの代替案については、stackoverflow.com
questions / 831865 /…を

@zehrerはスレッドセーフですか?
gaurav

257

特定のパーサーの実装については考慮しないでください。XML処理用のJava APIを使用すると、標準に準拠したパーサー実装を使用できます。コードははるかに移植性が高く、特定のパーサーが古すぎることに気付いた場合は、コードの行を変更せずに別のパーサーに置き換えることができます(正しく実行した場合)。

基本的に、XMLを標準的な方法で処理するには3つの方法があります。

  • SAXこれは最も単純なAPIです。XMLを読み取るには、XMLが逐次処理されるときに要素/属性内のデータを受け取るHandlerクラスを定義します。一部の属性/要素を読み取るか、一部の値を書き戻すことを計画している場合(ケース)、それはより高速で単純です。
  • DOMこのメソッドは、ランダムに変更/アクセスできるオブジェクトツリーを作成するため、複雑なXML操作と処理に適しています。
  • StAXこれはSAXとDOMの間の経路の真ん中にあります。データを処理するときに、関心のあるパーサーからデータをプルするコードを記述するだけです。

JDOMやApacheのような独自のAPI(つまり、Apache Xerces XMLSerializer)を忘れてください。これは、時間の経過に伴って進化したり、下位互換性が失われたりする可能性がある特定の実装に結び付けられるため、将来的にアップグレードするときにコードを変更するためです。 JDOMの新しいバージョンまたは使用しているパーサー。(ファクトリーとインターフェースを使用して)Java標準APIを使用する場合、コードははるかにモジュール化され、保守可能になります。

提案されたパーサーのすべて(すべてをチェックしたわけではありませんが、ほぼ確実です)はJAXP実装に準拠していると言う必要はないので、技術的には、どちらを使用してもすべてを使用できます。


11
実際には、3つの方法があります。StAX(javax.xml.stream)は3番目の標準的な方法です。
StaxMan 2009

1
java-samples.com/showtutorial.php?tutorialid=152(個人的にSAXが大好き)
kitokid

@kitokid Chromeは、ページに嫌なものがあると教えてくれます。私は代わりにこれを使用しました:sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Ryan Shillington

良い概要:私が同意しないことは1つだけです-インクリメンタル/ストリーミングの場合、SAXとStaxは優れていますが、標準APIで十分ですが、DOMの場合はこれは当てはまりません(IMO):Java固有のテイクには正当な理由があります。 XOM、JDOM、およびDOM4J:言語に依存しないDOMは、使用するのがかなり面倒です。
StaxMan

130

これは、DOM、SAX、StAX、およびTrAXの優れた比較です(出典:http : //download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html

機能StAX SAX DOM TrAX

APIタイプ                 プル、ストリーミングプッシュ、ストリーミングインメモリツリーXSLTルール

使いやすさ           高中高中

XPath機能    いいえいいえはいはい

CPUとメモリ     良い良いさまざまな

転送のみ        はいはいいいえいいえ

XMLの読み取り              はいはいはいはい

XMLの書き込み              はいいいえはいはい

CRUD                      いいえいいえはいいいえ


7
SAXでXMLを書くことができます。シンクは、ユーザーがSAXイベントを呼び出してXML出力を生成できるハンドラー実装を提供します。(表は元の資料ではなく、出典がわかっているが、表は間違っている)
Dev


4

SAXとDOMに加えて、XMLプルパーサーであるXMLStreamReaderを使用して利用可能なSTaX解析があります。



2

私はこれをお勧めしません。あなたがあなたのアプリに多くの「思考」を持っているということですが、XSLTを使うことはJava操作よりも優れている(そしてXSLTからバイトコードへのコンパイルで潜在的に速くなる)かもしれません。


3
より良い、可能な:より速く、ほとんどあり得ない。
StaxMan 2009

XMLの読み取り、操作、および書き込みは、XSLTが設計されたとおりです。これは、すぐに使える素晴らしい回答です。
james.garriss 2014年

1

パフォーマンスをあまり気にしないのであれば、私はApache Digesterの大ファンです。本質的に、XMLからJava Beanに直接マッピングできるからです。

それ以外の場合は、まず解析してからオブジェクトを作成する必要があります。


Java Beanを作成する必要はありません。生のXML要素を少し操作し、特定の要素を確認してデータを取得するだけなので、DOMスタイルのパーサーがおそらく私の理想的なソリューションです。
エヴァン

ええ、dom4jはおそらくそこでの方がより良い解決策でしょう...ダイジェスターまで1レベル上がるまで、私は頻繁に使用していました
Uri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.