XML文書を扱うのにJavaで最も優れたクラスはどれですか?JavaのベストXML処理クラス
答えて
これは実際にXML文書で何をしたいのか、文書の大きさによって異なります。
大体、あなたはとしてXML APIを分類することができます。
- DOM APIを - あなたが処理できるドキュメントのサイズを制限する、メモリーに文書全体をロードするが、その後、ナビゲーション用に最適化された構造体を作成することができますし、変換
- ストリーミングAPI - アプリケーションで低レベルの解析イベント(たとえば要素の開始、要素の終わりなど)を解釈する必要がありますが、メモリに制限されません。ストリーミングAPIには、プッシュ/プルの2種類があります。プッシュパーザは、定義したオブジェクトでパーズイベントを発生させ、そのオブジェクトは、たとえば、状態マシンまたはスタックを使用して、現在の解析状態を追跡する必要があります。パーサーを引き出すと、パーサーから解析イベントを引き出すことができます。これにより、XMLコンテンツを処理するための再帰的降下パーサを簡単に記述できますが、スタックサイズは処理できるドキュメントのサイズの制限になります。
- XMLマッパー - XMLコンテンツをJavaオブジェクトにマップします。 XMLマッピングの主な2つのアプローチがあります:code-genまたはreflectionです。 Code-genマッパーはXMLスキーマからJavaクラスを生成します。つまり、Javaコードでスキーマ構造を複製する必要はありませんが、Javaコードがスキーマ構造を正確に反映するという欠点があります。また、ほとんどのコードジェネレータは、動作するのが面倒で、独自の振る舞いを持たないNOJOクラスを作成します。リフレクティブマッパーを使用すると、豊富な動作を持つJavaクラスを作成し、XMLとのマッピング方法を定義することができます。定義済みのスキーマに準拠する必要がある場合は、クラスとマッピング設定が正しいことを確認する必要があります。そのスキーマ。利用可能
いくつかのオプションがあります:
- DOMのAPI:DOM APIの標準ライブラリに他のライブラリと相互運用標準(!明らかに)などですが、彼らはひどいです。 XOM(Adam Batkinが上記の理由と同じ理由で好き)やJDOMなど、DOMに似たいくつかのAPIがいくつかあります。いくつかを見て、あなたが好むAPIを決めてください。
- ストリーミングAPI:標準ライブラリには、SAXプッシュパーザの実装が含まれています。 Java用の標準プルパーサーはStAXです。
- マッピングAPI:JAXBはJSR標準ですが、マップされたクラス(注釈やXML設定が不要)からマッピング設定を簡単に分離できるため、XStreamを好んでおり、オブジェクトを他のデータ形式に/からマッピングします。
+1:それは依存しています - それは何に依存していますか? –
VTD-XMLはdom saxよりも優れており、ここにプルーフされています:http://sdiwc.us/digitlib/journal_paper.php?paper=00000582 .pdf –
使いやすさのためにJDOMだと思います。
さまざまな方法でXMLを扱えるようにするライブラリがたくさんありますが、いずれの方法も「ベスト」ではありません。いつものように、それはあなたがしようとしていることとあなたの要求が何であるかにかかっています。
DOMのようなパーサーが必要な場合、またはXML文書を構築する場合、私は個人的にはXOMが好きです。なぜなら、XML文書が正しく形成され、「正しい」ことを保証するからです。一番の優先順位は正しさです。他のシステムとの相互運用性が重要です.XMLがうまく機能します。 APIも非常にうまく設計されており、直感的に操作できるため、一般的な操作が非常に簡単になります。
特に私が使用したもの(特にJDOMは特に悪いAPIがあることがわかりました)の上にdom4jが出てきます。 dom4jを使用すると、XPathサポートのためにJaxenもプラグインできます。
例:
SAXReader reader = new SAXReader(); // dom4j SAXReader
Document document = reader.read(xmlInputStream); // dom4j Document
// select all link nodes with href "http://example.com"
List<Element> linkNodes = document.selectNodes("//link[@href='http://example.com']");
// select an attribute value
String val = linkNodes.get(0).attributeValue("href");
// select element text and trim it
String value = document.elementTextTrim("childNode");
DOMとSAXの古典的な組み合わせを使用することをお勧めします。
XML処理には2通りの方法があります。DOMとSAXがあり、いずれも長所と短所があります。それは、あなたのニーズと処理したいXML文書のサイズに依存します。既に記載されているJAXBは、両方の上にAPIを構築し、Java 6に同梱されています。
上記を理解したときは、具体的な質問をして、最高のDOMまたはSAXの実装を求めることができます。これに加えて、あなたの必要条件が何であるかを伝えることができればよいでしょう。 XMLを書いたり読んだりしますか?ファイルの大きさはどれくらいですか?等々。
EDIT:指摘
また、SAXのような低レベルですが、クライアントコードがパーサーからプッシュされたイベントを処理するのではなく、ストリームからXMLイベントを引き出すことを可能にするStAXもあります。これにより、XMLコンテンツを処理するための再帰的降下パーサーを簡単に記述できます。 – Nat
@Nat:それを使用したことはありません、チップのおかげで!私の答えを編集し、リンクを含んでいます。 –
読書をしているだけの場合は、XPathが良い選択です。それ以外の場合は、DOM(org.w3c.dom
パッケージ内)が最適です。
"best"は、理解してコード化するのが最も簡単であると定義されていません。そして、org.w3c.domのインターフェースを見るので、何らかの実装が必要です。 – duffymo
JavaはXMLを良好にサポートしています。ある意味での問題は、非常に多くの選択肢があることです。したがって、JavaでXMLを処理する "方法"はありません。あなたは手元の問題に基づいてツールを選ぶ必要があります。
オブジェクトツリーに読み込みたい複雑な検証済みのドキュメントがあり、ツリーをクエリして操作できるとします。これにはDOMパーサが必要です。そこから選択する番号があります。これにより、ドキュメント全体がオブジェクトに変換され、CPUの面でコストがかかる可能性があります。
特定の要素を選択するドキュメントがあり、パフォーマンスが問題であるとします。 SAXパーサー、プルパーサー、またはXPathを試してください。
おそらく、ワイヤ上のオブジェクトをマーシャリング/アンマーシャルする必要があります。他のオプションと同様、JAXBもこれの候補です。
あなたの質問に正解はありません。任意の[プログラミング]問題と同様に、問題を見て、オプションを評価し、そのジョブに最適なツールを選択する必要があります。
私はXML文書を扱う必要があるときはいつも、私はいつもdom4j/saxを最初の手段と考えていました。 ;)
SAXReaderを調べる必要があります。
@Epaga、「最高」を文脈に入れないと、あなたは悲惨に失敗します。
たとえば、DOMのような構造で膨大なXMLを読み込もうとすると、非常にばかげたことになります。ツールを賢明に選択する必要があります。
XOM(http://www.xom.nu)は、シンプルで柔軟なXMLツールキットであり、他の多くのパーサーよりも簡単で使いやすくなっています。標準のW3Cベースのツールから切り替えて以来、私の生産性はかなり向上しました。著者のElliotte Rusty Haroldは、彼のWebページで、XOMのデザインがXML DOMの適切なモデルである理由を説明します。
- 1. Paho JavaライブラリーでMQTTメッセージを処理するためのベスト・プラクティス
- 2. ベスト代替例外処理モデル
- 3. Javaでxml rpcリクエストを処理するxml rpcサーバーを作成する方法は? Javaクラスの
- 4. EclipseのベストXMLエディタ
- 5. Openxml 2.0 xml処理
- 6. AndroidのXMLリッチテキスト処理
- 7. Pythonのxml処理オプション
- 8. ミニドームでのPython XML処理
- 9. バックグラウンド処理java
- 10. Javaイメージ処理
- 11. JavaでのXSLT処理:パラメータ内のXMLコンテンツの受け渡し
- 12. クラス内の例外処理
- 13. PHPクラスのエラー処理
- 14. Apache XML-RPC例外処理
- 15. java例外処理
- 16. Java:トランザクション処理システム
- 17. Java例外処理
- 18. Eclipse Javaアノテーション処理
- 19. Javaでの同時データ挿入を処理するクラス
- 20. Javaの信号処理ライブラリ?
- 21. Javaスレッドの処理方法
- 22. Javaベースのタスク処理サーバー
- 23. Javaの並列処理フレームワーク
- 24. Javaの処理確認ダイアログボックス
- 25. Spring:DataSource Javaセキュリティコンフィグレーションのエラー処理
- 26. Java Webアプリケーションのメモリ処理
- 27. のjava - 例外処理
- 28. Java/.NETのタスク処理ライブラリ
- 29. Javaのループ並列処理
- 30. Java - OutOfMemoryErrorの処理方法
ほとんどのJavaフレームワークはXMLに大きく依存していますが、言語であるJavaはPythonに比べてXMLサポートが貧弱です。 –
"最高"を定義してください。 – Bombe
プログラミング言語は「Java」と呼ばれ、略語ではないので、すべて大文字「JAVA」で記述しないでください。 – Jesper