D Oracle XML Developer's Kit JavaBeans (非推奨)
非推奨のOracle XML Developer's Kit (XDK) JavaBeansについて説明します。
注意:
この付録で説明するXDK JavaBeansとこれに対応するXDK Javaアプリケーション・プログラミング・インタフェース(API)パッケージおよびクラスは、Oracle Database 12cリリース1 (12.1)では非推奨です。これらのコンポーネントはOracle Database 12c リリース1(12.1)でも引続きサポートされていますが、新しいアプリケーションでは使用しないことをお薦めします。この機能は、代替なしで非推奨になります。
関連項目:
非推奨になったXDK Java APIの詳細は、Oracle Database XML Java APIリファレンスを参照してください
D.1 XDK JavaBeansの概要
XDK JavaBeansは、Javaアプリケーションおよびアプレットで使用できるExtensible Markup Language (XML)コンポーネントのセットです。
D.1.1 XDK JavaBeansの使用の前提条件
XDK JavaBeansの使用の前提条件について説明します。
この付録では、次のテクノロジを十分に理解していると想定します。
-
JavaBeans。JavaBeansのコンポーネント(Bean)は、ビルダー・ツールでビジュアルに操作できる再利用可能なソフトウェア・コンポーネントです。
-
Java Database Connectivity (JDBC): XDK JavaBeansにはデータベースへの接続性もあります。BeanはJDBC対応のデータベースに直接接続し、XMLおよびExtensible Stylesheet Language (XSL)ファイルを取得および格納できます。
-
Document Object Model (DOM): DOMは、XML文書の構造を示すインメモリー・ツリー表現です。
-
Simple API for XML (SAX): SAXは、イベントベースのXML解析の標準です。
-
XMLスキーマ言語。概要および関連資料へのリンクは、「XML Schema Processor for Javaの使用」を参照してください。
D.1.2 XDK JavaBeansの標準および仕様
XDK JavaBeansには、XDKバージョン1.2以上が必要です。XDK JavaBeansは、JDK 1.2以上のすべてのバージョンで使用できます。XDK JavaBeansはSun JavaBeans仕様に準拠し、java.beans.SimpleBeanInfo
を拡張する必須のBeanInfo
クラスが含まれます。
JavaBeans 1.01仕様は、JDK 1.1でのJavaBeansについて記述したものです。
JavaBeansコア仕様にJava 2プラットフォームへの対応が追加され、より高度なJavaBeansコンポーネントを作成する標準手段が開発者に提供されました。
関連項目:
JavaBeans仕様については、OTNのXDKを参照してください
D.1.3 XDK JavaBeansの機能
XDK JavaBeansを使用すると、グラフィカル・ユーザー・インタフェース(GUI)のXMLアプリケーションへの追加が簡単になります。Beanのカプセル化には、Oracle JDeveloperなどのJava統合開発環境(IDE)から直接アクセスできるドキュメントおよびディスクリプタが含まれます。
D.1.3.1 DOMBuilder
oracle.xml.async.DOMBuilder
Beanは、XML文書からDOMツリーを構築します。DOMBuilder
JavaBeanは、Beanインタフェースを使用してXMLパーサーのクラスDOMParser
をカプセル化し、非同期解析をサポートします。リスナーを登録すると、Javaプログラムで大規模または複数のドキュメントの解析を開始し、制御をすぐにコール元に戻すことができます。
このBeanの大きなメリットは、複数のファイルを解析する場合の効率の向上であり、ファイルが大きい場合は特に効果的です。DOMBuilder
は、対話式のビジュアル・アプリケーションのバックグラウンド・スレッドで、非同期解析を行うこともできます。非同期解析を行わない場合、ドキュメントの解析が終わるまでGUIを有効に使用できません。DOMBuilder
を使用すると、解析メソッドを起動した後、アプリケーションに制御が戻ります。アプリケーションでは、プログレス・バーを表示したり、ユーザーが解析を取り消したりできます。
D.1.3.2 XSLTransformer
oracle.xml.async.XSLTransformer
JavaBeanは、非同期変換をサポートします。これは、XML文書を受け入れて、Extensible Stylesheet Language Transformation (XSLT)スタイルシートを適用して出力ファイルを作成します。XML文書をXML、HTML、データ定義言語(DDL)などのほぼすべてのテキストベースの形式に変換できます。
このBeanは、サーバー側のアプリケーションまたはサーブレットがXML文書(問合せ結果のXML表現など)をブラウザで表示するためにHTMLでレンダリングするための基礎として使用できます。
XSLTransformer
Beanの主なメリットは、複数のファイルを同時に変換できることです。DOMBuilder
と同様に、このBeanをビジュアル・アプリケーションで使用すると、GUIが長い期間応答しなくなることを防止できます。XSLTransformerListener
インタフェースを実装すると、変換が完了したときに起動元のアプリケーションに通知されます。
D.1.3.3 DBAccess
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
操作の実行
D.1.3.4 XMLDBAccess
oracle.xml.xmldbaccess.XMLDBAccess
Beanは、DBAccess
Beanを拡張してXMLType
表に格納されたXML文書をサポートします。このクラスは、XMLType
インスタンスおよびそれらの表を表示、削除または取得するメソッドを提供します。たとえば、getXMLXPathTextData()
メソッドは、XML文書からXPath式の値を取得します。
DBAccess
JavaBeanは、複数のXML文書およびテキスト・ドキュメントを保持できるXMLType
表をメンテナンスします。各XML文書またはテキスト・ドキュメントは、表の行として格納されます。表は、次のStructured Query Language (SQL)文で作成されます。
CREATE TABLE (FILENAME CHAR( ) UNIQUE,
FILEDATA SYS.XMLType);
FILENAME
フィールドには、その行を検索、更新または削除するためにキーとして使用される一意の文字列があります。文書のテキストはFILEDATA
フィールドに格納されます。
XMLDBAccess
Beanが実行するタスクは次のとおりです。
-
XMLType
表の作成および削除 -
XMLType
列の内容の表示 -
XMLType
表に格納されたXML文書に対するINSERT
、UPDATE
およびDELETE
操作の実行
D.1.3.5 XMLDiff
XML文書を比較する場合は、文字単位で比較しても通常は役に立ちません。ほとんどのXMLの比較は、空白の違いではなく、構造や有意なテキスト・コンテンツの相違に関する比較です。
oracle.xml.differ.XMLDiff
Beanが実行するタスクは次のとおりです。
-
2つの入力XML文書のDOMツリーを構築および比較して、それらの文書が異なるかどうかを示します。
-
2つのXMLファイルの差分をグラフィカルに表示します。具体的には、ノードの挿入、削除、変更または移動を参照できます。
-
入力XML文書の1つを他方の文書に変換できるXSLTスタイルシートを生成します。
XMLDiff
Beanは、特にパイプライン・アプリケーションで役立ちます。たとえば、アプリケーションでXML文書を更新し、前のバージョンの文書と比較し、それらの違いを示すXSLTスタイルシートを格納できます。
D.1.3.6 XMLCompress
Oracle XML Parserには、XML文書オブジェクトをバイナリ・ストリームとしてシリアライズできる圧縮プログラムが含まれています。
詳細は、「XMLの圧縮と解凍」を参照してください。便利なツールではありますが、XMLパーサーによる圧縮には次の短所があります。
-
XMLデータをデシリアライズしたとき、再解析が必要になります。
-
タグの中にXMLデータをカプセル化すると、サイズが大幅に増加します。
oracle.xml.xmlcomp.XMLCompress
Beanは、XML圧縮機能をカプセル化したものです。これを使用してXMLをシリアライズおよびデシリアライズすると、次の利点があります。
-
DOMをシリアライズするメソッドをカプセル化し、ストリーム形式にします。
-
XMLプロセッサは、XMLを再解析せずに圧縮ストリームからDOMを再生成できます。
このBeanは、DOMParser
またはSAXParser
によって解析された入力XMLの圧縮と解凍をサポートします。DOM圧縮は、XMLType
型、CLOB
型およびBLOB
型の入力をサポートします。
様々な解析オプションを使用するには、入力前に文書を解析してから、XMLDocument
オブジェクトをCompressor Beanに渡します。圧縮係数は、入力XMLファイルおよび圧縮したファイルのサイズに基づく大まかな値です。圧縮係数メソッドは、java.io.File
オブジェクトをパラメータとして使用して圧縮を行う場合にのみ使用できます。
D.1.3.7 XSDValidator
oracle.xml.schemavalidator.XSDValidator
Beanは、XSDValidator
クラスをカプセル化し、DOMツリーの検証機能を追加します。
このBeanの便利な機能は、検証エラーに関する機能です。アプリケーションで検証エラーが発生すると、メソッドgetStackList()
によって無効なノードを示すDOMツリー・パスのリストが戻されます。エラーのあるノードはスタック・ツリーのベクターに戻され、このスタックの最上位要素がルート・ノードに相当します。子ノードは、スタックから取り出して取得できます。getStackList()
を使用するには、java.util.Vector
クラスおよびjava.util.Stack
クラスのインスタンス化を使用する必要があります。
D.2 XDK JavaBeansの使用: 概要
このトピックでは、JavaBeansの基本的な使用方法とデモ・プログラムの実行について説明します。
D.2.1 XDK JavaBeansの使用: 基本プロセス
より有用なBeanを使用するJavaアプリケーションのプログラム・フローについて説明します。これには、DOMBuilder
、XSLTransformer
、XMLDBAccess
およびXMLDiff
が含まれます。
D.2.1.1 DOMBuilder JavaBeanの使用: 基本プロセス
クラスDOMBuilder
は、World Wide Web Consortium (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
は、「XML Parsing for Java」で説明されています。表D-1に、javax.xml.async
パッケージの最も重要なDOM関連クラスおよびインタフェースを示します。
表D-1 javax.xml.asyncのDOM関連クラスおよびインタフェース
クラス/インタフェース | 説明 |
---|---|
|
XMLパーサーをカプセル化し、XML文書を解析してDOMツリーを構築します。解析は別のスレッドで行われます。ツリーが構築されたときに通知されるようにするには |
|
|
|
非同期解析時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
|
解析例外が発生したときに送信されるエラー・イベントを定義します。 |
|
解析中に検出されたエラーの通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
図D-1に、DOMBuilder
JavaBeanを使用するアプリケーションの基本プロセスを示します。
図D-1に示されたXML処理は次のとおりです。
D.2.1.2 XSLTransformer JavaBeanの使用: 基本プロセス
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
サブパッケージの詳細は、「XML Parsing for Java」を参照してください。表D-2に、javax.xml.async
パッケージの最も重要なXSL関連クラスおよびインタフェースを示します。
表D-2 javax.xml.asyncのXSL関連クラスおよびインタフェース
クラス/インタフェース | 説明 |
---|---|
|
バックグラウンド・スレッドでXSLT変換を適用します。 |
|
|
|
非同期変換時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
|
|
|
非同期変換時のエラー・イベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
図D-2に、XSLTransformer
Beanの使用方法を示します。
図D-2に示された処理は、次のとおりです。
- XSLTスタイルシートとXMLインスタンス・ドキュメントを入力します。
- XSLTリスナーを追加します。プログラムで、
XSLTransfomer.addXSLTransformerListener()
メソッドを起動します。 - スタイルシートを適用します。
XSLTransfomer.processXSL()
メソッドは、XSLT変換をバックグラウンドで開始します。 - オプションで、
XSLTransformer
Beanを使用してその他の処理を実行します。 - プログラムが非同期コールを受信したとき、XSLTリスナーを起動します。このリスナーは、
XSLTransformerListener
インタフェースを実装する必要があり、xslTransformerOver()
メソッドの起動によってコールされます。 - 変換結果をフェッチします。
XSLTransformer.getResult()
メソッドを起動して、結果文書のXML文書フラグメントを戻します。 - XML文書フラグメントを出力します。
D.2.1.3 XMLDBAccess JavaBeanの使用: 基本プロセス
XMLDBAccess
Beanの基本的な使用方法について説明します。
XMLDBAccess
Beanを使用するアプリケーションを開発する場合、次のサブパッケージを使用する必要があります。
-
oracle.xml.xmldbaccess
:XMLDBAccess
Beanが含まれます。 -
oracle.xml.parser.v2
: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。
oracle.xml.parser.v2
サブパッケージの詳細は、「XML Parsing for Java」を参照してください。表D-3に、XMLDBAccess
クラスの重要なメソッドを示します。
表D-3 XMLDBAccessのメソッド
クラス/インタフェース | 説明 |
---|---|
|
|
|
テキスト・ファイルを |
|
テキスト・ファイルを |
|
指定された文字列で開始する名前を持つXML表をすべて取得します。 |
|
|
|
XPath式に基づいて |
図D-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()
を起動します。 - 接続を終了します。
D.2.1.4 XMLDiff JavaBeanの使用: 基本プロセス
XMLDiff
Beanの基本的な使用方法について説明します。
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
の詳細は、「XML Parsing for Java」を参照してください。表D-4に、クラスXMLDiff
の重要なメソッドを示します。
表D-4 XMLDiffのメソッド
クラス/インタフェース | 説明 |
---|---|
|
2つの入力XMLファイルまたは2つのXMLDocumentオブジェクトの差分を検出します。 |
|
2つの入力XMLファイルの差分を表すXSLファイルを生成します。生成されたスタイルシートを使用して、最初のXMLファイルを2つ目のXMLファイルに変換できます。2つのXMLファイルが同じである場合は、生成されたXSLで最初のXMLファイルを2つ目のXMLファイルに変換でき、ここで最初のファイルと2つ目のファイルは同等です。 関連メソッドは、 |
|
比較するXMLファイルを設定します。 |
|
最初のXMLツリーのドキュメント・ルートを |
|
テキスト・パネルを、最初のXMLファイルの差分をビジュアルに表示する |
図D-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ツリーを表示します。
D.2.2 XDK JavaBeanのデモ・プログラムの実行
XDK SJavaBeansのデモ・プログラムは、ディレクトリ$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
にあります。
表D-5に、デモ・ディレクトリにあるサンプル・プログラムを示します。表の最初の列に、非推奨のBeanがどのサンプル・プログラムで使用されているかを示します。
表D-5 JavaBeanのサンプルJavaソース・ファイル
サンプル | ファイル名 | 説明 |
---|---|---|
(非推奨) |
|
このビジュアル・アプリケーションでは、 |
(非推奨) |
|
このサンプルのビジュアル・アプリケーションでは、 |
|
|
この非ビジュアル・アプリケーションでは、 |
(非推奨) |
|
このビジュアル・アプリケーションでは、 |
(非推奨) |
|
この |
(非推奨) |
|
この |
|
|
この非ビジュアル・アプリケーションでは、
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 |
(非推奨) |
|
|
(非推奨) |
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 |
(非推奨) |
|
GUIの情報をBeanにパイプする単純なクラスです。このクラスは、 |
(非推奨) |
|
|
(非推奨) |
|
|
(非推奨) |
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 |
(非推奨) |
|
解析済のXMLインスタンス・ドキュメントをツリーとして表示する |
(非推奨) |
|
このビジュアル・アプリケーションでは、 |
(非推奨) |
|
|
|
|
このアプリケーションは、 |
表D-6に、デモ・プログラムで使用されるその他のファイルを示します。
表D-6 JavaBeanのサンプル・ファイル
ファイル名 | 説明 |
---|---|
|
|
|
|
|
このXML文書は、 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
サンプル・プログラムのコンパイル方法および実行方法は、同じディレクトリにあるREADME
に示されています。この場合、基本的なステップは次のようになります。
D.2.2.1 sample1の実行
sample1
は、XMLTransViewer
Beanを使用するプログラムです。
次のように手動でプログラムを実行できます。
java XMLTransformPanelSample
このプログラムを使用して、OracleデータベースのXMLファイルをインポートおよびエクスポートし、データベースにXSL変換ファイルを格納し、XMLにスタイルシートを対話式に適用できます。このプログラムでデータベース接続機能を使用するには、データベースを実行しているコンピュータのネットワーク名、ポート(通常は1521
)およびOracleインスタンスの名前(通常はorcl
)を把握しておく必要があります。また、CREATE TABLE
権限を持つアカウントも必要です。サンプル・スキーマをインストールした場合は、アカウントhr
を使用できます。XMLTransViewer
プログラムを使用して、XMLファイルにスタイルシート変換を適用し、結果を表示できます。表示されるパネルの上部および下部にはタブがあります。上部にある最初の2つのタブを使用して、XMLバッファとXSLTバッファを切り替えることができます。3つ目のタブでは、XMLバッファに対してXSLT変換を実行し、結果を表示します。下部にある最初の2つのタブを使用して、Oracleデータベースおよびファイル・システムのデータをロードおよび保存できます。下部の残りのタブでは、現在のコンテンツの表示をツリー表示、XMLソース、編集モードまたはHTML(変換後の結果の表示の場合)に切り替えます。
D.2.2.2 sample2の実行
sample2
は、XMLSourceView
およびXMLTreeView
BeanのGUIベースのデモで、非推奨です。ViewSample
プログラムでは、booklist.xml
ファイルが、ソース表示とツリー表示に別々に示されます。
次のように手動でプログラムを実行できます。
java ViewSample
D.2.2.3 sample3の実行
sample3
は、非同期のDOMBuilder
BeanおよびXSLTransformer
Beanの非ビジュアルなデモです。AsyncTransformSample
プログラムは、現在のディレクトリ内のすべての*.xml
ファイルにdoc.xsl
XSLTスタイルシートを適用します。結果は、拡張子が.log
であるファイルに書き込まれます。
次のように手動でプログラムを実行できます。
java AsyncTransformSample
D.2.2.4 sample4の実行
sample4
はDBViewer
Beanのビジュアルなデモで、非推奨です。
これは、次のように実行されます。
JDBC接続情報は、デモで使用されるクラスを実装するDBViewClaims.java
ソース・ファイルにハードコードされています。特に、USERID
、PASSWORD
およびその他の値は、Makefile
に設定された値であることが前提になっています。使用する構成が異なる場合は、DBViewClaims.java
の92行にナビゲートし、setUsername()
、setPassword()
およびその他を現在のOracleデータベース構成を反映した値に変更します。
D.2.2.5 sample5の実行
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>
D.2.2.6 sample6の実行
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.*; */
D.2.2.7 sample7の実行
sample7
のビジュアル・デモでは、XMLCompress
Beanの使用方法を示します。クラスcompviewer
を使用すると、GUIを起動して、XMLファイルとデータベースから取得したデータを圧縮および解凍できます。ロード・オプションにより、データをファイル・システムまたはデータベースから取得できます。
このアプリケーションでは、データベースからの圧縮データのロードおよび保存はサポートされません。圧縮係数は、XMLデータの圧縮率を示す大まかな値です。
次のように手動でプログラムを実行できます。
java compviewer
D.2.2.8 sample8の実行
sample8
デモでは、XMLTreeViewer
Beanを使用します。XMLSchemaTreeViewer
プログラムを使用すると、XMLDocument
をツリー形式で表示できます。ユーザーは、XMLスキーマ・ドキュメントを入力して、インスタンス・ドキュメントをスキーマに対して検証できます。ドキュメントが無効な場合は、無効なノードが強調表示され、エラー・メッセージが表示されます。
また、すべてのライン情報のログが専用のパネルに表示され、このパネルを使用してインスタンス・ドキュメントを編集および再評価できます。サンプル・ファイルpurchaseorder.xml
およびpurchaseorder.xsd
を使用して、このプログラムをテストします。インスタンス・ドキュメントpurchaseorder.xml
は、purchaseorder.xsd
で定義されたスキーマに準拠していません。
次のように手動でプログラムを実行できます。
java XMLSchemaTreeViewer
D.2.2.9 sample9の実行
sample9
デモでは、SourceViewer
Beanを使用します。XMLSrcViewer
プログラムでは、構文の強調表示を有効にして、XML文書またはDTDを表示できます。入力したXMLスキーマまたはDTDに対して文書を検証できます。内部または外部のDTDを使用できます。
検証が成功した場合は、「ソース表示」ペインでインスタンス・ドキュメントおよびXMLスキーマまたはDTDを表示できます。スキーマ検証でエラーが検出された場合は、「エラー」ペインにエラー・ログと行番号が表示されます。「ソース表示」ペインには、エラー・ノードがハイライトされた状態でXML文書が表示されます。サンプル・ファイルpurchaseorder.xml
およびpurchaseorder.xsd
をは、XMLスキーマ検証のエラーをテストするために使用できます。note_in_dtd.xml
をDTD検証モードで使用すると、検証エラーとともに内部DTDを表示できます。次のように手動でプログラムを実行できます。
java XMLSrcViewer
D.2.2.10 sample10の実行
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
D.3 XDK JavaBeansでのXMLの処理
このトピックでは、DOMBuilder
BeanとXSLTransformer
Beanを使用したXML文書の非同期処理、およびXmlDiff
Beanを使用したXML文書の比較について説明します。
D.3.1 DOMBuilder BeanおよびXSLTransformer BeanによるXMLの非同期処理
XDK JavaBeansを使用して、XMLの非同期処理を実行できます。
詳細は、「XSLTransformer」を参照してください。
AsyncTransformSample.java
プログラムは、DOMBuilder
Beanおよび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); }
-
D.3.1.1 入力XSLTスタイルシートの解析
XSLTスタイルシートの解析について説明します。
メソッドmakeXSLDocument()
は、スタイルシートの単純なDOM解析を実行します。非同期解析は使用しません。方法は、「基本的なDOM解析の実行」で説明している方法と同じです。
メソッドは次のステップを実行します。
D.3.2 XMLDiff JavaBeanによるXML文書の比較
XDK JavaBeansを使用して、XML文書の構造および有意なコンテンツを比較できます。
詳細は、「XMLDiff」を参照してください。
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);
-
D.3.2.1 XMLファイルの比較とスタイルシートの生成
メソッド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();
-