1. ホーム
  2. java

[解決済み] javaでXMLを解析するのに最適なライブラリはどれですか [終了しました]。

2022-04-23 05:11:37

質問

私はXML(複雑な設定とデータファイル)をパースするためのJavaライブラリを探しています、私は少しググったが、dom4j(彼らはV2に取り組んでいるようだ)以外のものを見つけることができませんでした...。私はcommonsの構成を見てみたが、それは好きではなかった、XMLの他のapacheプロジェクトは、冬眠中のようです。私は自分自身でdom4jを評価していないが、ちょうど知りたいと思った - Javaは、他の(良い)オープンソースのXMLパースライブラリを持っていますか?

Vooさんの回答を受けて、もう一つ質問させてください。javaの組み込みクラスを使うべきか、それともdom4jのようなサードパーティライブラリを使うべきか。どのような利点がありますか?

どのように解決するのですか?

実は、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 文書を読み込むための最新の実装。Java 6 v2に含まれる。 これにより、ドキュメントから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を使えばいいのか」ということについて。しかし、XMLドキュメントをマッピングするために使用するクラスをコントロールできるのであれば、JAXBは個人的に一番好きな、本当にエレガントでシンプルなソリューションです(ただし、本当に大きなドキュメントには使ったことがないので、少し複雑になってしまうかもしれません)。SAXもかなり使いやすいし、DOMはよっぽどの理由がない限り使わないでください-私の意見では、古くて不便なAPIです。最近のサードパーティライブラリには、STLにない便利な機能はないと思いますし、標準ライブラリには、非常によくテストされ、文書化され、安定しているという通常の利点があります。