JavaでのXML解析に最適なライブラリはどれですか[終了]


158

XML(複雑な構成とデータファイル)を解析するためにJavaライブラリを検索しています。少しグーグルしましたが、dom4j以外は見つかりませんでした(V2で作業しているようです)。 XMLに関する他のapacheプロジェクトは休止状態のようです。私はdom4jを自分で評価していませんが、知りたいだけです-Javaには他の(良い)オープンソースxml解析ライブラリがありますか?そして、dom4jの体験はどうですか?

@Vooの答えが出たら、別の質問をさせてください。Javaの組み込みクラスまたはdom4jなどのサードパーティライブラリを使用する必要があります。利点は何ですか?


あなたは良いことを定義できますか?パフォーマンス、APIの品質、他に何かありますか?
Yishai

パフォーマンスと使いやすさ(はい、APIの品質)
Premraj

3
Javaのネイティブ実装を使用しない具体的な理由を投稿していません。
うなぎいっぱいのホバークラフト

vtd-xmlは、パフォーマンス/メモリ使用量と使いやすさで勝るものです。
vtd-xml-author

回答:


213

実際、JavaはそのままXMLを解析するための4つのメソッドをサポートしています。

DOMパーサー/ビルダー:XML構造全体がメモリーにロードされ、よく知られているDOMメソッドを使用してそれを操作できます。DOMでは、Xslt変換を使用してドキュメントに書き込むこともできます。例:

public static void parse() throws ParserConfigurationException, IOException, SAXException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setIgnoringElementContentWhitespace(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    File file = new File("test.xml");
    Document doc = builder.parse(file);
    // Do something with the document here.
}

SAXパーサー:XMLドキュメントを読み取るためだけです。Saxパーサーはドキュメントを実行し、ユーザーのコールバックメソッドを呼び出します。ドキュメントの開始/終了、要素などのメソッドがあります。これらはorg.xml.sax.ContentHandlerで定義されており、空のヘルパークラスDefaultHandlerがあります。

public static void parse() throws ParserConfigurationException, SAXException {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(true);
    SAXParser saxParser = factory.newSAXParser();
    File file = new File("test.xml");
    saxParser.parse(file, new ElementHandler());    // specify handler
}

StAxリーダー/ライター:これはデータストリーム指向のインターフェースで動作します。プログラムは、カーソル/イテレータのように準備が整ったときに次の要素を要求します。それを使ってドキュメントを作成することもできます。ドキュメントを読む:

public static void parse() throws XMLStreamException, IOException {
    try (FileInputStream fis = new FileInputStream("test.xml")) {
        XMLInputFactory xmlInFact = XMLInputFactory.newInstance();
        XMLStreamReader reader = xmlInFact.createXMLStreamReader(fis);
        while(reader.hasNext()) {
            reader.next(); // do something here
        }
    }
}

文書を書く:

public static void parse() throws XMLStreamException, IOException {
    try (FileOutputStream fos = new FileOutputStream("test.xml")){
        XMLOutputFactory xmlOutFact = XMLOutputFactory.newInstance();
        XMLStreamWriter writer = xmlOutFact.createXMLStreamWriter(fos);
        writer.writeStartDocument();
        writer.writeStartElement("test");
        // write stuff
        writer.writeEndElement();
    }
}

JAXB:XMLドキュメントを読み取るための最新の実装:v2のJava 6の一部です。これにより、ドキュメントからJavaオブジェクトをシリアル化できます。javax.xml.bind.Unmarshallerへのインターフェースを実装するクラスを使用してドキュメントを読みます(JAXBContext.newInstanceからこのクラスを取得します)。コンテキストは使用するクラスで初期化する必要がありますが、ルートクラスを指定するだけで、静的参照クラスを気にする必要はありません。注釈を使用して、どのクラスを要素(@XmlRootElement)にし、どのフィールドを要素(@XmlElement)または属性(@XmlAttribute、なんと驚き!)にするかを指定します。

public static void parse() throws JAXBException, IOException {
    try (FileInputStream adrFile = new FileInputStream("test")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Unmarshaller um = ctx.createUnmarshaller();
        RootElementClass rootElement = (RootElementClass) um.unmarshal(adrFile);
    }
}

文書を書く:

public static void parse(RootElementClass out) throws IOException, JAXBException {
    try (FileOutputStream adrFile = new FileOutputStream("test.xml")) {
        JAXBContext ctx = JAXBContext.newInstance(RootElementClass.class);
        Marshaller ma = ctx.createMarshaller();
        ma.marshal(out, adrFile);
    }
}

いくつかの古い講義のスライドから恥知らずにコピーされた例;-)

編集:「どのAPIを使用すればよいですか?」について。まあそれは依存する-すべてのAPIがあなたが見るのと同じ機能を持っているわけではありませんが、XMLドキュメントをマップするために使用するクラスを制御できる場合、JAXBは私の個人的なお気に入り、本当にエレガントでシンプルなソリューションです(私はそれを使用していません)本当に大きなドキュメントですが、少し複雑になる可能性があります)。SAXも非常に使いやすく、使用する正当な理由がない限り、DOMから離れてください。私の意見では、古くて不格好なAPIです。STLにない特に有用な機能を備えた最新のサードパーティライブラリはないと思います。標準ライブラリには、十分にテストされ、文書化され、安定しているという通常の利点があります。


@Natixが「編集」オプションの目的です。今より良いはずです。
キキワ2016

4
@Kikiwaの例外処理は、この投稿のポイントから可能な限り削除されています。一部の無能なコピーアンドペーストプログラマが先に進んで、目的を理解せずにスニペットをコピーした場合、それらは値するものを取得します。本当に心配も興味もありません。私が言うことは、try / catchブロックを削除し、代わりにメソッドシグネチャを表示して、さまざまなオプションがスローできる例外を文書化することで、興味深い情報を保持しながらスペースを節約できるということです。だから誰かがそれをしたいのなら、彼らはただ先に行くべきです。
Voo

1
(同時に、別の方法で追加情報を示すことなくtry / catchを削除する編集は拒否します)
Voo

最近のバージョンでは、JAXBはJDKに含まれていないと思います。
スロー

11

Javaは、XMLをそのまま解析するための2つのメソッドをサポートしています。

SAXParser

大きなXMLファイルを解析する場合や、大量のメモリを使用したくない場合は、このパーサーを使用できます。

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/SAXParserFactory.html

例:http : //www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

DOMParser

XPathクエリを実行する必要がある場合、または完全なDOMを使用できるようにする必要がある場合は、このパーサーを使用できます。

http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html

例:http : //www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/


5

DOMのようなAPI(つまり、XMLパーサーがドキュメントをElementノードとAttributeノードのツリーに変換するAPI)が必要な場合は、少なくともDOM自体、JDOM、DOM4J、およびXOMの4つから選択できます。DOMを使用する唯一の考えられる理由は、DOMが標準として認識され、JDKで提供されているためです。他のすべての点では、他のすべてが優れています。私の好みは、シンプルさ、パワー、パフォーマンスの組み合わせで、XOMです。

そしてもちろん、他の処理スタイルもあります。低レベルのパーサーインターフェイス(SAXおよびStAX)、データオブジェクトバインディングインターフェイス(JAXB)、および高レベルの宣言型言語(XSLT、XQuery、XPath)です。どちらが最適かは、プロジェクトの要件と個人の好みによって異なります。


2
DOMはW3C標準(w3.org/DOM)です。この標準のJava実装は、JAXP標準(jcp.org/en/jsr/detail?id=206)でカバーされています。などのOracleは、Apache、:JAXPは、その後のような異なるプロバイダによって実装されている
bdoughan

実際、(a)DOMが標準として定義され、複数の実装があり、(b)デフォルトでJDKに含まれていなければ、誰もDOMを使用しません。他のすべての観点からは、JDOM2とXOMがはるかに望ましいです。
マイケルケイ

4

ニキータのポイントは素晴らしいものです。成熟したものと悪いものを混同しないでください。XMLはそれほど変わっていません。

JDOMはDOM4Jのもう1つの代替手段です。


あなたはどちらを選びますか、そしてその理由は?
Premraj

1
それはあまり重要ではありません。どちらも、JDKに組み込まれたSAXおよびDOMパーサーのラッパーです。W3Cドキュメント階層は冗長で使いにくいので、DOM4JとJDOMの両方でより簡単にしようとしています。私はエリオット・ラスティ・ハロルドが好きなので、私は最初にJDOMに手を伸ばす傾向があります。
duffymo

4

JavaでXMLを解析するための外部ライブラリは必要ありません。Javaには、SAXとDOMの実装が組み込まれています。


3

JDOMの使用に関心があるが、しばらく更新されていない(特にJavaジェネリックを活用していない)ことを恐れている人のために、これらの側面に正確に対処し、JDOM APIを最新化するCoffeeDOMと呼ばれるフォークがあります。

http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-java-5/

次のプロジェクトページからダウンロードします。

https://github.com/cdmckay/coffeedom


1

VTD-XMLはヘビーデューティーXML解析ライブラリーです...ほとんどすべての点で他のものより優れています...これは、Javaプラットフォームで利用可能なすべてのXML処理フレームワークを分析する2013年のペーパーです...

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf


3
警告:VTD-XMLはGPLの下でライセンスされており、専門的または商業的な開発状況の大部分で効果的に除外されます。エンジニアは分析のために自分の弁護士に相談する必要がありますが、エンジニアリングを行うために支払われた場合、組織はGPLでライセンスされたライブラリの使用を許可していない(そして許可できない)ことに気付くでしょう。
サラG

そのリンクは機能してい
null
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.