Javaを紐解くための重点キーワード
吉田哲也
アプレッソ
2001/7/6
JAXP(Java API for XML Parsing) |
■JAXPとは?
JAXP 1.0は、JCP(Java Community Process)にJSR#005として提出されたものが最終仕様として公開されたものだ。JAXP 1.0はJava API for XML Parsingの略で、XMLドキュメントをParsing(解析)するためのJavaのAPIである。
JAXP 1.0はSAX 1.0、DOM level1をサポートしている。JAXP の特徴は、「Plugability」という言葉に集約される。この「Plugability」については後述する。また、JAXP 1.1はJCP にJSR#063として提出され、最終仕様として2001年2 月12日に公開された。JAXP 1.1はJava API for XML Processingという名称に変更になり、XML ドキュメントをParsing するためのものからProcessing(処理)するためのものになっている。これは、XSLTのAPIが付け加わったからで、これがJAXP 1.0とJAXP 1.1の最大の違いだ。主な違いを以下に示す。
- XSLT 1.0 のサポート
- SAX 2.0 のサポート
- DOM Level2 のサポート
また、JAXP 1.1の参照実装(Reference Implementation)は、デフォルトでは、SAX、DOMのパーサはSun MicrosystemsのProject Xから派生したCrimsonを使用し、XSLT エンジンはXalan を使用している。
■JAXPの Plugability
JAXPはバージョン1.0のときから「Plugability」ということに重点を置いている。アプリケーションからはJAXPのインターフェイスを介することによってパーサの実装を選択できるということだ(図1)。
図1 JAXPインターフェイスを介することで、パーさを自由に選択できる |
SAXやDOMの仕様に準拠しているパーサ(JAXP標準のパーサやXercesやXalanなど)ならば、抽象的なjavax.xml.parsersとjavax.xml.transform APIを通して使用することができる。
■SAX
SAX自体についての説明は、http://megginson.com/SAX/を参照してほしい。ここでは JAXPでのSAXについて説明する。SAXPaserのインスタンスを得る手順は以下のようになる。
- SAXParserFactoryクラスのstaticメソッドのnewInstanceによって、SAXPaserFactoryインスタンスを獲得する
- その獲得したSAXPaserFactoryインスタンスからSAXPaserを作る
SAXParserFactoryクラスのnewInstanceメソッドは以下の順序で SAXParserFactoryを決定する。この部分が「plugability」を実現する部分だ。
- javax.xml.parsers.SAXParserFactory システムプロパティを使う
- JRE ディレクトリ中のプロパティファイル lib/jaxp.properties を使う。このファイルの中に上記のシステムプロパティのキーと、バリューとなる
SAX パーサの実装クラスを記述する
- Service API を使う。Jar ファイル中の WEB-INF/services/javax.xml.parsers.parsers.SAXParserFactoryファイルに記述されているクラスを使う
- デフォルトのSAXParserFactoryインスタンスを使用する
以下にSAXParserを作成するサンプルプログラムを示す。XMLファイルの中の開始タグの名前と終了タグの名前を表示する。第1引数にはパースしたいXMLファイルを指定する。
// SAXTest.java import javax.xml.parsers.*; public class SAXTest { |
上記の例ではデフォルトのパーサを使用しているが、以下のように起動するとコードの変更なしにXercesのパーサを使用できる。
java -Djavax.xml.parsers.SAXParserFactory= |
■DOM
DOM自体の説明についてはW3Cのページなどを参照してほしい(http://www.w3.org/DOM/)。
DOMのパーサについてもSAXのときと同様だ。org.w3c.dom.Documentオブジェクトを得るためにDOMの実装をラップしたDocumentBuilderを使用する。そのDocumentBuilderのインスタンスを作成する手順は以下のようになる。
- DocumentBuilderFactoryクラスのstaticメソッドのnewInstance によってDocumentBuilderFactoryインスタンスを取得する
- その獲得したDocumentBuilderFactoryインスタンスからDoucumentBuilderを作成する
DocumentBuilderFactoryクラスのnewInstanceメソッドは以下の順序でDocumentBuilderFactoryを決定する。
- javax.xml.parsers.DocumentBuilderFactoryシステムプロパティを使う
- JRE ディレクトリ中のプロパティファイル lib/jaxp.properties を使う。このファイルの中に上記のシステムプロパティのキーと、バリューとなるDOM
パーサの実装クラスを記述する
- Service API を使う。Jar ファイル中の WEB-INF/services/javax.xml.parsers.parsers.DocumentBuilderFactory
ファイルに
記述されているクラスを使う
- デフォルトのDocumentBuiderFactoryインスタンスを使用する
ここでも簡単なサンプルプログラムを示す。このサンプルプログラムは単にルートノードのタグ名を表示するだけのプログラムである。第1引数にはパースしたい XML ファイルを指定する。
// DOMTest.java
public class DOMTest { |
もちろんこの例でも、コードの変更なしにxercesのパーサを使用できる。システムプロパティにxercesのDOMパーサを設定している。
java -Djavax.xml.parsers.DocumentBuilderFactory= |
■XSLT
XSLTについても仕様は
http://www.w3.org/TR/1999/REC-xslt-19991116を参照してほしい。JAXPにおいてXSLTを行うにはjavax.xml.transform.Transformerクラスを使う。SAXやDOMのときと同じようにTransformerインスタンスを取得するためにTransformerFactoryクラスから取得する。手順は以下のとおりだ。
- TransformerFactoryクラスの static メソッドのnewInstanceによってTransformerFactoryインスタンスを取得する
- その獲得したTransformerFactoryインスタンスに XSLT が記述されたスタイルシートをセットする
- そのスタイルシートをもとにしたTransformerインスタンスを取得する
XSLTについてもPlugabilityを確保する。TransformerFactoryクラスの newInstanceメソッドは以下の順序でインスタンスを決定する。
- DocumentBuilderFactoryクラスのstaticメソッドのnewInstanceによってDocumentBuilderFactoryインスタンスを取得する
- その獲得したDocumentBuilderFactoryインスタンスからDoucumentBuilderを作成する
DocumentBuilderFactoryクラスのnewInstanceメソッドは以下の順序でDocumentBuilderFactoryを決定する。
- javax.xml.transformer.TransformerFactoryシステムプロパティを使う
- JREディレクトリ中のプロパティファイル lib/jaxp.properties を使う。このファイルの中に上記のシステムプロパティのキーと、バリューとなる実装クラスを記述する。
- Service API を使う。Jar ファイル中の WEB-INF/services/javax.xml.transformer.TransformerFactory
ファイルに記述されているクラスを使う
- デフォルトのDocumentBuilderFactoryインスタンスを使用する
以下に簡単な XSLT を行うサンプルプログラムを示す。このサンプルプログラムは第1引数にXSLTをかけたいXML ドキュメント、第2引数にXSLTが記述されたスタイルシートを取る。そしてその結果を標準出力に出力する。
// XSLTTest.java
|
JAXP 1.1において、SAXパーサやDOMパーサ、XSLTエンジンをどのように作成するのかに重点をおいて説明した。JAXP 1.1はここに述べた限りではない。しかし、ここに述べた内容は、JAXPを使用する場合には確実に必要となる。
Javaを紐解くための重点キーワード |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|