JAXP

JAXP(Java API for XML Parsing)
XMLドキュメントをParsing(解析)するためのJavaのAPI

JAXP 1.0は SAX 1.0とDOM level1をサポート

特徴
「Plugability」であること
JAXP 1.1で
Java API for XML Processingに変更され
XMLドキュメントをParsingするためのもの
から
XMLドキュメントをProcessing(処理)するためのもの
になっている
これは
XSLTのAPIが付け加わったため

JAXP1.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のインターフェイスを介することによってパーサの実装を選択できる
ゆうこと

SAXやDOMの仕様に準拠しているパーサ(JAXP標準のパーサ, Xerces, Xalan等)ならば
抽象的なjavax.xml.parsersとjavax.xml.transform APIを通して使用できる

■SAX
(ref: http://megginson.com/SAX/)
JAXPでのSAXについて

SAXPaserインスタンス取得手順
1. SAXParserFactoryクラスのstaticメソッドのnewInstanceで SAXPaserFactoryインスタンスを獲得
2. SAXPaserFactoryインスタンスからSAXPaserを生成

SAXParserFactory=「plugability」を実現する部分

SAXParserFactory#newInstanceでは
↓のようにしてインスタンスを特定している
1. javax.xml.parsers.SAXParserFactory システムプロパティを使う
2. JRE ディレクトリ中のプロパティファイル lib/jaxp.propertiesを使う
このファイルの中に上記のシステムプロパティのキーと、バリューとなる SAX パーサの実装クラスを記述する
3. Service API を使う。Jar ファイル中のWEB-INF/services/javax.xml.parsers.parsers.SAXParserFactoryファイルに記述されているクラスを使う
4. デフォルトのSAXParserFactoryインスタンスを使用する


↓SAXParser作成サンプル

// SAXTest.java

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;

public class SAXTest {
public static void main (String[] args) {
// どの Factory インスタンスを使用するのかを表示
System.out.println(System.getProperty(
"javax.xml.parsers.SAXParserFactory"));

try {
// SAXParserFactory インスタンスを取得
SAXParserFactory factory =
SAXParserFactory.newInstance();

// デフォルトのイベントハンドラを作成
DefaultHandler handler = new MyHandler();

// SAXParser を取得
SAXParser parser = factory.newSAXParser();

// myHandler を用いて parse する
parser.parse(new InputSource(args[0]), handler);
}
catch (SAXException e) {
System.out.println("SAXException");
}
catch (IOException e) {
System.out.println("IOException");
}
catch (ParserConfigurationException e) {
System.out.println("ParserConfigurationException");
}
}
}

class MyHandler extends DefaultHandler {
public void startElement (String uri,
String name,
String qName,
Attributes atts) {
System.out.println("Start Element : " + name);
}

public void endElement (String uri,
String name,
String qName) {
System.out.println("End Element : " + name);
}
}

デフォルトのパーサの代わりにXercesのパーサを使用する場合
実行引数に指定すれば ソースに変更はない
java -Djavax.xml.parsers.SAXParserFactory=
org.apache.xerces.jaxp.SAXPaserFactoryImpl SAXTest xml_file


■DOM
(ref: http://www.w3.org/DOM/)
org.w3c.dom.Documentオブジェクトを得るために
DOMの実装をラップしたDocumentBuilderを使用する

DocumentBuilderインスタンス作成手順
1. DocumentBuilderFactoryクラスのstaticメソッドのnewInstanceでDocumentBuilderFactoryインスタンスを取得する
2. その獲得したDocumentBuilderFactoryインスタンスからDoucumentBuilderを作成する

DocumentBuilderFactory#newInstanceは
以下順序でDocumentBuilderFactoryを決定する
1. javax.xml.parsers.DocumentBuilderFactoryシステムプロパティを使う
2. JRE ディレクトリ中のプロパティファイル lib/jaxp.properties
を使う
このファイルの中に上記のシステムプロパティのキーと バリューとなるDOM パーサの実装クラスを記述する
3. Service API を使う
Jar ファイル中のWEB-INF/services/javax.xml.parsers.parsers.DocumentBuilderFactoryファイルに記述されているクラスを使う
4. デフォルトのDocumentBuiderFactoryインスタンスを使用する

サンプル↓
// DOMTest.java

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;

public class DOMTest {
public static void main (String[] args) {
// どの Factory インスタンスを使用するのかを表示
System.out.println(System.getProperty(
"javax.xml.parsers.DocumentBuilderFactory"));

try {
// DocumentBuilderFactory インスタンスを取得
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();

// DocumentBuilder を取得
DocumentBuilder builder =
factory.newDocumentBuilder();

// DocumentBuilder を用いて Document オブジェクトを取得
Document doc =
builder.parse(new InputSource(args[0]));

// ルートノードのタグ名を表示
System.out.println(
doc.getDocumentElement().getTagName());
}
catch (SAXException e) {
System.out.println("SAXException");
}
catch (IOException e) {
System.out.println("IOException");
}
catch (ParserConfigurationException e) {
System.out.println(
"ParserConfigurationException");
}
}
}

システムプロパティにxercesのDOMパーサを指定すれば
xercesのDOMパーサを変更できる
java -Djavax.xml.parsers.DocumentBuilderFactory=
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl


■XSLT
(ref: http://www.w3.org/TR/1999/REC-xslt-19991116)
JAXPでXSLTを行うにはjavax.xml.transform.Transformerクラスを使う
SAXやDOMのと同様
TransformerFactoryクラスからTransformerインスタンスを取得する

1. TransformerFactoryクラスの static
メソッドのnewInstanceによってTransformerFactoryインスタンスを取得する
2. その獲得したTransformerFactoryインスタンスに XSLT が記述されたスタイルシートをセットする
3. そのスタイルシートをもとにしたTransformerインスタンスを取得する

XSLTもPlugabilityを確保する
TransformerFactoryクラスの
newInstanceメソッドは以下の順序でインスタンスを決定する

1. DocumentBuilderFactoryクラスのstaticメソッドのnewInstanceによってDocumentBuilderFactoryインスタンスを取得する
2. その獲得したDocumentBuilderFactoryインスタンスからDoucumentBuilderを作成する

DocumentBuilderFactoryクラスのnewInstanceメソッドは以下の順序でDocumentBuilderFactoryを決定する。

1. javax.xml.transformer.TransformerFactoryシステムプロパティを使う
2. JREディレクトリ中のプロパティファイル lib/jaxp.properties
を使う。このファイルの中に上記のシステムプロパティのキーと、バリューとなる実装クラスを記述する
3. Service API を使う
Jar ファイル中の
WEB-INF/services/javax.xml.transformer.TransformerFactoryファイルに記述されているクラスを使う
4. デフォルトのDocumentBuilderFactoryインスタンスを使用する


サンプルコード
// XSLTTest.java

import java.io.*;
import java.util.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

class XSLTTest {
public static void main(String args[]) {//第1引数はXSLTをかけたいXMLドキュメントで 第2引数はXSLTが記述されたスタイルシート
try {
// TransfomerFactory インスタンスの取得
TransformerFactory factory =
TransformerFactory.newInstance();

// XSL をセット
StreamSource xslsrc =
new StreamSource(new FileInputStream(args[1]));

// セットされた XSL から Transformar を取得
Transformer transformer =
factory.newTransformer(xslsrc);

// 出力のエンコーディングをシフト JIS にセット
transformer.setOutputProperties(new Properties() {
{
setProperty("encoding", "Shift_JIS");
}
});

// XSLT をかける XML をセット
StreamSource xmlsrc = new StreamSource(
new FileInputStream(args[0]));

// XSLT をかけ,出力を標準出力に
transformer.transform(
xmlsrc, new StreamResult(System.out));

}
catch (TransformerException e) {
System.out.println("TransformerException");
}
catch (IOException e) {
System.out.println("IOException");
}
}
}


ref:
Javaを紐解くための重点キーワード:JAXP
http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey04.html

tag : JAXP

2009-10-25 14:19 : __lang__xml : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud