WebLogic XML Streaming API
SAX 2.0: The Simple API for XML
Document Object Model (DOM)
プ リ ケーシ ョ ンの開発
以降の節では、 Java プ ロ グ ラ ミ ング言語 と WebLogic Server を使用し て XML ア プ リ ケーシ ョ ン を開発する方法について説明し ます。 こ こ では、 Java サーブ レ ッ ト と JavaServer Pages (JSP) を使用し て Java アプ リ ケーシ ョ ン を記述する方 法について理解し てい る こ と を前提に し ています。 サーブレ ッ ト と JSP アプ リ ケーシ ョ ンの記述方法については、 『
WebLogic HTTP
サーブレ ッ ト プロ グ ラ マーズ ガ イ ド』 と 『WebLogic JSP
プ ロ グ ラ マーズ ガ イ ド』 を参照し て く だ さ い。
2-1
ページの 「XML アプ リ ケーシ ョ ンの開発 : 主な手順」
2-2
ページの 「XML ド キ ュ メ ン ト の解析」
2-10
ページの 「新し い XML ド キ ュ メ ン ト の生成」
2-13
ページの 「XML ド キ ュ メ ン ト の変換」XML アプ リ ケーシ ョ ンの開発 : 主な手順
WebLogic Server XML サブシ ステ ム を使用し て XML アプ リ ケーシ ョ ンを開発す
る場合、 通常は以下のプロ グ ラ ミ ング タ ス ク の一部ま たは全部を実行し ます。1. XML
ド キ ュ メ ン ト を解析し ます。XML
ド キ ュ メ ン ト は、 い く つかの ソ ースか ら構成さ れています。 た と えば、ク ラ イ アン ト か ら XML ド キ ュ メ ン ト を受信する サーブレ ッ ト を開発し、
サーブレ ッ ト ま たはその他の EJB な どか ら XML ド キ ュ メ ン ト を受信する
EJB
を記述で き ます。 各イ ン ス タ ン スで、 データ を操作で き る よ う に XMLド キ ュ メ ン ト を解析し てお く こ と も で き ます。
こ の タ ス ク の詳細については、
2-2 ページの 「XML ド キ ュ メ ン ト の解析」
を 参照し て く だ さ い。2.
新し い XML ド キ ュ メ ン ト を生成し ます。サーブレ ッ ト ま たは EJB が XML ド キ ュ メ ン ト を受信および解析し、 何 ら か の形でデータ を操作し た ら、 サーブレ ッ ト ま たは EJB は、 新し い XML ド キ ュ メ ン ト を生成し て ク ラ イ アン ト に返すか、 他の EJB に渡 さ なければな ら ない こ と があ り ます。
こ の タ ス ク の詳細については、
2-10 ページの 「新し い XML ド キ ュ メ ン ト の
生成」 を参照し て く だ さ い。3. XML
データ を他の形式に変換し ます。XML
ド キ ュ メ ン ト を解析するか、 新し い XML ド キ ュ メ ン ト を生成し た ら、サーブレ ッ ト ま たは EJB は、 その XML を HTML、 WML、 ま たはプレーン テキ ス ト などの形式に変換し なければな ら ない こ と があ り ます。
こ の タ ス ク の詳細については、
2-13
ページの 「JAXP に よ る XML データの 変換」 を参照し て く だ さ い。XML ド キ ュ メ ン ト の解析
こ の節では、JAXP に よ り DOM モー ド と SAX モー ド で XML ド キ ュ メ ン ト を解 析する方法、 およびサーブレ ッ ト か ら XML ド キ ュ メ ン ト を解析する方法につい て説明し ます。
注意:
WebLogic XML
ス ト リ ー ミ ング API に よ り XML ド キ ュ メ ン ト を解析す る方法の詳細については、第 4 章 「WebLogic XML Streaming API の使い 方」 を参照し て く だ さ い。前述の よ う に、 Administration Console の XML レ ジ ス ト リ を使用し て以下の項目 を コ ン フ ィ グ レーシ ョ ン し ます。
doctype
ご と のパーサ。 指定し た doctype の組み込みパーサの代わ り に使 用 さ れます。外部エンテ ィ テ ィ の解決。 XML ド キ ュ メ ン ト の解析中に外部フ ァ イ ルを 見つけ る よ う に要求さ れた場合に XML パーサが実行する処理です。
Administration Console
で こ れ ら の タ ス ク を実行する方法については、第 7 章「WebLogic Server XML の管理」 を参照し て く だ さ い。
SAX
モー ド に よ る XML ド キ ュ メ ン ト 解析の詳細なサンプルについては、WL_HOME\samples\server\src\examples\xml\saxデ ィ レ ク ト リ を参照し て く だ さ い。WL_HOMEは、 最上位 WebLogic Platform デ ィ レ ク ト リ です。
SAX モー ド で JAXP を使用し た XML ド キュ メ ン ト の解析
次の コー ド例は、 SAX パーサ フ ァ ク ト リ を コ ン フ ィ グ レーシ ョ ン し て検証パー サを作成する方法を示し た ものです。 ま た、MyHandler ク ラ ス をパーサに登録 する方法も示し てい ます。MyHandler
ク ラ スは、 SAX 解析イベン ト ま たはエ
ラーのカ ス タ ム動作を提供する ために DefaultHandlerク ラ スのあ ら ゆ る メ ソ ッ ド をオーバ ラ イ ド でき ます。
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
...
MyHandler handler = new MyHandler();
// MyHandler は org.xml.sax.helpers.DefaultHandler を拡張 //SAXParserFactory のインスタンスを取得
SAXParserFactory spf = SAXParserFactory.newInstance();
//検証パーサを指定
spf.setValidating(true); // DTD をロードする必要がある //ファクトリから SAX パーサのインスタンスを取得
SAXParser sp = spf.newSAXParser();
//ドキュメントを解析
sp.parse("http://server/file.xml", handler);
...
注意: 組み込みパーサ以外のパーサを使用する場合は、 WebLogic Server
Administration Console
を使用し て XML レ ジ ス ト リ でパーサを指定し ま す。 指定し なかった場合、SaxParserFactory.newInstance メ ソ ッ ド は 組み込みパーサを返し ます。 組み込みパーサ以外のパーサを使用するWebLogic Server
の コ ン フ ィ グ レーシ ョ ン手順については、7-5
ページの「組み込み以外のパーサま たは ト ラ ン ス フ ォーマの コ ン フ ィ グ レーシ ョ ン」 を参照し て く だ さ い。
SAX
モー ド に よ る XML ド キ ュ メ ン ト 解析の詳細なサンプルについては、WL_HOME\samples\server\src\examples\xml\saxデ ィ レ ク ト リ を参照し て く だ さ い。WL_HOMEは、 最上位 WebLogic Platform デ ィ レ ク ト リ です。
DOM モー ド で JAXP を使用し た XML ド キュ メ ン ト の解析
次の コー ド例では、 XML ド キ ュ メ ン ト を解析し、DocumentBuilderオブジ ェ ク ト か ら org.w3c.dom.Documentツ リ ーを作成する方法を示し ます。
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
...
//DocumentBuilderFactory のインスタンスを取得 DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
//検証パーサを指定
dbf.setValidating(true); // DTD をロードする必要がある //ファクトリから DocumentBuilder のインスタンスを取得 DocumentBuilder db = dbf.newDocumentBuilder();
//ドキュメントを解析
Document doc = db.parse(inputFile);
...
注意: 組み込みパーサ以外のパーサを使用する場合は、 WebLogic Server
Administration Console
でパーサを指定し ます。 指定し なかった場合、DocumentBuilderFactory.newInstance メ ソ ッ ド は組み込みパーサを 返し ます。 組み込みパーサ以外のパーサを使用する WebLogic Server の コ ン フ ィ グ レーシ ョ ン手順については、
7-5 ページの 「組み込み以外の
パーサ または ト ラ ン ス フ ォーマの コ ン フ ィ グ レーシ ョ ン」 を参照し て く だ さ い。DOM
モー ド に よ る XML ド キ ュ メ ン ト 解析の詳細なサンプルについては、WL_HOME\samples\server\src\examples\xml\domデ ィ レ ク ト リ を参照し て く だ さ い。WL_HOMEは、 最上位 WebLogic Platform デ ィ レ ク ト リ です。
サーブレ ッ ト での XML ド キュ メ ン ト の解析
Java サーブレ ッ ト 仕様バージ ョ ン 2.2 で、
setAttribute メ ソ ッ ド とgetAttribute メ ソ ッ ド に対する サポー ト が追加 さ れま し た。 属性は、 リ ク エス ト に関連付け られたオブジ ェ ク ト です。 リ ク エス ト オブジ ェ ク ト は、 ク ラ イ ア ン ト リ ク エス ト か ら の全情報を カプセル化し ます。 HTTP プ ロ ト コルでは、 こ の情報は、 リ ク エス ト の HTTP ヘ ッ ダ と メ ッ セージ本文を基に ク ラ イ アン ト か
ら サーバに転送 さ れます。
WebLogic Server
では、setAttribute メ ソ ッ ド と getAttribute メ ソ ッ ド を使 用し て XML ド キ ュ メ ン ト を解析でき ます。SAX モー ド 解析には setAttributeメ ソ ッ ド を使用し、 DOM モー ド 解析には getAttribute メ ソ ッ ド を使用し ま す。
org.xml.sax.DefaultHandler 属性を使用し た ド キュ メ ン ト の 解析
次のサンプル コー ドでは、setAttribute メ ソ ッ ドの使い方を示し ます。
import weblogic.servlet.XMLProcessingException;
import org.xml.sax.helpers.DefaultHandler;
...
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
request.setAttribute("org.xml.sax.helpers.DefaultHandler", new DefaultHandler());
} catch(XMLProcessingException xpe) {
System.out.println("Error in processing XML");
xpe.printStackTrace();
return;
} ...
ま た、 現在は非推奨 と なっ てい る も のの、org.xml.sax.HandlerBase
属性を使
用し て XML ド キ ュ メ ン ト を解析する こ と も でき ます。request.setAttribute("org.xml.sax.HandlerBase", new HandlerBase());
注意: こ のサンプル コー ドは、 SAX と setAttribute メ ソ ッ ド で ド キ ュ メ ン ト を解析する単純な方法を示し た も のです。 ドキ ュ メ ン ト を解析する こ の メ ソ ッ ドは、 他のサーブレ ッ ト ベンダではサポー ト さ れていない
WebLogic Server の便利な機能です。 し たがって、 アプ リ ケーシ ョ ン を他
のサーブレ ッ ト プ ラ ッ ト フ ォームで実行する場合は、 こ の機能を使用し ないで く だ さ い。org.w3c.dom.Document 属性を使用し た ド キュ メ ン ト の解析
次のサンプル コー ドでは、getAttribute メ ソ ッ ドの使い方を示し ます。
import org.w3c.dom.Document;
import weblogic.servlet.XMLProcessingException;
...
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
try {
Document doc = request.getAttribute("org.w3c.dom.Document");
} catch(XMLProcessingException xpe) {
System.out.println("Error in processing XML");
xpe.printStackTrace();
return;
} ...
注意: こ のサンプル コー ドは、 DOM と getAttribute メ ソ ッ ド で ド キ ュ メ ン ト を解析する単純な方法を示し た も のです。 ドキ ュ メ ン ト を解析する こ の メ ソ ッ ドは、 他のサーブレ ッ ト ベンダではサポー ト さ れていない
WebLogic Server
の便利な機能です。 し たがって、 アプ リ ケーシ ョ ン を他 のサーブレ ッ ト プ ラ ッ ト フ ォームで実行する場合は、 こ の機能を使用し ないで く だ さ い。非検証パーサの検証
前述の と お り 、 整形式 ドキ ュ メ ン ト は、 W3C の XML 1.0 勧告のルールに従っ て い る、 構文的に正し い ド キ ュ メ ン ト の こ と です。 有効な ド キ ュ メ ン ト は、 DTD ま たはス キーマで指定し た制約に従っている ドキ ュ メ ン ト です。
非検証パーサは、 ドキ ュ メ ン ト が整形式かど う かを検証し ますが、 有効かど う か は検証し ません。
2-10 ページの 「WebLogic FastParser の使用」
で説明し てい るWebLogic FastParser
は、 非検証パーサです。(
検証パーサの使用を前提に ) ド キ ュ メ ン ト 解析時の検証を有効にするには、 以 下を実行する必要があ り ます。以下の例で示すよ う に、SAXParserFactory.setValidating() メ ソ ッ ド を
true
に設定し ます。SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
解析する XML ド キ ュ メ ン ト で、 ( イ ン ラ イ ン ま たは参照で ) DTD ま たはス キーマが定義さ れてい る よ う に し ます。
XML ド キュ メ ン ト 解析時のエンテ ィ テ ィ 解決の処 理
こ の節では、 XML パーサに よ る外部エンテ ィ テ ィ の識別および解決方法、 およ び XML アプ リ ケーシ ョ ンに よ る外部エンテ ィ テ ィ 解決のパフ ォーマン ス を向上
させる WebLogic Server の機能など、 外部エンテ ィ テ ィ に関する一般的な情報に ついて説明し ます。
XML
ド キ ュ メ ン ト を解析し なが ら外部エンテ ィ テ ィ を解決する場合の詳細なサ ンプルについては、WL_HOME\samples\server\src\examples\xml\entityresolutionデ ィ レ ク ト リ を参照し て く だ さ い。WL_HOMEは、 最上位 WebLogic Platform デ ィ レ ク ト リ で す。
外部エンテ ィ テ ィ に関する一般的な情報
外部エンテ ィ テ ィ は、 XML ドキ ュ メ ン ト 内に記述さ れていない も のの、 XML ド キ ュ メ ン ト 内で参照 さ れる さ ま ざ ま なテキ ス ト です。 実際のテキ ス ト は、 同じ コ ン ピ ュータの他のフ ァ イル、 Web 上な ど、 ど こ にあ っ て も かまいません。
パーサは、 ドキ ュ メ ン ト の解析時に外部エンテ ィ テ ィ 参照に出会 う と 、 参照 さ れ たテキ ス ト を フ ェ ッ チし、 テキ ス ト を XML ド キ ュ メ ン ト 内に配置し てか ら、 解