この章の内容は次のとおりです。
Oracle XML JavaBeansは、Javaのアプリケーションおよびアプレットで使用できるXMLコンポーネントのセットです。
この項の内容は次のとおりです。
この章では、次のテクノロジを十分に理解していると想定します。
JavaBeans: JavaBeansのコンポーネント(Bean)は、ビルダー・ツールでビジュアルに操作できる再利用可能なソフトウェア・コンポーネントです。
Java Database Connectivity(JDBC): XDK JavaBeansにはデータベースへの接続性もあります。XDK JavaBeansはJDBC対応のデータベースに直接接続して、XMLファイルやXSLファイルを取得および格納できます。
Document Object Model(DOM): DOMは、XML文書の構造を示すメモリー内ツリー表現です。
Simple API for XML(SAX): SAXは、イベントベースのXML解析の標準です。
XML Schema言語: 概要および関連資料へのリンクは、第7章「Schema Processor for Javaの使用」を参照してください。
XDK JavaBeansには、XDKバージョン1.2以上が必要です。XDK JavaBeansは、JDK 1.2のすべてのバージョンで使用できます。すべてのXDK BeanはSun JavaBeans仕様に準拠し、java.beans.SimpleBeanInfoを拡張する必須のBeanInfoクラスが含まれます。
JDK 1.1のJavaBeansについて記述したJavaBeans 1.01仕様は、次のURLで入手できます。
http://java.sun.com/products/javabeans/docs/spec.html
JavaBeansコア仕様にJava 2プラットフォームへの対応が追加され、より高度なJavaBeansコンポーネントを作成する標準手段が開発者に提供されました。Java 2のJavaBeans仕様は、次のURLで入手できます。
http://java.sun.com/products/javabeans/glasgow/index.html
Oracle XDK JavaBeansを使用すると、XMLアプリケーションにGUIを簡単に追加できます。Beanのカプセル化には、Oracle JDeveloperなどのJava IDEから直接アクセスできるドキュメントおよびディスクリプタが含まれます。
XDKに含まれるBeanは次のとおりです。
oracle.xml.async.DOMBuilder Beanは、XML文書からDOMツリーを構築します。DOMBuilder JavaBeanは、Beanインタフェースを使用してXML Parser for JavaのDOMParserクラスをカプセル化し、機能を拡張して非同期解析をサポートします。リスナーを登録すると、Javaプログラムで大規模または連続したドキュメントの解析を開始し、制御をすぐにコール元に戻すことができます。
このBeanの大きなメリットの1つは、複数のファイルを解析する場合の効率の向上であり、ファイルが大きい場合は特に効果的です。DOMBuilderは、対話式のビジュアル・アプリケーションのバックグラウンド・スレッドで、非同期解析を行うこともできます。非同期解析を行わない場合、ドキュメントの解析が終わるまでGUIを有効に使用できません。DOMBuilderを使用すると、解析メソッドをコールした後、アプリケーションに制御が戻ります。アプリケーションでは、プログレス・バーを表示したり、ユーザーが解析を取り消したりできます。
oracle.xml.async.XSLTransformer Beanは、非同期変換をサポートします。このBeanはXML文書を受け入れ、XSLTスタイルシートを適用し、出力ファイルを作成します。XSLTransformer JavaBeanを使用すると、XML文書をXML、HTML、DDLなどのほぼすべてのテキストベースの形式に変換できます。XSLTransformer Beanは、サーバー側のアプリケーションまたはサーブレットがXML文書(問合せ結果のXML表現など)をブラウザで表示するためにHTMLでレンダリングするための基礎として使用できます。
XSLTransformer Beanの主なメリットは、複数のファイルを同時に変換できることです。DOMBuilderと同様に、このBeanをビジュアル・アプリケーションで使用すると、GUIが長い期間応答しなくなることを防止できます。XSLTransformerListenerインタフェースを実装すると、変換が完了したときにコール元のアプリケーションに通知されます。
oracle.xml.dbaccess.DBAccess Beanは、複数のXML文書およびテキスト・ドキュメントを含むCLOB表をメンテナンスします。このBeanは、データベース内でXML文書を処理する必要はないが、データベースにXML文書を格納し、データベースからXML文書を取得する必要がある場合に使用できます。DBAccess Beanを使用するJavaアプリケーションは、JDBCを介してデータベースに接続します。CLOB表に格納されたXML文書がXMLType型でない場合は、エンティティが展開されません。
DBAccess Beanを使用すると、次のタスクを実行できます。
CLOB型の表の作成および削除
CLOB表の内容の問合せ
CLOB表に格納されたXML文書に対するINSERT、UPDATEおよびDELETE操作の実行
oracle.xml.xmldbaccess.XMLDBAccess Beanは、DBAccess Beanを拡張してXMLType表に格納されたXML文書をサポートします。このクラスは、XMLTypeインスタンスおよびそれらの表を表示、削除または取得するメソッドを提供します。たとえば、getXMLXPathTextData()メソッドは、XML文書からXPath式の値を取得します。
DBAccess JavaBeanは、複数のXML文書およびテキスト・ドキュメントを保持できるXMLType表をメンテナンスします。各XML文書またはテキスト・ドキュメントは、表の行として格納されます。表の作成には次のSQL文を使用します。
CREATE TABLE (FILENAME CHAR( ) UNIQUE,
FILEDATA SYS.XMLType);
FILENAMEフィールドには、その行を検索、更新または削除するためにキーとして使用される一意の文字列があります。文書のテキストはFILEDATAフィールドに格納されます。
XMLDBAccess Beanが実行するタスクは次のとおりです。
XMLType表の作成および削除
XMLType列の内容の表示
XMLType表に格納されたXML文書に対するINSERT、UPDATEおよびDELETE操作の実行
XML文書を比較する場合は、文字単位で比較しても通常は役に立ちません。XMLの比較は、空白の違いではなく、そのほとんどが構造や重要なテキスト・コンテンツの相違に関する比較です。oracle.xml.differ.XMLDiff Beanは、次の有用なタスクを実行します。
2つの入力XML文書のDOMツリーを構築および比較して、それらの文書が異なるかどうかを示します。
2つのXMLファイルの差分をグラフィカルに表示します。具体的には、ノードの挿入、削除、変更または移動を目視できます。
入力XML文書の1つを他方の文書に変換できるXSLTスタイルシートを生成します。
XMLDiff Beanは、特にパイプライン・アプリケーションで役立ちます。たとえば、アプリケーションでXML文書を更新し、前のバージョンの文書と比較し、それらの違いを示すXSLTスタイルシートを格納できます。
「XMLの圧縮」で説明しているように、Oracle XMLパーサーには、XML文書オブジェクトをバイナリ・ストリームとしてシリアライズできる圧縮プログラムが含まれます。便利なツールではありますが、XMLパーサーによる圧縮には次の短所があります。
XMLデータをデシリアライズしたとき、再解析が必要になります。
タグの中にXMLデータをカプセル化すると、サイズが大幅に増加します。
oracle.xml.xmlcomp.XMLCompress Beanは、XML圧縮機能をカプセル化したものです。このBeanを使用してXMLをシリアライズおよびデシリアライズすると、次の利点があります。
DOMをシリアライズするメソッドをカプセル化し、ストリーム形式にします。
XMLプロセッサは、XMLを再解析せずに圧縮ストリームからDOMを再生成できます。
このBeanは、DOMParserまたはSAXParserによって解析された入力XMLの圧縮と解凍をサポートします。DOM圧縮は、XMLType型、CLOB型およびBLOB型の入力をサポートします。
様々な解析オプションを使用するには、入力前に文書を解析してから、XMLDocumentオブジェクトをCompressor Beanに渡します。圧縮係数は、入力XMLファイルおよび圧縮したファイルのサイズに基づく大まかな値です。圧縮係数メソッドは、java.io.Fileオブジェクトをパラメータとして使用して圧縮を行う場合にのみ使用できます。
oracle.xml.schemavalidator.XSDValidator Beanは、XSDValidatorクラスをカプセル化し、DOMツリーの検証機能を追加します。このBeanの最も便利な機能の1つは、検証エラーに関する機能です。アプリケーションで検証エラーが発生すると、getStackList()メソッドから、無効なノードを示すDOMツリー・パスのリストが戻ります。エラーのあるノードはスタック・ツリーのベクターに戻され、このスタックの最上位要素がルート・ノードに相当します。子ノードは、スタックから取り出して取得できます。getStackList()を使用するには、java.util.Vectorクラスおよびjava.util.Stackクラスのインスタンス化を使用する必要があります。
この項の内容は次のとおりです。
この項では、実用的なBean(DOMBuilder、XSLTransformer、XMLDBAccessおよびXMLDiff)を使用するJavaアプリケーションのプログラム・フローについて説明します。この項の内容は次のとおりです。
DOMBuilderクラスは、W3C勧告に準拠したXML 1.0のパーサーを実装しており、XML文書を解析してDOMツリーを構築します。解析は別のスレッドで行われます。ツリーが構築されたときに通知されるようにするにはDOMBuilderListenerインタフェースを使用する必要があります。
このBeanを使用するアプリケーションを開発する場合、次のサブパッケージをインポートする必要があります。
oracle.xml.async: DOMを構築するための非同期JavaBeansを提供します。
oracle.xml.parser.v2: SAX、DOMおよびXSLTのAPIを提供します。
oracle.xml.parser.v2サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-1に、javax.xml.asyncパッケージの最も重要なDOM関連クラスおよびインタフェースを示します。
表10-1 javax.xml.asyncのDOM関連クラスおよびインタフェース
| クラス/インタフェース | 説明 |
|---|---|
|
|
XMLパーサーをカプセル化し、XML文書を解析してDOMツリーを構築します。解析は別のスレッドで行われます。ツリーが構築されたときに通知されるようにするには |
|
|
|
|
|
非同期解析時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
|
|
解析例外が発生したときに送信されるエラー・イベントを定義します。 |
|
|
解析中に検出されたエラーの通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
図10-1に、DOMBuilder JavaBeanを使用するアプリケーションの基本プロセスを示します。
図10-1に示されたXML処理は次のとおりです。
入力XML文書を解析します。このプログラムはXML文書をファイル、文字列バッファまたはURLとして受け取ることができます。
DOMBuilderリスナーを追加します。プログラムで、DOMBuilder.addDOMBuilderListener(DOMBuilderListener)メソッドを起動します。
XML文書を解析します。プログラムで、DOMBuilder.parse()メソッドを起動します。
オプションで、解析結果をさらに処理します。
プログラムが非同期コールを受信したとき、リスナーをコールします。このリスナーは、DOMBuilderListenerインタフェースを実装する必要があり、DOMBuilderOver()メソッドの起動によってコールされます。
使用可能なDOMBuilderListenerメソッドは次のとおりです。
DOMをフェッチします。DOMBuilder.getDocument()メソッドを起動して結果のDOM文書をフェッチし、出力します。
XSLTransformer Beanは、Beanインタフェースを使用してJava XMLパーサーのXSLT処理エンジンをカプセル化し、その機能を拡張して非同期変換を可能にします。Javaアプリケーションは、リスナーを登録することによって、コール元にすぐに制御を返し、大規模または連続したドキュメントを解析できます。
このBeanを使用するアプリケーションを開発する場合、次のサブパッケージをインポートする必要があります。
oracle.xml.async: XSLT変換のための非同期JavaBeansを提供します。
oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。
oracle.xml.parser.v2サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-2に、javax.xml.asyncパッケージの最も重要なXSL関連クラスおよびインタフェースを示します。
表10-2 javax.xml.asyncのXSL関連クラスおよびインタフェース
| クラス/インタフェース | 説明 |
|---|---|
|
|
バックグラウンド・スレッドでXSLT変換を適用します。 |
|
|
|
|
|
非同期変換時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
|
|
|
|
|
非同期変換時のエラー・イベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
図10-2に、XSLTransformer Beanの使用方法を示します。
図10-2に示された処理は、次のとおりです。
XSLTスタイルシートとXMLインスタンス・ドキュメントを入力します。
XSLTリスナーを追加します。プログラムは、XSLTransfomer.addXSLTransformerListener()methodを起動します。
スタイルシートを適用します。XSLTransfomer.processXSL()メソッドは、XSLT変換をバックグラウンドで開始します。
オプションで、XSLTransformer Beanを使用してその他の処理を実行します。
プログラムが非同期コールを受信したとき、XSLTリスナーをコールします。このリスナーは、XSLTransformerListenerインタフェースを実装する必要があり、xslTransformerOver()メソッドの起動によってコールされます。
変換結果をフェッチします。XSLTransformer.getResult()メソッドを起動して、結果文書のXML文書フラグメントを戻します。
XML文書フラグメントを出力します。
XMLDBAccess Beanを使用するアプリケーションを開発する場合、次のサブパッケージを使用する必要があります。
oracle.xml.xmldbaccess: XMLDBAccess Beanが含まれます。
oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。
oracle.xml.parser.v2サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-3に、XMLDBAccessクラスの重要なメソッドを示します。
表10-3 XMLDBAccessのメソッド
| クラス/インタフェース | 説明 |
|---|---|
|
|
|
|
|
テキスト・ファイルを |
|
|
テキスト・ファイルを |
|
|
指定された文字列で開始する名前を持つXML表をすべて取得します。 |
|
|
|
|
|
XPath式に基づいて |
図10-3に、XMLDBAccess Beanの一般的な使用方法を示します。これは、DBAccess Beanを使用して、XMLTypeで格納されたXML文書をメンテナンスおよび操作する方法です。
たとえば、XMLDBAccessプログラムでは、次のようにXML文書を処理できます。
XMLType表を作成します。データベース接続情報および表名を渡して、createXMLTypeTable()を起動します。
XMLType表のリストを作成します。データベース接続情報および空の文字列を渡して、getXMLTypeTableNames()を起動します。
表にXMLデータをロードします。データベース接続情報、表名、XMLファイル名およびXMLを含む文字列を渡して、replaceXMLTypeData()を起動します。
XMLデータをStringとして取得します。接続情報、表名およびXMLファイル名を渡して、getXMLTypeData()を起動します。
XPath式に基づいてXMLデータを取得します。接続情報、表名、XMLファイル名およびXPath式を渡して、getXMLXPathTextData()を起動します。
接続を終了します。
XMLDiff Beanを使用するアプリケーションを開発する場合、一般的に使用するサブパッケージは次のとおりです。
oracle.xml.xmldiff: XMLDiff Beanが含まれます。
oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。
oracle.xml.async: DOMを構築するための非同期JavaBeansを提供します。
oracle.xml.parser.v2サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-4に、XMLDiffクラスの重要なメソッドを示します。
表10-4 XMLDiffのメソッド
| クラス/インタフェース | 説明 |
|---|---|
|
|
2つの入力XMLファイルまたは2つのXMLDocumentオブジェクトの差分を検出します。 |
|
|
2つの入力XMLファイルの差分を表すXSLファイルを生成します。生成されたスタイルシートを使用して、最初のXMLファイルを2つ目のXMLファイルに変換できます。2つのXMLファイルが同じである場合は、生成されたXSLで最初のXMLファイルを2つ目のXMLファイルに変換でき、ここで最初のファイルと2つ目のファイルは同等です。 関連メソッドは、 |
|
|
比較する必要があるXMLファイルを設定します。 |
|
|
最初のXMLツリーのドキュメント・ルートをXMLDocumentオブジェクトとして取得します。 |
|
|
テキスト・パネルを、最初のXMLファイルの差分をビジュアルに表示する |
図10-4に、XMLDiff Beanの一般的な使用方法を示します。これは、XMLDiff Beanを使用して入力XML文書を比較し、差分を表示する方法です。
たとえば、XMLDiffプログラムでは、次のようにXML文書を処理できます。
XMLDiffオブジェクトを作成します。
比較するファイルを設定します。入力ファイルのFileオブジェクトを作成し、XMLDiff.setFiles()にオブジェクトへの参照を渡します。
ドキュメントを比較します。XMLファイルが同一の場合はdiff()メソッドからfalseが戻り、異なる場合はtrueが戻ります。
入力XML文書が同一であるか異なるかに応じて対処します。たとえば、同一である場合は、JOptionPane.showMessageDialog()を起動してメッセージを出力します。
入力XML文書の差分を示すXSLTスタイルシートを生成します。たとえば、generateXSLDoc()は、XSLスタイルシートをXMLDocumentとして生成します。
XMLDiffによって作成されたDOMツリーを表示します。
XDK JavaBeansのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/transviewerディレクトリにあります。デモでは、「XDK JavaBeansの機能」で説明しているXDK Bean、および非推奨となった一部のビジュアルなBeanの使用方法を示します。デモで使用されているすべてのBeanを次に示します。
XSLTransformer
DOMBuilder
DBAccess
XMLDBAccess
XMLDiff
XMLCompress
XSDValidator
oracle.xml.srcviewer.XMLSourceView(非推奨)
oracle.xml.treeviewer.XMLTreeView(非推奨)
oracle.xml.transformer.XMLTransformPanel(非推奨)
oracle.xml.dbviewer.DBViewer(非推奨)
ビジュアルなBeanは非推奨ですが、学習用として役に立ちます。非推奨のBeanはそのために$ORACLE_HOME/lib/xmldemo.jarに含まれています。使用可能なBeanは$ORACLE_HOME/lib/xml.jarにあります。
表10-5に、デモ・ディレクトリにあるサンプル・プログラムを示します。表の最初の列に、非推奨のBeanがどのサンプル・プログラムで使用されているかを示します。
表10-5 JavaBeanのサンプルJavaソース・ファイル
| サンプル | ファイル名 | 説明 |
|---|---|---|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample1の実行」 |
|
(非推奨) |
|
このビジュアルなサンプル・アプリケーションでは、 関連項目: 「sample2の実行」 |
|
|
|
この非ビジュアル・アプリケーションでは、 関連項目: 「sample3の実行」 |
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample4の実行」 |
|
|
この |
|
|
|
この |
|
|
|
|
この非ビジュアル・アプリケーションでは、
関連項目: 「sample5の実行」 |
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample6の実行」 |
|
|
|
|
|
|
|
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample7の実行」 |
|
|
GUIの情報をBeanにパイプする単純なクラスです。このクラスは、 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample8の実行」 |
|
|
解析済のXMLインスタンス・ドキュメントをツリーとして表示する |
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample9の実行」 |
|
|
|
|
|
|
|
このアプリケーションは、 関連項目: 「sample10の実行」 |
表10-6に、デモ・プログラムで使用されるその他のファイルを示します。
表10-6 JavaBeanのサンプル・ファイル
| ファイル名 | 説明 |
|---|---|
|
|
|
|
|
|
|
|
このXML文書は、 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
サンプル・プログラムのコンパイル方法および実行方法は、同じディレクトリにあるREADMEに示されています。基本手順は次のとおりです。
ディレクトリを$ORACLE_HOME/xdk/demo/java/transviewerディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\transviewerディレクトリ(Windowsの場合)に変更します。
「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。BeanにはJDK 1.2以上が必要です。HTMLをレンダリングするとき、DBViewer BeanおよびDBTransformPanel BeanにはJDK 1.2.2が必要です。これより前のバージョンのJDKでは、結果バッファのHTMLが適切にレンダリングされない場合があります。
使用する環境に応じて、Makefile(UNIXの場合)またはMake.bat(Windowsの場合)を編集します。具体的には、次の編集を行います。
MakefileのJDKPATHを、JDKパスを指すように変更します。
PATHSEPを、オペレーティング・システムに合せて適切なパス・セパレータに変更します。
HOSTNAME、PORT、SID、USERIDおよびPASSWORDパラメータを変更して、JDBCシン・ドライバを通じてデータベースに接続できるようにします。これらのパラメータは、sample4およびsample5で使用されます。
システム・プロンプトでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行して、クラス・ファイルを生成します。
次のようにgmakeを実行して、デモを実行します。
gmake sample1 gmake sample2 gmake sample3 gmake sample4 gmake sample5 gmake sample6 gmake sample7 gmake sample8 gmake sample9 gmake sample10
次の項では、デモの実行方法を説明します。
sample1は、XMLTransViewer Beanを使用するプログラムです。次のように手動でプログラムを実行できます。
java XMLTransformPanelSample
このプログラムを使用して、OracleデータベースのXMLファイルをインポートおよびエクスポートし、データベースにXSLT変換ファイルを格納し、XMLにスタイルシートを対話式に適用できます。このプログラムでデータベース接続機能を使用するには、データベースを実行しているコンピュータのネットワーク名、ポート(通常は1521)およびOracleインスタンスの名前(通常はorcl)を把握しておく必要があります。また、CREATE TABLE権限を持つアカウントも必要です。サンプル・スキーマをインストールした場合は、アカウントhrを使用できます。XMLTransViewerプログラムを使用して、XMLファイルにスタイルシート変換を適用し、結果を表示できます。表示されるパネルの上部および下部にはタブがあります。上部にある最初の2つのタブは、XMLバッファとXSLTバッファの切替えに使用します。3つ目のタブでは、XMLバッファに対してXSLT変換を実行し、結果を表示します。下部にある最初の2つのタブを使用して、Oracleデータベースおよびファイル・システムのデータをロードおよび保存できます。下部の残りのタブでは、現在のコンテンツの表示をツリー表示、XMLソース、編集モードまたはHTML(変換後の結果の表示の場合)に切り替えます。
sample2は、XMLSourceViewおよびXMLTreeView BeanのGUIベースのデモで、非推奨です。ViewSampleプログラムでは、booklist.xmlファイルが、ソース表示とツリー表示に別々に示されます。次のように手動でプログラムを実行できます。
java ViewSample
sample3は、非同期のDOMBuilder BeanおよびXSLTransformer Beanの非ビジュアルなデモです。AsyncTransformSampleプログラムは、現在のディレクトリ内のすべての*.xmlファイルにdoc.xsl XSLTスタイルシートを適用します。結果は、拡張子が.logであるファイルに書き込まれます。次のようにプログラムを実行できます。
java AsyncTransformSample
sample4はDBViewer Beanのビジュアルなデモで、非推奨です。このデモは、次のように実行されます。
SQL*Plusを起動し、Makefileで指定されたUSERIDおよびPASSWORDを使用してデータベースに接続し、claim.sqlスクリプトを実行します。このスクリプトは、DBViewSampleデモ・プログラムで使用する多数の表、ビューおよび型を作成します。
DBViewSampleプログラムを次のように実行します。
java -classpath "$(MAKE_CLASSPATH)" DBViewSample
JDBC接続情報は、デモで使用されるクラスを実装するDBViewClaims.javaソース・ファイルにハードコードされています。特に、USERID、PASSWORDおよびその他の値は、Makefileに設定された値であることが前提になっています。使用する構成が異なる場合は、DBViewClaims.javaの92行にナビゲートし、setUsername()、setPassword()およびその他を現在のOracleデータベース構成を反映した値に変更します。
sample5は、XMLDBAccess Beanの非ビジュアルなデモです。XMLTypeオブジェクトを使用して、データベースの中にXML文書を格納します。次のプログラムは、Javaシン・クライアントを使用してデータベースに接続し、XMLType表を作成し、booklist.xmlからデータをロードします。このプログラムを実行するには、次の情報をコマンドライン引数として指定する必要があります。
ホスト名(たとえば、myhost)
ポート番号(たとえば、1521)
データベースのSID(たとえば、ORCL)
表を作成するためのデータベース・アカウント(たとえば、hr)
データベース・アカウントのパスワード(たとえば、hr)
たとえば、次のようにプログラムを実行できます。
java XMLDBAccessSample myhost 1521 ORCL hr hr
次のテキストは、dbaccess.logからのサンプル出力です。
Demo for createXMLTypeTables():
Table +'testxmltype' successfully created.
Demo for listXMLTypeTables():
tablenamename=TESTXMLTYPE
Demo for replaceXMLTypeData() (similar to insert):
XML Data from +'booklist.xml' successfully replaced in table 'testxmltype'.
Demo for getXMLTypeData():
XMLType data fetched:
<?xml version="1.0"?>
<booklist>
<book isbn="1234-123456-1234">
<title>C Programming Language</title>
<author>Kernighan and Ritchie</author>
<publisher>EEE</publisher>
<price>7.99</price>
</book>
...
<book isbn="1230-23498-2349879">
<title>Emperor's New Mind</title>
<author>Roger Penrose</author>
<publisher>Oxford Publishing Company</publisher>
<price>15.99</price>
</book>
</booklist>
Demo for getXMLTypeXPathTextData():
Data fetched using XPath exp '/booklist/book[3]':
<book isbn="2137-598354-65978">
<title>Twelve Red Herrings</title>
<author>Jeffrey Archer</author>
<publisher>Harper Collins</publisher>
<price>12.95</price>
</book>
sample6プログラムは、XMLDiff Beanのビジュアルなデモです。XMLDIFFSampleクラスによってGUIが起動され、「XMLファイルの比較」を選択すると、「ファイル」メニューから入力データ・ファイルを選択できます。「変換」メニューを使用して、生成されたXSLTを最初の入力XMLに適用できます。「ファイル」メニューの「別名保存」を選択して、出力XMLファイルを保存します。このファイルは、2つ目の入力ファイルと同じになります。デフォルトでは、XMLDiffData1.txtをXMLDiffData2.txtと比較し、XSLT出力をXMLDiffSample.xslとして格納します。
次のように手動でプログラムを実行できます。
java -mx50m XMLDiffSample XMLDiffData1.txt XMLDiffData2.txt
ファイアウォールの外側のURLにアクセスするDTDを入力XMLファイルで使用する場合は、XMLDiffSample.javaを変更して、setFiles()コールの前にプロキシ・サーバーの設定を含めます。たとえば、次のようにプログラムを変更します。
/* Set proxy to access dtd through firewall */
Properties p = System.getProperties();
p.put("proxyHost", "www.proxyservername.com");
p.put("proxyPort", "80");
p.put("proxySet", "true");
/* You will also have to import java.util.*; */
sample7は、XMLCompress Beanの使用方法を示すビジュアルなデモです。compviewerクラスを使用すると、GUIを起動して、XMLファイルおよびデータベースから取得したデータを圧縮および解凍できます。ロード・オプションにより、データをファイル・システムまたはデータベースから取得できます。このアプリケーションでは、データベースからの圧縮データのロードおよび保存はサポートされません。圧縮係数は、XMLデータの圧縮率を示す大まかな値です。
次のように手動でプログラムを実行できます。
java compviewer
sample8のデモは、XMLTreeViewer Beanの使用方法を示します。XMLSchemaTreeViewerプログラムを使用すると、XMLDocumentをツリー形式で表示できます。スキーマ・ドキュメントを入力することで、インスタンス・ドキュメントをスキーマに対して検証できます。ドキュメントが無効な場合は、無効なノードがハイライト表示され、エラー・メッセージが表示されます。また、すべてのライン情報のログが専用のパネルに表示され、このパネルを使用してインスタンス・ドキュメントを編集および再評価できます。サンプル・ファイルpurchaseorder.xmlおよびpurchaseorder.xsdを使用して、このプログラムをテストします。インスタンス・ドキュメントpurchaseorder.xmlは、purchaseorder.xsdで定義されたスキーマに準拠していません。
次のように手動でプログラムを実行できます。
java XMLSchemaTreeViewer
sample9のデモは、SourceViewer Beanの使用方法を示します。XMLSrcViewerプログラムでは、構文のハイライト表示を有効にしてXML文書またはDTDを表示できます。入力したXMLスキーマまたはDTDに対してXML文書を検証できます。内部または外部のDTDを使用できます。
検証が成功した場合は、「ソース表示」ペインでインスタンス・ドキュメントおよびXMLスキーマまたはDTDを表示できます。スキーマ検証でエラーが検出された場合は、「エラー」ペインにエラー・ログと行番号が表示されます。「ソース表示」ペインには、エラー・ノードがハイライトされた状態でXML文書が表示されます。サンプル・ファイルpurchaseorder.xmlおよびpurchaseorder.xsdを使用して、XMLスキーマ検証のエラーをテストできます。note_in_dtd.xmlをDTD検証モードで使用すると、検証エラーとともに内部DTDを表示できます。次のように手動でプログラムを実行できます。
java XMLSrcViewer
sample10のデモは、XSDValidator Beanの使用方法を示します。XSDValidatorSampleプログラムの2つの引数は、XML文書とその関連XMLスキーマです。このプログラムでは、検証中に発生したエラーが、行番号を含めて表示されます。
次のプログラムでは、purchaseorder.xsdを使用してpurchaseorder.xmlの内容を検証します。
java XSDValidatorSample purchaseorder.xml purchaseorder.xsd
このXML文書は、スキーマ検証で失敗します(予定どおりの動作)。次のエラーが表示されます。
Sample purchaseorder.xml purchaseorder.xsd <Line 2, Column 41>: XML-24523: (Error) Invalid value 'abc' for attribute: 'orderDate' #document->purchaseOrder <Line 7, Column 27>: XML-24525: (Error) Invalid text 'CA' in element: 'state' #document->purchaseOrder->shipTo->state->#text <Line 8, Column 25>: XML-24525: (Error) Invalid text 'sd' in element: 'zip' #document->purchaseOrder->shipTo->zip->#text <Line 14, Column 27>: XML-24525: (Error) Invalid text 'PA' in element: 'state' #document->purchaseOrder->billTo->state->#text <Line 17, Column 22>: XML-24534: (Error) Element 'coment' not expected. #document->purchaseOrder->coment <Line 29, Column 31>: XML-24534: (Error) Element 'shipDae' not expected. #document->purchaseOrder->items->item->shipDae
この項の内容は次のとおりです。
「DOMBuilder」および「XSLTransformer」で説明したように、XDK Beanを使用して非同期XML処理を実行できます。
AsyncTransformSample.javaプログラムは、DOMBuilderおよびXSLTransformerの両方のBeanの使用方法を示します。このプログラムは次のメソッドを実装します。
runDOMBuilders()
runXSLTransformer()
saveResult()
makeXSLDocument()
createURL()
init()
exitWithError()
asyncTransform()
プログラムの基本的なアーキテクチャは次のとおりです。
このプログラムは、クラスで使用されるフィールドを宣言および初期化します。入力XSLTスタイルシートは、doc.xslとしてプログラムにハードコードされています。クラスでは次のフィールドを定義します。
String basedir = new String (".");
OutputStream errors = System.err;
Vector xmlfiles = new Vector();
int numXMLDocs = 1;
String xslFile = new String ("doc.xsl");
URL xslURL;
XMLDocument xsldoc
main()メソッドがinit()メソッドを起動して初期設定が実行されます。現在のディレクトリ内のファイルがリストされ、拡張子.xmlで終わるファイルが見つかった場合は、Vectorオブジェクトに追加されます。init()メソッドの実装は次のとおりです。
boolean init () throws Exception
{
File directory = new File (basedir);
String[] dirfiles = directory.list();
for (int j = 0; j < dirfiles.length; j++)
{
String dirfile = dirfiles[j];
if (!dirfile.endsWith(".xml"))
continue;
xmlfiles.addElement(dirfile);
}
if (xmlfiles.isEmpty()) {
System.out.println("No files in directory were selected for processing");
return false;
}
numXMLDocs = xmlfiles.size();
return true;
}
main()メソッドは次のようにAsyncTransformSampleをインスタンス化します。
AsyncTransformSample inst = new AsyncTransformSample();
main()メソッドがasyncTransform()メソッドを起動します。asyncTransform()メソッドの主なタスクは次のとおりです。
makeXSLDocument()を起動して入力XSLTスタイルシートを解析します。
runDOMBuilders()をコールして、インスタンス・ドキュメント(変換されるドキュメント)の解析を開始し、解析後にドキュメントを変換します。
XMLの処理が開始すると、プログラムに制御が戻り、バックグラウンドで処理が実行されるまで待機します。最後のリクエストが完了すると、メソッドが終了します。
次のコードは、asyncTransform()メソッドの実装を示します。
void asyncTransform () throws Exception
{
System.err.println (numXMLDocs +
" XML documents will be transformed" +
" using XSLT stylesheet specified in " + xslFile +
" with " + numXMLDocs + " threads");
makeXSLDocument ();
runDOMBuilders ();
// wait for the last request to complete
while (rm.activeFound())
Thread.sleep(100);
}
次の項では、makeXSLDocument()メソッドおよびrunDOMBuilders()メソッドについて説明します。
makeXSLDocument()メソッドは、入力スタイルシートの簡単なDOM解析を示します。非同期解析は使用しません。使用する解析方法は、「基本的なDOM解析の実行」で説明している方法と同じです。
メソッドは次の手順を実行します。
新規DOMParser()オブジェクトを作成します。DOMSample.javaの次のコード部分は、この方法を示します。
DOMParser parser = new DOMParser();
パーサーを構成します。次のコード部分は、空白の保持を指定します。
parser.setPreserveWhitespace(true);
入力スタイルシートからURLオブジェクトを作成します。次のコード部分は、このタスクを実行するためにcreateURL()ヘルパー・メソッドを起動します。
xslURL = createURL (xslFile);
入力XSLTスタイルシートを解析します。この方法を示す文は次のとおりです。
parser.parse (xslURL);
メモリー内DOMツリーのルートへのハンドルを取得します。XMLDocumentオブジェクトを使用して、解析済XML文書のすべての部分にアクセスできます。この方法を示す文は次のとおりです。
xsldoc = parser.getDocument();
runDOMBuilders()メソッドは、DOMBuilder BeanおよびXSLTransformer Beanを使用して非同期処理を実行する方法を示します。XMLの解析および変換は、バックグラウンドで実行されます。
メソッドは次の手順を実行します。
入力XML文書を管理するリソース・マネージャを作成します。forループが作成され、XML文書が取得されます。次のコード部分は、この方法を示します。
rm = new ResourceManager (numXMLDocs);
for (int i = 0; i < numXMLDocs; i++)
{
rm.getResource();
...
}
入力XML文書ごとにDOMビルダーBeanをインスタンス化します。次に例を示します。
DOMBuilder builder = new DOMBuilder(i);
XMLファイル名からURLオブジェクトを作成します。次に例を示します。
DOMBuilder builder = new DOMBuilder(i);
URL xmlURL = createURL(basedir + "/" + (String)xmlfiles.elementAt(i));
if (xmlURL == null)
exitWithError("File " + (String)xmlfiles.elementAt(i) + " not found");
DOMビルダーを構成します。次のコード部分は、空白の保持を指定し、文書のベースURLを設定します。
builder.setPreserveWhitespace(true); builder.setBaseURL (createURL(basedir + "/"));
DOMビルダーのリスナーを追加します。addDOMBuilderListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、DOMBuilderListenerインタフェースを実装する必要があります。プログラムでは、domBuilderStarted()およびdomBuilderError()には何も処理が実装されませんが、XML文書の解析が完了したときにコールされるdomBuilderOver()メソッドには、実際に処理を行う実装が必要です。このメソッドは、XMLの変換を行うrunXSLTransformer()メソッドを起動します。このメソッドの詳細は、「XSLTransformer BeanによるXMLの変換」を参照してください。
次のコード部分は、リスナーを追加する方法を示します。
builder.addDOMBuilderListener
(
new DOMBuilderListener()
{
public void domBuilderStarted(DOMBuilderEvent p0) {}
public void domBuilderError(DOMBuilderEvent p0) {}
public synchronized void domBuilderOver(DOMBuilderEvent p0)
{
DOMBuilder bld = (DOMBuilder)p0.getSource();
runXSLTransformer (bld.getDocument(), bld.getId());
}
}
);
DOMビルダーのエラー・リスナーを追加します。addDOMBuilderErrorListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、DOMBuilderErrorListenerインタフェースを実装する必要があります。次のコード部分は、実装方法を示します。
builder.addDOMBuilderErrorListener
(
new DOMBuilderErrorListener()
{
public void domBuilderErrorCalled(DOMBuilderErrorEvent p0)
{
int id = ((DOMBuilder)p0.getSource()).getId();
exitWithError("Error occurred while parsing " +
xmlfiles.elementAt(id) + ": " +
p0.getException().getMessage());
}
}
);
ドキュメントを解析します。この方法を示す文は次のとおりです。
builder.parse (xmlURL);
System.err.println("Parsing file " + xmlfiles.elementAt(i));
DOM解析が完了すると、DOMリスナーは通知を受信します。domBuilderOver()メソッドは、このイベントに応答するための動作を実装します。プログラムからrunXSLTransformer()メソッドにDOMを渡すことで、XSLT変換を開始します。
メソッドは次の手順を実行します。
XSLTransformer Beanをインスタンス化します。このオブジェクトは、XSLT処理を実行します。この方法を示す文は次のとおりです。
XSLTransformer processor = new XSLTransformer (id);
新規スタイルシート・オブジェクトを作成します。次に例を示します。
XSLStylesheet xsl = new XSLStylesheet (xsldoc, xslURL);
XSLTプロセッサを構成します。たとえば、次の文は、警告を表示するようにプロセッサを設定し、エラー出力ストリームを構成します。
processor.showWarnings (true); processor.setErrorStream (errors);
XSLTプロセッサのリスナーを追加します。プログラムからaddXSLTransformerListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、XLSTransformerListenerインタフェースを実装する必要があります。プログラムでは、xslTransformerStarted()およびxslTransformerError()には何も処理が実装されませんが、XML文書の解析が完了したときにコールされるxslTransformerOver()メソッドには、実際に処理を行う実装が必要です。このメソッドは、変換結果をファイルに出力するsaveResult()を起動します。
次のコード部分は、リスナーを追加する方法を示します。
processor.addXSLTransformerListener
(
new XSLTransformerListener()
{
public void xslTransformerStarted (XSLTransformerEvent p0) {}
public void xslTransformerError(XSLTransformerEvent p0) {}
public void xslTransformerOver (XSLTransformerEvent p0)
{
XSLTransformer trans = (XSLTransformer)p0.getSource();
saveResult (trans.getResult(), trans.getId());
}
}
);
XSLTプロセッサのエラー・リスナーを追加します。プログラムからaddXSLTransformerErrorListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、XLSTransformerErrorListenerインタフェースを実装する必要があります。次のコード部分は、実装方法を示します。
processor.addXSLTransformerErrorListener
(
new XSLTransformerErrorListener()
{
public void xslTransformerErrorCalled(XSLTransformerErrorEvent p0)
{
int i = ((XSLTransformer)p0.getSource()).getId();
exitWithError("Error occurred while processing " +
xmlfiles.elementAt(i) + ": " +
p0.getException().getMessage());
}
}
);
XSLTスタイルシートを使用してXML文書を変換します。この方法を示す文は次のとおりです。
processor.processXSL (xsl, xml);
「XMLDiff」で説明しているように、XDK Beanを使用してXML文書の構造および重要なコンテンツを比較できます。
XMLDiffSample.javaプログラムは、XMLDiff Beanの使用方法を示します。このプログラムは次のメソッドを実装します。
showDiffs()
doXSLTransform()
createURL()
プログラムの基本的なアーキテクチャは次のとおりです。
このプログラムは、クラスで使用されるフィールドを宣言および初期化します。XMLDiffFrame型のフィールドが1つあります。これはXMLDiffFrame.javaデモで実装されるクラスです。クラスでは次のフィールドを定義します。
protected XMLDocument doc1; /* DOM tree for first file */
protected XMLDocument doc2; /* DOM tree for second file */
protected static XMLDiffFrame diffFrame; /* GUI frame */
protected static XMLDiffSample dfxApp; /* XMLDiff sample application */
protected static XMLDiff xmlDiff; /* XML diff object */
protected static XMLDocument xslDoc; /* parsed xsl file */
protected static String outFile = new String("XMLDiffSample.xsl"); /* output
xsl file name */
main()メソッドが次のようにXMLDiffSampleオブジェクトを作成します。
dfxApp = new XMLDiffSample();
main()メソッドが、比較の結果を表示するためのJFrameを追加および初期化します。この方法を示すコードは次のとおりです。
diffFrame = new XMLDiffFrame(dfxApp); diffFrame.addTransformMenu();
main()メソッドがXMLDiff Beanをインスタンス化します。この方法を示すコードは次のとおりです。
xmlDiff = new XMLDiff();
main()メソッドがshowDiffs()メソッドを起動します。このメソッドは、次のタスクを実行します。
XMLDiff.diff()を起動して、入力XML文書を比較します。
入力文書の1つを他の文書に変換できるXSLTスタイルシートを生成し、表示します。
次のコード部分は、showDiffs()メソッド・コールを示します。
if (args.length == 3) outFile = args[2]; if(args.length >= 2) dfxApp.showDiffs(new File(args[0]), new File(args[1])); diffFrame.setVisible(true);
次の項では、showDiffs()メソッドについて説明します。
showDiffs()メソッドは、XMLDiff Beanの使用方法を示します。
メソッドは次の手順を実行します。
XMLDiffプロセッサに対してファイルを設定します。この方法を示す文は次のとおりです。
xmlDiff.setFiles(file1, file2);
ファイルを比較します。diff()メソッドは、入力文書の構造および内容が同一であるかどうかを示すブール値を戻します。同一である場合は、XMLDiffFrameクラスで実装されたJFrameにメッセージが出力されます。次のコード部分は、この方法を示します。
if(!xmlDiff.diff())
{
JOptionPane.showMessageDialog
(
diffFrame,
"Files are equivalent in XML representation",
"XMLDiffSample Message",
JOptionPane.PLAIN_MESSAGE
);
}
2つのドキュメントの差分を示すXSLTスタイルシート用にDOMを生成します。次のコード部分は、この方法を示します。
xslDoc = xmlDiff.generateXSLDoc();
XMLDiffFrameで実装されたJFrameにドキュメントを表示します。XMLSourceView Beanをインスタンス化するXMLDiffFrameは、非推奨です。メソッドは次の手順を実行します。
入力ドキュメントのためのソース・ペインを作成します。次に示すように、diffFrameオブジェクトに2つのドキュメントのDOMハンドルを渡して、ソース・ペインを作成します。
diffFrame.makeSrcPane(xmlDiff.getDocument1(), xmlDiff.getDocument2());
ドキュメントの差分を表示するペインを作成します。次に示すように、テキスト・ペインへの参照をdiffFrameに渡します。
diffFrame.makeDiffSrcPane(new XMLDiffSrcView(xmlDiff.getDiffPane1()),
new XMLDiffSrcView(xmlDiff.getDiffPane2()));
XSLTスタイルシートのペインを作成します。次に示すように、スタイルシートのDOMを渡します。
diffFrame.makeXslPane(xslDoc, "Diff XSL Script"); diffFrame.makeXslTabbedPane();