この章の内容は次のとおりです。
この項の内容は次のとおりです。
この章では、次の内容を十分に理解していると想定します。
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リファレンス』を参照してください。 |