デベロッパーズコーナー:Javaプログラミングを極める「JAXP」
2002年08月14日作成
Javaプログラミングを極める
第1回:JAXP
(株)日本ユニテック
太田 純
<この記事はDigital
Xpress 2002 Vol.7(2-3月号)に掲載されたものです>
本連載では、Javaを使用してシステムを組んでいくために役立つ情報をお届けしていきます。今回はJavaでXMLを扱う際に欠かせないJAXPについて取り上げます。 |
Java API for XML Processing (JAXP) は、XMLプロセッサの種類によらずにXMLデータを処理する目的でSun
Microsystemsが発表したAPIです。XMLを利用するためにはDOM、SAXなどの共通APIがありますが、JAXPはこれらの共通APIを使用するための入口を提供するものとなります。また、XSLTを処理するためのAPIも提供しています。JAXPをサポートするXMLプロセッサなら、開発者はプログラムを変更せずにXML
プロセッサを切り替えることができます。
JAXPについての詳細な情報はSun Microsystemsのサイト http://java.sun.com/xml/jaxp/
から得ることができます。JAXPは、Java 2 SDK Standard Edition 1.4(J2SE 1.4、執筆時点ではβ3段階)、およびJava
2 SDK Enterprise Edition 1.3(J2EE 1.3)に含まれている機能です。XMLを使用するためのコンポーネント群を収めたJava
XML Packというものがあり、XML関連の他のコンポーネントと共にダウンロードすることもできます。以上のSDKやJava
XML Packには、JAXPに対応したXMLプロセッサが同梱されており、セットアップすると別途XMLプロセッサを入手しなくても使用できるようになります。同梱されているXMLプロセッサはバージョンによって異なりますが、J2SE
1.4β3、J2EE 1.3、Java XML Pack Fall 01 ReleaseではSunのXMLプロセッサであるCrimson、Java
XML Pack Winter 01 ReleaseではApache Xerces Java 2 Parserです。もちろん、JAXPはXMLプロセッサに非依存の機能を提供するものですから、同梱されたプロセッサを使わなければならないわけではありません。
JAXPでSAXを扱う
JAXPでSAXを扱うために使用するインターフェイスはSAXParserとSAXParserFactoryです。SAXParserはSAX
2.0のXMLReaderインターフェイスとSAX 1.0のParserインターフェイスの両方をラップするものです。SAXParserFactoryはSAXParser実装クラスのオブジェクトを作成するためのインターフェイスです。プログラムを作成するときは、
1. SAXParserFactory実装クラスのオブジェクトを取得
2. 取得したSAXParserFactoryにSAXParserを作ってもらう
3. 作成したSAXParserを使用してXMLデータを読み込む
という手順で記述します。リスト1を参照してください。SAXParserFactory実装クラスのオブジェクトは、SAXParserFactoryのstaticメソッドであるnewInstance()を使用して取得します。newInstanceメソッド内部では、以下の順序でロードすべきSAXParserFactory実装クラスが決定されます。
□javax.xml.parsers.SAXParserFactory システムプロパティ。
□ JREディレクトリにあるプロパティファイル「lib/jaxp.properties」。
□ 実行時に使用可能なjarファイル中にある「META-INF/services/javax.xml.parsers.SAXParserFactory」で示されたクラス名。
□ プラットフォームのデフォルトSAXParserFactoryインスタンス。
JAXPでDOMを扱う
JAXPでDOMを扱うために使用するインターフェイスはDocumentBuilderとDocumentBuilderFactoryです。DocumentBuilderはDOMのDocumentオブジェクトを生成するXMLプロセッサを表すインターフェイスです。DocumentBuilderFactoryはDocumentBuilder実装クラスのオブジェクトを作成するためのインターフェイスです。プログラムを作成するときは、
1. DocumentBuilderFactory実装クラスのオブジェクトを取得
2. 取得したDocumentBuilderFactoryにDocumentBuilderを作ってもらう
3. 作成したDocumentBuilderを使用してXMLデータを読み込む
という手順で記述します。リスト2を参照してください。DocumentBuilderFactory実装クラスのオブジェクトは、DocumentBuilderFactoryのstaticメソッドであるnewInstance()を使用して取得します。newInstanceメソッド内部では、以下の順序でロードすべきDocumentBuilderFactory実装クラスが決定されます。
□javax.xml.parsers.DocumentBuilderFactoryシステムプロパティ。
□JREディレクトリにあるプロパティファイル「lib/jaxp.properties」。
□実行時に使用可能なjarファイル中にある「META-INF/services/javax.xml.parsers.DocumentBuilderFactory」で示されたクラス名。
□プラットフォームのデフォルトDocumentBuilderFactoryインスタンス。
XMLプロセッサを切り替える
SAXParserを切り替えるために実行時にシステムプロパティを指定する場合、-Dオプションを使用して以下のように行います。ここではCrimsonを使用するように設定する例を示します。
java -Djavax.xml.parsers.SAXParserFactor
y=org.apache.crimson.jaxp.SAXParserFactoryImpl SAXTest |
同様にして、DocumentBuilderを切り替えるには、以下のように行います。
java -Djavax.xml.parsers.DocumentBuilderFactor
y=org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
DOMTest |
lib/jaxp.propertiesファイルを使用する場合は、以下のように記述します。
javax.xml.parsers.SAXParserFactory = org.apache.crimson.jaxp.SAXParserFactoryImpl
javax.xml.parsers.DocumentBuilderFactory = org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
javax.xml.transform.TransformerFactory = org.apache.xalan.processor.TransformerFactoryImpl |
この場合、必ずSAXParserFactory、DocumentBuilderFactory、TransformerFactory(注1)の3つの設定のすべてを書き込むようにしてください。デフォルトの設定のままでよいものがあったとしても、記述されていないものがあると、記述されていないFactoryを使用するときに例外が発生します。
jaxp.propertiesファイルを置くべきディレクトリがJREの下のlibであることにも注意してください。たとえば、Java
2 SDKを配置したディレクトリが「C:\JAVA\j2sdk1.4.0」である場合、jaxp.propertiesファイルを置く場所は「C:\JAVA\j2sdk1.4.0\jre\lib」です。「C:\JAVA\j2sdk1.4.0\lib」ではありません。
JAXP環境を確認する
JAXPがデフォルトで使用するXMLプロセッサを確認する方法をご紹介します。リスト3をご覧ください。DocumentBuilderFactory、DocumentBuilder、SAXParserFactory、SAXParserを取得し、クラス名を表示させることで現在のJAXP環境を確認することができます。Crimson環境、およびXerces環境で実行させた場合の実行結果をリスト4およびリスト5に挙げます。ここに示したクラス名は、システムプロパティ値、あるいはlib/jaxp.propertiesに記述するクラス名として使用できます。
まとめ
今回はJAXPを使用するための最も基本的な部分とXMLプロセッサを切り替えて使用する方法について扱いました。リスト1およびリスト2に挙げた短いコーディングは単にXMLファイルを読み込むだけでそれ以上の何もしないプログラムですが、これを保存しておけばそのままあらゆるXMLアプリケーションを作成するための出発点として用いることができます。次回はXSLTを使用する方法について扱い、第3回以降にJavaを使用したシステムにおいてこの基本形をどのように展開できるか考えていく予定です。
リスト1 SAXTest.java
// SAXTest.java
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class SAXTest extends DefaultHandler {
public static void main (String[]
args) {
try {
SAXParserFactory spfactory = SAXParserFactory.newInstance();
SAXParser parser = spfactory.newSAXParser();
parser.parse(args[0], new SAXTest());
System.out.println("Normal End.");
} catch(Exception e) {
e.printStackTrace();
}
}
} |
リスト2 DOMTest.java
// DOMTest.java
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.w3c.dom.*;
public class DOMTest {
public static void main (String[] args) {
try {
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbfactory.newDocumentBuilder();
Document d = builder.parse(args[0]);
System.out.println("Normal End.");
} catch(Exception e) {
e.printStackTrace();
}
}
} |
リスト3 JAXPTest.java
// JAXPTest.java
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;
public class JAXPTest {
public static void main (String[] args) {
try {
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
System.out.println("DocumentBuilderFactory = "
+ dbfactory.getClass().getName());
DocumentBuilder builder = dbfactory.newDocumentBuilder();
System.out.println("DocumentBuilder = " + builder.getClass().getName());
SAXParserFactory spfactory = SAXParserFactory.newInstance();
System.out.println("SAXParserFactory = " + spfactory.getClass().getName());
SAXParser parser = spfactory.newSAXParser();
System.out.println("SAXParser = " + parser.getClass().getName());
} catch(Exception e) {
e.printStackTrace();
}
}
} |
リスト4 JAXPTest実行結果(Crimson環境の場合)
C:\sample>java JAXPTest
DocumentBuilderFactory = org.apache.crimson.jaxp.DocumentBuilderFactoryImpl
DocumentBuilder = org.apache.crimson.jaxp.DocumentBuilderImpl
SAXParserFactory = org.apache.crimson.jaxp.SAXParserFactoryImpl
SAXParser = org.apache.crimson.jaxp.SAXParserImpl |
リスト5 JAXPTest実行結果(Xerces環境の場合)
C:\sample>java JAXPTest
DocumentBuilderFactory = org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
DocumentBuilder = org.apache.xerces.jaxp.DocumentBuilderImpl
SAXParserFactory = org.apache.xerces.jaxp.SAXParserFactoryImpl
SAXParser = org.apache.xerces.jaxp.SAXParserImpl |
(注1) TransformerFactoryは、XSLTを使用するためのインターフェイスです。これについては、次回で扱う予定です。
関連サービス
IT技術およびIT製品の可用性調査・検証業務