XML(複雑な構成とデータファイル)を解析するためにJavaライブラリを検索していますが、少しグーグルで検索しましたが、dom4j以外は見つかりませんでした(V2で動作しているようです)。コモンズ設定を見てみましたが、気に入らなかったため、XMLに関する他のApacheプロジェクトは休止状態にあるようです。私は自分でdom4jを評価していませんが、知りたいだけです-Javaには他の(良い)オープンソースxml解析ライブラリがありますか?そして、dom4jでの経験はどうですか?
@Vooの回答の後、別の質問をさせてください-ビルドクラスまたはdom4jなどの3番目のライブラリでJavaを使用する必要があります。利点は何ですか?
実際、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にはない、特に有用な機能を備えた最新のサードパーティライブラリはないと思います。標準ライブラリには、非常によくテストされ、文書化され、安定しているという通常の利点があります。
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/
ニキータのポイントは素晴らしいものです。成熟したものと悪いものを混同しないでください。 XMLはそれほど変わっていません。
JDOMはDOM4Jの別の代替手段になります。
DOMに似たAPI、つまりXMLパーサーがドキュメントを要素および属性ノードのツリーに変換するAPIが必要な場合は、DOM自体、JDOM、DOM4J、およびXOMから少なくとも4つを選択できます。 DOMを使用する唯一の理由は、それが標準として認識されており、JDKで提供されているためです。他のすべての点で、他のすべてが優れています。シンプルさ、パワー、パフォーマンスの組み合わせに対する私自身の好みは、XOMです。
そしてもちろん、低レベルのパーサーインターフェイス(SAXおよびStAX)、データオブジェクトバインディングインターフェイス(JAXB)、および高レベルの宣言型言語(XSLT、XQuery、XPath)などの処理スタイルがあります。どちらが最適かは、プロジェクトの要件と個人の好みによって異なります。
JDOMの使用に関心があるが、しばらく更新されていない(特にJavaジェネリックを活用していない)ことを恐れる人のために、CoffeeDOMと呼ばれるフォークがあります。詳細はこちら:
http://cdmckay.org/blog/2011/05/20/introducing-coffeedom-a-jdom-fork-for-Java-5/
次のプロジェクトページからダウンロードします。
JavaでXMLを解析するための外部ライブラリは必要ありません。 Javaには、SAXおよびDOMの組み込み実装が古くから付属しています。
VTD-XMLはヘビーデューティなXML解析ライブラリです...事実上あらゆる点で他のものより優れています... Javaプラットフォームで利用可能なすべてのXML処理フレームワークを分析する2013年の論文です...
http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf