ホームページ バックエンド開発 XML/RSS チュートリアル Java で XML ファイルを読み取る 4 つの方法と比較のためのコード例の詳細な紹介

Java で XML ファイルを読み取る 4 つの方法と比較のためのコード例の詳細な紹介

Mar 08, 2017 pm 04:42 PM

1) DOM (JAXP Crimson パーサー)
DOM は、プラットフォームや言語に依存しない方法で XML ドキュメントを表現するための公式 W3C 標準です。 DOM は、階層構造で編成されたノードまたは情報の集合です。この階層により、開発者はツリーで特定の情報を検索できます。この構造を分析するには、通常、作業を行う前にドキュメント全体をロードし、階層を構築する必要があります。 DOM は情報階層に基づいているため、ツリーベースまたはオブジェクトベースとみなされます。 DOM、および一般にツリーベースの処理には、いくつかの利点があります。まず、ツリーはメモリ内に永続的であるため、アプリケーションがデータと構造を変更できるように変更できます。また、SAX のような 1 回限りのプロセスではなく、いつでもツリーを上下に移動できます。 DOM の使用も非常に簡単です。
2) SAX
SAX 処理の利点は、ストリーミング メディアの利点と非常に似ています。すべてのデータが処理されるのを待つことなく、すぐに分析を開始できます。また、アプリケーションはデータの読み取り時にデータをチェックするだけなので、データをメモリに保存する必要はありません。これは、大きなドキュメントにとって大きな利点です。実際、アプリケーションはドキュメント全体を解析する必要さえなく、特定の条件が満たされた場合に解析を停止できます。一般に、SAX は、それに代わる DOM よりもはるかに高速です。
DOMかSAXを選びますか? XML ドキュメントを処理するために独自のコードを記述する必要がある開発者にとって、DOM または SAX 解析モデルの選択は非常に重要な設計上の決定です。 DOM はツリー構造を使用して XML ドキュメントにアクセスしますが、SAX はイベント モデルを使用します。
DOM パーサーは、XML ドキュメントをそのコンテンツを含むツリーに変換し、ツリーをトラバースできます。 DOM を使用してモデルを解析する利点は、開発者がツリー構築命令を呼び出すだけで済み、ナビゲーション API を使用して必要なツリー ノードにアクセスしてタスクを完了するだけで済むという点です。ツリー内の要素は簡単に追加および変更できます。ただし、DOM パーサーを使用する場合は XML ドキュメント全体を処理する必要があるため、特に大きな XML ファイルを処理する場合には、パフォーマンスとメモリの要件が比較的高くなります。 DOM パーサーは、そのトラバーサル機能により、XML ドキュメントを頻繁に変更する必要があるサービスでよく使用されます。
SAX パーサーはイベントベースのモデルを採用しており、XML ドキュメントを解析するときに一連のイベントをトリガーして、指定されたタグが見つかったことをメソッドに伝えることができます。 SAX では、開発者がどのタグを処理するかを決定できるため、通常、メモリ要件は低くなります。特に開発者がドキュメントに含まれるデータの一部のみを処理する必要がある場合、SAX のスケーラビリティがよりよく反映されます。ただし、SAX パーサーを使用する場合はコーディングがさらに難しくなり、同じドキュメント内の複数の異なるデータに同時にアクセスすることが困難になります。
3) JDOM http://www.jdom.org/
JDOM は、XML との対話を簡素化し、DOM を使用して実装するよりも高速な Java 固有のドキュメント モデルであることを目的としています。 JDOM は、最初の Java 固有のモデルになって以来、盛んに推進されてきました。最終的には、「Java 仕様要求 JSR-102」を通じて「Java 標準拡張」として使用することが検討されています。 JDOM の開発は 2000 年代初頭から始まりました。
JDOMとDOMには主に2つの違いがあります。まず、JDOM は具象クラスのみを使用し、インターフェイスは使用しません。これにより、API がいくつかの点で簡素化されますが、柔軟性も制限されます。第 2 に、API は Collections クラスを広範囲に利用しており、これらのクラスにすでに精通している Java 開発者にとっての使用が簡素化されています。
JDOMのドキュメントには、その目的は「20%(またはそれ以下)の労力を使って80%(またはそれ以上)のJava/XML問題を解決する」ことであると記載されています(学習曲線に基づいて20%を仮定)。 JDOM は確かにほとんどの Java/XML アプリケーションにとって便利であり、ほとんどの開発者は API の方が DOM よりもはるかに理解しやすいと感じています。 JDOM には、ユーザーが XML で意味をなさないことを行うことを防ぐために、プログラムの動作に関するかなり広範なチェックも含まれています。ただし、基本以上のことを実行するには (場合によってはエラーを理解することさえ)、XML を十分に理解する必要があります。これは、DOM や JDOM インターフェイスを学習するよりも有意義な作業かもしれません。
JDOM自体にはパーサーは含まれていません。通常、SAX2 パーサーを使用して入力 XML ドキュメントを解析および検証します (ただし、以前に構築された DOM 表現を入力として受け取ることもできます)。これには、JDOM 表現を SAX2 イベント ストリーム、DOM モデル、または XML テキスト ドキュメントに出力するコンバータが含まれています。 JDOM は、Apache ライセンスのバリアントに基づいてリリースされたオープン ソースです。
4) DOM4J http://dom4j.sourceforge.net/
DOM4J は完全に独立した開発結果を表しますが、当初は JDOM のインテリジェント フォークでした。これには、統合された XPath サポート、XML スキーマ サポート、大規模ドキュメントまたはストリーミング ドキュメントのイベントベースの処理など、基本的な XML ドキュメント表現を超える多くの機能が組み込まれています。また、DOM4J API および標準 DOM インターフェイスを介した並列アクセス機能を備えたドキュメント表現を構築するためのオプションも提供します。 2000 年後半から開発が進められてきました。
これらすべての機能をサポートするために、DOM4J はインターフェイスと抽象基本クラス メソッドを使用します。 DOM4J は API で Collections クラスを多用しますが、多くの場合、パフォーマンスの向上やより直接的なコーディング アプローチを可能にする代替手段も提供します。直接的な利点は、DOM4J はより複雑な API の代償を払っていますが、JDOM よりもはるかに優れた柔軟性を提供することです。
DOM4J の目標は、柔軟性、XPath 統合、大規模ドキュメントの処理を追加しながら、Java 開発者にとっての使いやすさと直感的な操作という JDOM の目標と同じです。また、JDOM よりも完全なソリューションとなることも目指しており、本質的にすべての Java/XML 問題を処理するという目標を達成します。その目標を達成しながら、アプリケーションの不正な動作の防止には JDOM ほど重点を置きません。
DOM4J は、優れたパフォーマンス、強力な機能、そして非常に使いやすい非常に優れた Java XML API であり、オープンソース ソフトウェアでもあります。最近では、XML の読み書きに DOM4J を使用する Java ソフトウェアが増えています。特に、Sun の JAXM も DOM4J を使用していることは注目に値します。
2.. 比較
1) DOM4J のパフォーマンスが最高であり、Sun の JAXM でさえ DOM4J を使用しています。現在、DOM4J は多くのオープンソース プロジェクトで広く使用されています。たとえば、有名な Hibernate も XML 設定ファイルを読み取るために DOM4J を使用しています。移植性を考慮しない場合は、DOM4J を使用してください。
2) JDOM と DOM はパフォーマンス テスト中にパフォーマンスが低下し、10M ドキュメントをテストするとメモリ オーバーフローが発生しました。小さなドキュメントの場合は、DOM と JDOM の使用を検討する価値があります。 JDOM の開発者は、正式リリース前にパフォーマンスの問題に重点を置く予定であると述べていますが、パフォーマンスの観点から見ると、実際には推奨できるものは何もありません。さらに、DOM は依然として非常に優れた選択肢です。 DOM 実装は、多くのプログラミング言語で広く使用されています。これは、他の多くの XML 関連標準の基礎でもあり、(非標準ベースの Java モデルとは対照的に) W3C によって公式に推奨されているため、特定の種類のプロジェクト (たとえば、 JavaScript の DOM)。
3) SAX のパフォーマンスが向上しますが、これはその特定の解析方法 (イベント駆動型) に依存します。 SAX は受信 XML ストリームを検出しますが、それをメモリにロードしません (もちろん、XML ストリームが読み取られるとき、一部のドキュメントはメモリ内に一時的に隠蔽されます)。
data_10k.xml

<?xml version="1.0" encoding="GB2312"?>
<RESULT>
	<VALUE>
		<NO>A1234</NO>
		<ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
	</VALUE>
	<VALUE>
		<NO>B1234</NO>
		<ADDR>四川省XX市XX乡XX村XX组</ADDR>
	</VALUE>
</RESULT>
ログイン後にコピー

Dom4j_xml.java

package com.ibm.xml;
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class Dom4j_xml {
	public static void main(String arge[]) {
		long lasting = System.currentTimeMillis();
		try {
			File f = new File("src/com/ibm/xml//data_10k.xml");
			SAXReader reader = new SAXReader();
			Document doc = reader.read(f);
			Element root = doc.getRootElement();
			Element foo;
			for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
				foo = (Element) i.next();
				System.out.print("车牌号码:" + foo.elementText("NO"));
				System.out.println("车主地址:" + foo.elementText("ADDR"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
ログイン後にコピー
JDom_xml.java
package com.ibm.xml;

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class JDom_xml {
	public static void main(String arge[]) {
		long lasting = System.currentTimeMillis();
		try {
			SAXBuilder builder = new SAXBuilder();
			Document doc = builder.build(new File(
					"src/com/ibm/xml//data_10k.xml"));
			Element foo = doc.getRootElement();
			List allChildren = foo.getChildren();
			for (int i = 0; i < allChildren.size(); i++) {
				System.out.print("车牌号码:"
						+ ((Element) allChildren.get(i)).getChild("NO")
								.getText());
				System.out.println("车主地址:"
						+ ((Element) allChildren.get(i)).getChild("ADDR")
								.getText());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
ログイン後にコピー
Dom_xml.java
package com.ibm.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Dom_xml {
	public static void main(String arge[]) {
		long lasting = System.currentTimeMillis();
		try {
			File f = new File("src/com/ibm/xml//data_10k.xml");
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse(f);
			NodeList nl = doc.getElementsByTagName("VALUE");
			for (int i = 0; i < nl.getLength(); i++) {
				System.out.print("车牌号码:"
						+ doc.getElementsByTagName("NO").item(i)
								.getFirstChild().getNodeValue());
				System.out.println("车主地址:"
						+ doc.getElementsByTagName("ADDR").item(i)
								.getFirstChild().getNodeValue());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
ログイン後にコピー
SAX_xml.java
package com.ibm.xml;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAX_xml extends DefaultHandler {
	java.util.Stack<String> tags = new java.util.Stack<String>();

	public SAX_xml() {
		super();
	}

	public static void main(String args[]) {
		long lasting = System.currentTimeMillis();
		try {
			SAXParserFactory sf = SAXParserFactory.newInstance();
			SAXParser sp = sf.newSAXParser();
			SAX_xml reader = new SAX_xml();
			sp.parse(new InputSource("src/com/ibm/xml//data_10k.xml"), reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("运行时间:" + (System.currentTimeMillis() - lasting)
				+ "毫秒");
	}

	public void characters(char ch[], int start, int length)
			throws SAXException {
		String tag = tags.peek();
		if (tag.equals("NO")) {
			System.out.print("车牌号码:" + new String(ch, start, length));
		}
		if (tag.equals("ADDR")) {
			System.out.println("地址:" + new String(ch, start, length));
		}
	}

	public void startElement(String uri, String localName, String qName,
			Attributes attrs) {
		tags.push(qName);
	}
}
ログイン後にコピー

以上がJava で XML ファイルを読み取る 4 つの方法と比較のためのコード例の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

Java をシンプルに: プログラミング能力を高める初心者向けガイド Java をシンプルに: プログラミング能力を高める初心者向けガイド Oct 11, 2024 pm 06:30 PM

Java をシンプルに: プログラミング能力の初心者向けガイド はじめに Java は、モバイル アプリケーションからエンタープライズ レベルのシステムに至るまで、あらゆるもので使用される強力なプログラミング言語です。初心者にとって、Java の構文はシンプルで理解しやすいため、プログラミングの学習に最適です。基本構文 Java は、クラスベースのオブジェクト指向プログラミング パラダイムを使用します。クラスは、関連するデータと動作をまとめて編成するテンプレートです。簡単な Java クラスの例を次に示します。 publicclassperson{privateStringname;privateintage;

See all articles