[解決済み] javaでXMLを解析するのに最適なライブラリはどれですか [終了しました]。
質問
私は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にない便利な機能はないと思いますし、標準ライブラリには、非常によくテストされ、文書化され、安定しているという通常の利点があります。
関連
-
[解決済み】JNI共有ライブラリ(JDK)の読み込みに失敗しました。)
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
Javaエラーメッセージがenclosingクラスでない
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
ファインバグタイプ
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
Spring Boot による HTTPS アクセスの設定
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)