この付録では、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リファレンスを参照してください
XDK JavaBeansは、Javaアプリケーションおよびアプレットで使用できるExtensible Markup Language (XML)コンポーネントのセットです。
内容は次のとおりです。
この付録では、次のテクノロジを十分に理解していると想定します。
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の使用」を参照してください。
XDK JavaBeansには、XDKバージョン1.2以上が必要です。XDK JavaBeansは、JDK 1.2以上のすべてのバージョンで使用できます。XDK JavaBeansはSun JavaBeans仕様に準拠し、java.beans.SimpleBeanInfoを拡張する必須のBeanInfoクラスが含まれます。
JDK 1.1のJavaBeansについて記述したJavaBeans 1.01仕様は、次の場所で入手できます。
http://www.oracle.com/technetwork/java/index.html
JavaBeansコア仕様にJava 2プラットフォームへの対応が追加され、より高度なJavaBeansコンポーネントを作成する標準手段が開発者に提供されました。Java 2のJavaBeans仕様は、次の場所でも入手できます。
http://www.oracle.com/technetwork/java/index.html
関連項目:
XDKでサポートする標準の概要は、「Oracle XML Developer's Kit標準」を参照してください
XDK JavaBeansを使用すると、グラフィカル・ユーザー・インタフェース(GUI)のXMLアプリケーションへの追加が簡単になります。Beanのカプセル化には、Oracle JDeveloperなどのJava統合開発環境(IDE)から直接アクセスできるドキュメントおよびディスクリプタが含まれます。
XDKに含まれるBeanは次のとおりです。
oracle.xml.async.DOMBuilder Beanは、XML文書からDOMツリーを構築します。DOMBuilder JavaBeanは、Beanインタフェースを使用してXML Parser for JavaのDOMParserクラスをカプセル化し、機能を拡張して非同期解析をサポートします。リスナーを登録すると、Javaプログラムで大規模または連続したドキュメントの解析を開始し、制御をすぐにコール元に戻すことができます。
このBeanの大きなメリットは、複数のファイルを解析する場合の効率の向上であり、ファイルが大きい場合は特に効果的です。DOMBuilderは、対話式のビジュアル・アプリケーションのバックグラウンド・スレッドで、非同期解析を行うこともできます。非同期解析を行わない場合、ドキュメントの解析が終わるまでGUIを有効に使用できません。DOMBuilderを使用すると、解析メソッドを起動した後、アプリケーションに制御が戻ります。アプリケーションでは、プログレス・バーを表示したり、ユーザーが解析を取り消したりできます。
oracle.xml.async.XSLTransformer Beanは、非同期変換をサポートします。XML文書を受け入れ、Extensible Stylesheet Language Transformation (XSLT)スタイルシートを適用して出力ファイルを作成します。XSLTransformer JavaBeanを使用すると、XML文書をXML、HTML、データ定義言語(DDL)などのほぼすべてのテキストベースの形式に変換できます。この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文書またはテキスト・ドキュメントは、表の行として格納されます。表は、次のStructured Query Language (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圧縮機能をカプセル化したものです。これを使用して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の便利な機能は、検証エラーに関する機能です。アプリケーションで検証エラーが発生すると、getStackList()メソッドから、無効なノードを示すDOMツリー・パスのリストが戻ります。エラーのあるノードはスタック・ツリーのベクターに戻され、このスタックの最上位要素がルート・ノードに相当します。子ノードは、スタックから取り出して取得できます。getStackList()を使用するには、java.util.Vectorクラスおよびjava.util.Stackクラスのインスタンス化を使用する必要があります。
内容は次のとおりです。
この項では、実用的なBean(DOMBuilder、XSLTransformer、XMLDBAccessおよびXMLDiff)を使用するJavaアプリケーションのプログラム・フローについて説明します。ここでは、次の項目について説明します。
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処理は次のとおりです。
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 subpackageの詳細は、「XML Parsing for Java」を参照してください。表D-2に、javax.xml.asyncパッケージの最も重要なXSL関連クラスおよびインタフェースを示します。
表D-2 javax.xml.asyncのXSL関連クラスおよびインタフェース
| クラス/インタフェース | 説明 |
|---|---|
|
バックグラウンド・スレッドでXSLT変換を適用します。 |
|
|
|
非同期変換時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
|
|
|
非同期変換時のエラー・イベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。 |
図D-2に、XSLTransformer Beanの使用方法を示します。
図D-2に示された処理は、次のとおりです。
XSLTransfomer.addXSLTransformerListener()methodを起動します。XSLTransfomer.processXSL()メソッドは、XSLT変換をバックグラウンドで開始します。XSLTransformer Beanを使用してその他の処理を実行します。XSLTransformerListenerインタフェースを実装する必要があり、xslTransformerOver()メソッドの起動によってコールされます。XSLTransformer.getResult()メソッドを起動して、結果文書のXML文書フラグメントを戻します。XMLDBAccess Beanを使用するアプリケーションを開発する場合、次のサブパッケージを使用する必要があります。
oracle.xml.xmldbaccess: XMLDBAccess Beanが含まれます。
oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。
oracle.xml.parser.v2 subpackageの詳細は、「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()を起動します。replaceXMLTypeData()を起動します。Stringとして取得します。接続情報、表名およびXMLファイル名を渡して、getXMLTypeData()を起動します。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 subpackageの詳細は、「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ツリーのドキュメント・ルートをXMLDocumentオブジェクトとして取得します。 |
|
テキスト・パネルを、最初のXMLファイルの差分をビジュアルに表示する |
図D-4に、一般的なXMLDiff Beanの使用方法を示します。これは、XMLDiff Beanを使用して入力XML文書を比較し、差分を表示する方法です。
たとえば、XMLDiffプログラムでは、次のようにXML文書を処理できます。
XMLDiffオブジェクトを作成します。Fileオブジェクトを作成し、XMLDiff.setFiles()にオブジェクトへの参照を渡します。diff()メソッドからfalseが戻り、異なる場合はtrueが戻ります。JOptionPane.showMessageDialog()を起動してメッセージを出力します。generateXSLDoc()は、XSLスタイルシートをXMLDocumentとして生成します。XMLDiffによって作成されたDOMツリーを表示します。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ソース・ファイル
| サンプル | ファイル名 | 説明 |
|---|---|---|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample1の実行」 |
(非推奨) |
|
このサンプルのビジュアル・アプリケーションでは、 関連項目: 「sample2の実行」 |
|
|
この非ビジュアル・アプリケーションでは、 関連項目: 「sample3の実行」 |
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample4の実行」 |
(非推奨) |
|
この |
(非推奨) |
|
この |
|
|
この非ビジュアル・アプリケーションでは、
関連項目: 「sample5の実行」 |
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample6の実行」 |
(非推奨) |
|
|
(非推奨) |
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample7の実行」 |
(非推奨) |
|
GUIの情報をBeanにパイプする単純なクラスです。このクラスは、 |
(非推奨) |
|
|
(非推奨) |
|
|
(非推奨) |
|
|
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample8の実行」 |
(非推奨) |
|
解析済のXMLインスタンス・ドキュメントをツリーとして表示する |
(非推奨) |
|
このビジュアル・アプリケーションでは、 関連項目: 「sample9の実行」 |
(非推奨) |
|
|
|
|
このアプリケーションは、 関連項目: 「sample10の実行」 |
表D-6に、デモ・プログラムで使用されるその他のファイルを示します。
表D-6 JavaBeanのサンプル・ファイル
| ファイル名 | 説明 |
|---|---|
|
|
|
|
|
このXML文書は、 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
サンプル・プログラムのコンパイル方法および実行方法は、同じディレクトリにあるREADMEに示されています。この場合、基本的な手順は次のようになります。
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のビジュアルなデモで、非推奨です。これは、次のように実行されます。
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
「XSLTransformer」で説明したように、XDK JavaBeansを使用して非同期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()メソッドは、入力スタイルシートの簡単なDOM解析を示します。非同期解析は使用しません。使用する解析方法は、「基本的なDOM解析の実行」で説明している方法と同じです。
メソッドは次の手順を実行します。
「XMLDiff」で説明しているように、XDK JavaBeansを使用して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()メソッドでは、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();