この章の内容は次のとおりです。
この項の内容は次のとおりです。
この章では、次の内容を十分に理解していると想定します。
XML Pipeline Definition Language: このXML言語を使用すると、XMLリソース間の処理リレーションを記述できます。Pipeline Definition Languageの詳しい説明が必要な場合は、「はじめに」の「関連ドキュメント」にあるXMLの資料を参照してください。
Document Object Model(DOM): DOMは、XML文書の構造を示すメモリー内ツリー表現です。
Simple API for XML(SAX): SAXは、イベントベースのXML解析の標準です。
XML Schema言語: 概要および関連資料へのリンクは、第7章「Schema Processor for Javaの使用」を参照してください。
Oracle XML Pipeline Processorは、W3CノートのXML Pipeline Definition Languageバージョン1.0に基づいています。W3Cノートでは、APIではなくXML言語を定義しています。パイプライン仕様は次のURLにあります。
http://www.w3.org/TR/xml-pipeline/
「XDK for JavaのためのPipeline Definition Language標準」で、Oracle XDKでのOracle XML Pipeline Processorの実装とW3Cノートとの違いについて説明します。
Oracle XML Pipeline Processorは、XML Pipeline Definition Languageに基づいています。入力XMLパイプライン文書を受け取り、派生した依存性に基づいてパイプライン・プロセスを実行できます。XMLで記述されるパイプライン文書は、実行するプロセスを宣言方式で指定します。パイプライン文書中に<processdef/>
要素を使用して、Javaクラスをプロセスに関連付けることができます。
Pipeline Processorはマルチステージ処理に使用します。マルチステージ処理は、XMLコンポーネントを順次またはパラレルに処理するときに発生します。ある処理ステージの出力を別の処理ステージの入力にすることができます。プロセスの入力と出力を定義するパイプライン文書を記述できます。図9-1に、可能なパイプライン・シーケンスを示します。
XML Pipeline Processorに加えて、XDKにはパイプライン文書内で連結できるプロセス用のAPIが提供されています。表9-2に、oracle.xml.pipeline.processes
パッケージで提供されているクラスの概要を示します。
パイプラインでの一般的なXML処理ステージは次のとおりです。
入力XML文書を解析します。oracle.xml.pipeline.processes
パッケージには、DOM解析用のDOMParserProcess
と、SAX解析用のSAXParserProcess
が含まれます。
入力XML文書を検証します。
入力文書をシリアライズまたは変換します。Pipeline Processorを使用してSAXパーサーをXSLTプロセッサに接続することはできません。XSLTプロセッサにはDOMが必要です。
マルチステージ処理において、大規模なXML文書のフィルタ処理と検索にはSAXが最適です。XMLコンテンツを変更する場合、またはコンテンツに効率的な動的アクセスを行う必要がある場合は、DOMを使用する必要があります。
oracle.xml.pipeline.controller.Process
クラスは、すべてのパイプライン・プロセス定義のベース・クラスです。oracle.xml.pipeline.processes
パッケージのクラスは、このベース・クラスを拡張します。カスタマイズしたパイプライン・プロセスを作成するには、Process
クラスを拡張するクラスを作成する必要があります。
少なくとも、すべてのカスタム・プロセスは、Process
クラスの何も処理を行わないinitialize()
およびexecute()
メソッドをオーバーライドする必要があります。カスタマイズしたプロセスがSAXイベントを入力として受け入れる場合は、受信したSAXイベントを処理する適切なContentHandler
を戻すように、SAXContentHandler()
メソッドをオーバーライドする必要があります。また、適切なErrorHandler
を戻すように、SAXErrorHandler()
メソッドをオーバーライドする必要があります。表9-1に、前述のメソッドの詳細を示します。
表9-1 oracle.xml.pipeline.controller.Processクラスのメソッド
クラス | 説明 |
---|---|
|
プロセスを実行前に初期化します。
|
|
プロセスを実行します。
|
|
SAXの 他のプロセスから発生する依存性がこの時点で使用可能でない場合は、 |
|
SAXの このメソッドをオーバーライドしなかった場合、JAXBプロセッサは、このクラスに実装されているデフォルト・エラー・ハンドラを使用してSAXエラーを処理します。 |
関連項目: oracle.xml.pipeline.processes パッケージの詳細は、『Oracle Database XML Java APIリファレンス』を参照してください。 |
この項の内容は次のとおりです。
XML Pipeline Processorには次のパッケージを介してアクセスできます。
oracle.xml.pipeline.controller
: 依存性に基づいてパイプラインのXMLプロセスを実行するXMLパイプライン・コントローラを提供します。
oracle.xml.pipeline.processes
: XMLパイプライン・コントローラで実行できるXMLプロセスのラッパー・クラスを提供します。oracle.xml.pipelin.processes
パッケージには、パイプライン・アプリケーション・フレームワークの設計に使用できるクラスが含まれます。各クラスは、oracle.xml.pipeline.controller.Process
クラスを拡張します。
表9-2に、パッケージに含まれるコンポーネントを示します。XML Pipeline Processorとパイプライン文書を組み合せることによって、これらのコンポーネントとプロセスを連結できます。
表9-2 oracle.xml.pipeline.processesのクラス
クラス | 説明 |
---|---|
|
圧縮されたXMLを受け取り、解析済XMLを出力します。 |
|
DOMまたはSAXによって解析されたXMLを受け取り、圧縮済XMLを出力します。 |
|
受信したXMLを解析し、DOMツリーを出力します。 |
|
受信したXMLを解析し、SAXイベントを出力します。 |
|
DOMを入力として受け入れ、XPathパターンを使用してXML |
|
XMLスキーマを解析し、検証のためのスキーマ・オブジェクトを出力します。このプロセスはXML Pipeline Processorに組み込まれています。XML文書の検証に使用されるスキーマ・オブジェクトを作成します。 |
|
ローカル・スキーマと照合して検証し、結果を分析し、必要に応じてエラーを報告します。 |
|
DOMを入力として受け入れ、XSLスタイルシートを適用し、変換の結果を出力します。 |
|
XSLスタイルシートをストリームまたはDOMとして受け取り、 |
図9-2に、XML Pipeline Processorを使用するJavaアプリケーションにパイプライン文書を渡し、プロセッサを構成し、パイプラインを実行する方法を示します。
基本手順は次のとおりです。
パイプライン実行への入力となるパイプライン文書をインスタンス化します。次のように、コンストラクタにFileReader
を渡してオブジェクトを作成します。
PipelineDoc pipe; FileReader f; pipe = new PipelineDoc((Reader)f, false);
パイプライン・プロセッサをインスタンス化します。PipelineProcessor
は、パイプラインを実行する最上位クラスです。表9-3に、使用可能なメソッドの一部を示します。
表9-3 PipelineProcessorのメソッド
メソッド | 説明 |
---|---|
|
|
|
実行モードのタイプとして |
|
パイプラインのエラー・ハンドラを設定します。これはパイプラインを実行するために必須のコールです。 |
|
実行モードを設定します。 |
|
実行の動作を設定します。 |
|
パイプラインの |
パイプライン・プロセッサをインスタンス化する文は次のとおりです。
proc = new PipelineProcessor();
パイプライン文書にプロセッサを設定します。次に例を示します。
proc.setPipelineDoc(pipe);
プロセッサの実行モードを設定し、その他の必要な構成を行います。たとえば、PipelineProcessor.setExecutionMode()
に定数を渡してモードを設定します。
次の文は、シーケンシャルな実行を指定します。
proc.setExecutionMode(PipelineConstants.PIPELINE_SEQUENTIAL);
エラー・ハンドラをインスタンス化します。エラー・ハンドラは、PipelineErrorHandler
インタフェースを実装する必要があります。次に例を示します。
errHandler = new PipelineSampleErrHdlr(logname);
setErrorHandler()
を起動することで、プロセッサに対してエラー・ハンドラを設定します。次に例を示します。
proc.setErrorHandler(errHandler);
パイプラインを実行します。次に例を示します。
proc.executePipeline();
XML Pipeline Processorのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/pipeline
にあります。表9-4に、ユーティリティのテストに使用できるXMLファイルとJavaソース・ファイルを示します。
表9-4 Pipeline Processorのサンプル・ファイル
ファイル | 説明 |
---|---|
|
Pipeline Processorのデモの設定方法が記述されたテキスト・ファイル。 |
|
Pipeline Processorのサンプル・アプリケーション。このプログラムは第1引数として |
|
|
|
一連の書籍を記述したサンプルXML文書。この文書は、 |
|
|
|
|
|
|
|
|
|
パイプライン文書。この文書は次の処理を指定します。(1)プロセスp1でDOMを使用して |
|
パイプライン文書。この文書は次の処理を指定します。(1)プロセスp1でSAXを使用して |
|
パイプライン文書。この文書は次の処理を指定します。(1)プロセスp5でDOMを使用して |
|
パイプライン文書。この文書は次の処理を指定します。(1)プロセスp1でDOMを使用して |
|
発注書を記述したサンプルXML文書。この文書は、 |
サンプル・プログラムのコンパイル方法および実行方法は、README
に示されています。基本手順は次のとおりです。
ディレクトリを$ORACLE_HOME/xdk/demo/java/pipeline
ディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\pipeline
ディレクトリ(Windowsの場合)に変更します。
「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。
システム・プロンプトでmake
(UNIXの場合)またはMake.bat
(Windowsの場合)を実行して、PipelineSample.java
およびPipelineSampleErrHdler.java
のクラス・ファイルを生成し、デモ・プログラムを実行します。出力ファイルはlog
サブディレクトリに書き込まれます。
または、次の構文を使用して、デモ・プログラムを手動で実行することもできます。
java PipelineSample pipedoc pipelog [ seq | para ]
pipedoc
オプションは、使用するパイプライン文書を指定します。pipelog
オプションは、パイプラインのログ・ファイル名を指定します。seq
またはpara
を指定した場合、ログ・ファイル名は必須ですが、それ以外の場合はオプションです。ログ・ファイルを指定しなかった場合は、デフォルトでpipeline.log
が生成されます。seq
オプションを指定するとスレッドは順次処理され、para
を指定するとパラレル処理されます。seq
およびpara
のどちらも指定しなかった場合のデフォルトは、パラレル処理です。
パイプラインから生成されたファイルおよびログ・ファイルを表示します。パイプラインから生成されるすべてのファイルは、名前の先頭に文字列myresult
が付けられます。
XML Pipeline Processorのコマンドライン・インタフェースは、orapipe
といいます。Pipeline Processorは、Oracle Databaseにパッケージ化されています。Oracle Universal Installerを使用すると、デフォルトでディスク上の$ORACLE_HOME/bin
にユーティリティがインストールされます。
初めてユーティリティを実行する場合は、「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。オペレーティング・システムのコマンドラインで、次の構文を使用してorapipe
を実行します。
orapipe options pipedoc
pipedoc
はパイプライン文書であり、必須です。表9-5に、orapipe
ユーティリティの使用可能なオプションを示します。
表9-5 orapipeコマンドライン・オプション
オプション | 用途 |
---|---|
|
ヘルプ・メッセージを出力します。 |
|
指定されたログ・ファイルにエラーおよびメッセージを書き込みます。デフォルトは |
|
情報項目をログに記録しません。デフォルトはオンです。 |
|
警告をログに記録しません。デフォルトはオンです。 |
|
パイプライン・スキーマで入力 |
|
バージョン番号を出力します。 |
|
シーケンシャル・モードでパイプラインを実行します。デフォルトはパラレルです。 |
|
ターゲットが最新の状態にある場合でもパイプラインを実行します。デフォルトでは、forceは指定されていません。 |
|
|
この項の内容は次のとおりです。
Oracle XML Pipeline Processorを使用するには、W3Cノートで指定されたPipeline Definition Languageの規則に従ってXML文書を作成する必要があります。
W3C仕様では、XML処理コンポーネントとプロセスの入力および出力が定義されています。XML Pipeline Processorには、次のXDKコンポーネントのサポートが含まれます。
XMLパーサー
XML Compressor
XML Schemaバリデータ
XSLTプロセッサ
XML Pipeline Processorは、パイプライン文書の規則に従って一連のXML処理を実行し、結果を戻します。例9-1に、デモ・ディレクトリに含まれているサンプル・パイプライン文書pipedoc.xml
を示します。
例9-1 pipedoc.xml
<pipeline xmlns="http://www.w3.org/2002/02/xml-pipeline" xml:base="http://example.org/"> <param name="target" select="myresult.html"/> <processdef name="domparser.p" definition="oracle.xml.pipeline.processes.DOMParserProcess"/> <processdef name="xslstylesheet.p" definition="oracle.xml.pipeline.processes.XSLStylesheetProcess"/> <processdef name="xslprocess.p" definition="oracle.xml.pipeline.processes.XSLProcess"/> <process id="p2" type="xslstylesheet.p" ignore-errors="false"> <input name="xsl" label="book.xsl"/> <outparam name="stylesheet" label="xslstyle"/> </process> <process id="p3" type="xslprocess.p" ignore-errors="false"> <param name="stylesheet" label="xslstyle"/> <input name="document" label="xmldoc"/> <output name="result" label="myresult.html"/> </process> <process id="p1" type="domparser.p" ignore-errors="true"> <input name="xmlsource" label="book.xml "/> <output name="dom" label="xmldoc"/> <param name="preserveWhitespace" select="true"></param> <error name="dom"> <html xmlns="http://www/w3/org/1999/xhtml"> <head> <title>DOMParser Failure!</title> </head> <body> <h1>Error parsing document</h1> </body> </html> </error> </process> </pipeline>
例9-1では、3つのプロセスをコールし、oracle.xml.pipeline.processes
パッケージのJavaクラスに関連付けています。パイプライン文書では、<processdef/>
要素を使用して、次の関連付けを作成しています。
domparser.p
とDOMParserProcess
クラスの関連付け
xslstylesheet.p
とXSLStylesheetProcess
クラスの関連付け
xslprocess.p
とXSLProcess
クラスの関連付け
PipelineSample
プログラムでは、例9-1に示したpipedoc.xml
文書の他に、XML文書のbook.xml
およびbook.xsl
を入力として受け入れます。このパイプラインの基本設計は次のとおりです。
受信したbook.xml
文書を解析し、DOMツリーを生成します。このタスクはDOMParserProcess
によって実行されます。
book.xsl
をストリームとして解析し、XSLStylesheet
オブジェクトを生成します。このタスクはXSLStylesheetProcess
によって実行されます。
book.xml
のDOMを入力として受け取り、スタイルシート・オブジェクトを適用し、myresult.html
に結果を書き込みます。このタスクはXSLProcess
によって実行されます。
パイプライン文書で使用している処理アーキテクチャについて次に説明します。
target
パラメータのデフォルト値およびxml:base
の設定から、ターゲット情報セットはhttp://example.org/myresult.html
であると推定されます。
プロセスp2
の入力はbook.xsl
です。出力パラメータにはラベルxslstyle
が使用されているため、このプロセスを実行してp3
への入力を生成する必要があります。
プロセスp3
は、入力パラメータxslstyle
および文書xmldoc
に依存します。
プロセスp3
の出力パラメータには、ラベルhttp://example.org/myresult.html
が使用されているため、このプロセスを実行してターゲットを生成する必要があります。
プロセスp1
は、入力文書book.xml
に依存し、xmldoc
を出力します。したがって、このプロセスを実行してp3
への入力を生成する必要があります。
例9-1では、複数の処理順序によってすべての依存性を満たすことができます。指定された規則から判断すると、XML Pipeline Processorはp3
を最後に処理する必要がありますが、p1
およびp2
は、どちらの順番でも処理でき、パラレルで処理することもできます。
PipelineSample.java
ソース・ファイルは、基本的なパイプライン・アプリケーションです。このアプリケーションでは、表9-4の任意のパイプライン文書を使用して、入力XML文書を解析および変換できます。
このプログラムの基本手順は次のとおりです。
初期設定を行います。プログラムで、FileReader
型(入力XMLファイル)、PipelineDoc
(入力パイプライン文書)およびPipelineProcessor
(プロセッサ)の参照を宣言します。第1引数はパイプライン文書であり、必須です。第2引数を受け取った場合は、文字列logname
に格納されます。次のコード部分は、この方法を示します。
public static void main(String[] args) { FileReader f; PipelineDoc pipe; PipelineProcessor proc; if (args.length < 1) { System.out.println("First argument needed, other arguments are ". "optional:"); System.out.println("pipedoc.xml <output_log> <'seq'>"); return; } if (args.length > 1) logname = args[1]; ...
最初のコマンドライン引数をファイル名としてコンストラクタに渡し、FileReader
オブジェクトを作成します。次に例を示します。
f = new FileReader(args[0]);
FileReader
オブジェクトへの参照を渡し、PipelineDoc
オブジェクトを作成します。次の例では、FileReader
をReader
にキャストし、検証なしを指定しています。
pipe = new PipelineDoc((Reader)f, false);
XML Pipeline Processorをインスタンス化します。パイプライン・プロセッサをインスタンス化する文は次のとおりです。
proc = new PipelineProcessor();
パイプライン文書にプロセッサを設定します。次に例を示します。
proc.setPipelineDoc(pipe);
プロセッサの実行モードを設定し、その他の構成を行います。次のコード部分は、条件を使用して実行モードを決定します。プログラムに3つ以上の引数が渡された場合は、渡された引数に応じて、モードをシーケンシャルまたはパラレルに設定します。次に例を示します。
String execMode = null; if (args.length > 2) { execMode = args[2]; if(execMode.startsWith("seq")) proc.setExecutionMode(PipelineConstants.PIPELINE_SEQUENTIAL); else if (execMode.startsWith("para")) proc.setExecutionMode(PipelineConstants.PIPELINE_PARALLEL); }
エラー・ハンドラをインスタンス化します。エラー・ハンドラは、PipelineErrorHandler
インタフェースを実装する必要があります。プログラムでは、PipelineSampleErrHdlr.java
に示されているPipelineSampleErrHdler
を使用しています。次のコード部分は、この方法を示します。
errHandler = new PipelineSampleErrHdlr(logname);
setErrorHandler()
を起動することで、プロセッサに対してエラー・ハンドラを設定します。この方法を示す文は次のとおりです。
proc.setErrorHandler(errHandler);
パイプラインを実行します。この方法を示す文は次のとおりです。
proc.executePipeline();
関連項目: oracle.xml.pipeline のサブパッケージの詳細は、『Oracle Database XML Java APIリファレンス』を参照してください。 |
XML Pipeline Processorをコールするアプリケーションは、プロセッサから受け取ったエラーを処理するPipelineErrorHandler
インタフェースを実装する必要があります。setErrorHandler()
をコールしてプロセッサのエラー・ハンドラを設定します。エラー・ハンドラを作成する場合、様々なタイプのエラーに対して例外を発生させるように指定できます。
oracle.xml.pipeline.controller.PipelineErrorHandler
インタフェースは、表9-6に示すメソッドを宣言します。これらのメソッドはすべてvoid
を戻します。
表9-6 PipelineErrorHandlerのメソッド
メソッド | 説明 |
---|---|
|
|
|
致命的な |
|
|
|
エラーに関するオプションの追加情報を出力します。 |
表9-6の最初の3つのメソッドは、oracle.xml.pipeline.controller.PipelineException
オブジェクトへの参照を受け取ります。特に実用的なPipelineException
クラスのメソッドを次に示します。
getExceptionType()
: 発生した例外のタイプを取得
getProcessId()
: 例外が発生したプロセスIDを取得
getMessage()
: このThrowable
エラーのメッセージ文字列を戻す
PipelineSampleErrHdler.java
ソース・ファイルは、PipelineSample
プログラムで使用される基本的なエラー・ハンドラを実装します。基本手順は次のとおりです。
コンストラクタを実装します。次に示すように、コンストラクタはログ・ファイル名を受け入れ、それをFileWriter
オブジェクトの中にラップします。
PipelineSampleErrHdlr(String logFile) throws IOException { log = new PrintWriter(new FileWriter(logFile)); }
error()
メソッドを実装します。この実装は、プロセスID、例外タイプおよびエラー・メッセージを出力します。また、エラー・カウントを保持する変数を増分します。次に例を示します。
public void error (String msg, PipelineException e) throws Exception { log.println("\nError in: " + e.getProcessId()); log.println("Type: " + e.getExceptionType()); log.println("Message: " + e.getMessage()); log.println("Error message: " + msg); log.flush(); errCount++; }
fatalError()
メソッドを実装します。この実装は、error()
のパターンに従います。次に例を示します。
public void fatalError (String msg, PipelineException e) throws Exception { log.println("\nFatalError in: " + e.getProcessId()); log.println("Type: " + e.getExceptionType()); log.println("Message: " + e.getMessage()); log.println("Error message: " + msg); log.flush(); errCount++; }
warning()
メソッドを実装します。この実装は、errCount
変数のかわりにwarnCount
変数を増分することを除いて、error()
の基本パターンに従います。次に例を示します。
public void warning (String msg, PipelineException e) throws Exception { log.println("\nWarning in: " + e.getProcessId()); log.println("Message: " + e.getMessage()); log.println("Error message: " + msg); log.flush(); warnCount++; }
info()
メソッドを実装します。このメソッドは前述のメソッドとは異なり、PipelineException
の参照を入力として受け取りません。次に示す実装は、メソッドが受け取ったString
を出力し、warnCount
変数の値を増分します。
public void info (String msg) { log.println("\nInfo : " + msg); log.flush(); warnCount++; }
PrintWirter
をクローズするメソッドを実装します。次に示すコードは、closeLog()
メソッドを実装します。このメソッドは、エラーおよび警告の数を出力し、PrintWriter.close()
をコールします。
public void closeLog() { log.println("\nTotal Errors: " + errCount + "\nTotal Warnings: " + warnCount); log.flush(); log.close(); }
関連項目: PipelineErrorHandler インタフェースおよびPipelineException クラスの詳細は、『Oracle Database XML Java APIリファレンス』を参照してください。 |