web-dev-qa-db-ja.com

javaのXML解析に最適なライブラリ

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

@Vooの回答の後、別の質問をさせてください-ビルドクラスまたはdom4jなどの3番目のライブラリでJavaを使用する必要があります。利点は何ですか?

148
Premraj

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

DOM Parser/Builder: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にはない、特に有用な機能を備えた最新のサードパーティライブラリはないと思います。標準ライブラリには、非常によくテストされ、文書化され、安定しているという通常の利点があります。

198
Voo

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/

8
RAJH

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

JDOMはDOM4Jの別の代替手段になります。

4
duffymo

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

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

3
Michael Kay

JDOMの使用に関心があるが、しばらく更新されていない(特にJavaジェネリックを活用していない)ことを恐れる人のために、CoffeeDOMと呼ばれるフォークがあります。詳細はこちら:

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

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

https://github.com/cdmckay/coffeedom

3
ngeek

JavaでXMLを解析するための外部ライブラリは必要ありません。 Javaには、SAXおよびDOMの組み込み実装が古くから付属しています。

3
ChrisJ

VTD-XMLはヘビーデューティなXML解析ライブラリです...事実上あらゆる点で他のものより優れています... Javaプラットフォームで利用可能なすべてのXML処理フレームワークを分析する2013年の論文です...

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

1
vtd-xml-author