ヘッダーをスキップ
Oracle XML Developer's Kitプログラマーズ・ガイド
11gリリース1(11.1)
E05676-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

10 XDK JavaBeansの使用

この章の内容は次のとおりです。

XDK JavaBeansの概要

Oracle XML JavaBeansは、Javaのアプリケーションおよびアプレットで使用できるXMLコンポーネントのセットです。

この項の内容は次のとおりです。

前提条件

この章では、次のテクノロジを十分に理解していると想定します。

標準と仕様

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

関連項目:

XDKがサポートする標準の概要は、第31章「XDK標準」を参照してください。

XDK JavaBeansの機能

Oracle XDK JavaBeansを使用すると、XMLアプリケーションにGUIを簡単に追加できます。Beanのカプセル化には、Oracle JDeveloperなどのJava IDEから直接アクセスできるドキュメントおよびディスクリプタが含まれます。

XDKに含まれるBeanは次のとおりです。

DOMBuilder

oracle.xml.async.DOMBuilder Beanは、XML文書からDOMツリーを構築します。DOMBuilder JavaBeanは、Beanインタフェースを使用してXML Parser for JavaのDOMParserクラスをカプセル化し、機能を拡張して非同期解析をサポートします。リスナーを登録すると、Javaプログラムで大規模または連続したドキュメントの解析を開始し、制御をすぐにコール元に戻すことができます。

このBeanの大きなメリットの1つは、複数のファイルを解析する場合の効率の向上であり、ファイルが大きい場合は特に効果的です。DOMBuilderは、対話式のビジュアル・アプリケーションのバックグラウンド・スレッドで、非同期解析を行うこともできます。非同期解析を行わない場合、ドキュメントの解析が終わるまでGUIを有効に使用できません。DOMBuilderを使用すると、解析メソッドをコールした後、アプリケーションに制御が戻ります。アプリケーションでは、プログレス・バーを表示したり、ユーザーが解析を取り消したりできます。

XSLTransformer

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インタフェースを実装すると、変換が完了したときにコール元のアプリケーションに通知されます。

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文書に対するINSERTUPDATEおよびDELETE操作の実行

XMLDBAccess

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文書に対するINSERTUPDATEおよびDELETE操作の実行

XMLDiff

XML文書を比較する場合は、文字単位で比較しても通常は役に立ちません。XMLの比較は、空白の違いではなく、そのほとんどが構造や重要なテキスト・コンテンツの相違に関する比較です。oracle.xml.differ.XMLDiff Beanは、次の有用なタスクを実行します。

  • 2つの入力XML文書のDOMツリーを構築および比較して、それらの文書が異なるかどうかを示します。

  • 2つのXMLファイルの差分をグラフィカルに表示します。具体的には、ノードの挿入、削除、変更または移動を目視できます。

  • 入力XML文書の1つを他方の文書に変換できるXSLTスタイルシートを生成します。

XMLDiff Beanは、特にパイプライン・アプリケーションで役立ちます。たとえば、アプリケーションでXML文書を更新し、前のバージョンの文書と比較し、それらの違いを示すXSLTスタイルシートを格納できます。

XMLCompress

「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オブジェクトをパラメータとして使用して圧縮を行う場合にのみ使用できます。

XSDValidator

oracle.xml.schemavalidator.XSDValidator Beanは、XSDValidatorクラスをカプセル化し、DOMツリーの検証機能を追加します。このBeanの最も便利な機能の1つは、検証エラーに関する機能です。アプリケーションで検証エラーが発生すると、getStackList()メソッドから、無効なノードを示すDOMツリー・パスのリストが戻ります。エラーのあるノードはスタック・ツリーのベクターに戻され、このスタックの最上位要素がルート・ノードに相当します。子ノードは、スタックから取り出して取得できます。getStackList()を使用するには、java.util.Vectorクラスおよびjava.util.Stackクラスのインスタンス化を使用する必要があります。

XDK JavaBeansの使用: 概要

この項の内容は次のとおりです。

XDK JavaBeansの使用: 基本プロセス

この項では、実用的なBean(DOMBuilderXSLTransformerXMLDBAccessおよびXMLDiff)を使用するJavaアプリケーションのプログラム・フローについて説明します。この項の内容は次のとおりです。

DOMBuilder JavaBeanの使用: 基本プロセス

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関連クラスおよびインタフェース

クラス/インタフェース 説明

DOMBuilderクラス

XMLパーサーをカプセル化し、XML文書を解析してDOMツリーを構築します。解析は別のスレッドで行われます。ツリーが構築されたときに通知されるようにするにはDOMBuilderListenerインタフェースを使用する必要があります。

DOMBuilderEventクラス

DOMBuilderがすべての登録済リスナーに解析イベントに関する通知を行うために使用するイベント・オブジェクトをインスタンス化します。

DomBuilderListenerインタフェース

非同期解析時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。addDOMBuilderListener()メソッドを使用して、このインタフェースを実装するクラスをDOMBuilderに追加する必要があります。

DOMBuilderErrorEventクラス

解析例外が発生したときに送信されるエラー・イベントを定義します。

DomBuilderErrorListenerインタフェース

解析中に検出されたエラーの通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。addDOMBuilderErrorListener()メソッドを使用して、このインタフェースを実装するクラスをDOMBuilderに追加する必要があります。


図10-1に、DOMBuilder JavaBeanを使用するアプリケーションの基本プロセスを示します。

図10-1 DOMBuilder JavaBeanの使用方法

図については次のテキストで説明しています。
「図10-1 DOMBuilder JavaBeanの使用方法」の説明

図10-1に示されたXML処理は次のとおりです。

  1. 入力XML文書を解析します。このプログラムはXML文書をファイル、文字列バッファまたはURLとして受け取ることができます。

  2. DOMBuilderリスナーを追加します。プログラムで、DOMBuilder.addDOMBuilderListener(DOMBuilderListener)メソッドを起動します。

  3. XML文書を解析します。プログラムで、DOMBuilder.parse()メソッドを起動します。

  4. オプションで、解析結果をさらに処理します。

  5. プログラムが非同期コールを受信したとき、リスナーをコールします。このリスナーは、DOMBuilderListenerインタフェースを実装する必要があり、DOMBuilderOver()メソッドの起動によってコールされます。

    使用可能なDOMBuilderListenerメソッドは次のとおりです。

    • domBuilderError(DOMBuilderEvent): 解析エラーが発生したときにコールします。

    • domBuilderOver(DOMBuilderEvent): 解析が完了したときにコールします。

    • domBuilderStarted(DOMBuilderEvent): 解析が開始したときにコールします。

  6. DOMをフェッチします。DOMBuilder.getDocument()メソッドを起動して結果のDOM文書をフェッチし、出力します。

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サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-2に、javax.xml.asyncパッケージの最も重要なXSL関連クラスおよびインタフェースを示します。

表10-2 javax.xml.asyncのXSL関連クラスおよびインタフェース

クラス/インタフェース 説明

XSLTransformerクラス

バックグラウンド・スレッドでXSLT変換を適用します。

XSLTransformerEventクラス

XSLTransformerがすべての登録済リスナーにXSLT変換イベントを通知するために使用するイベント・オブジェクトを表します。

XSLTransformerListenerインタフェース

非同期変換時のイベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。addXSLTransformerListener()メソッドを使用して、このインタフェースを実装するクラスをXSLTransformerに追加する必要があります。

XSLTransformerErrorEventクラス

XSLTransformerがすべての登録済リスナーにエラー・イベントに関する通知を行うために使用するエラー・イベント・オブジェクトをインスタンス化します。

XSLTransformerErrorListenerインタフェース

非同期変換時のエラー・イベントに関する通知をプログラムで受信できるようにするには、このインタフェースを実装する必要があります。addXSLTransformerListener()メソッドを使用して、このインタフェースを実装するクラスをXSLTransformerに追加する必要があります。


図10-2に、XSLTransformer Beanの使用方法を示します。

図10-2 XSLTransformer JavaBeanの使用方法

この図は、XSLTransformer Beanの使用方法を示します。
「図10-2 XSLTransformer JavaBeanの使用方法」の説明

図10-2に示された処理は、次のとおりです。

  1. XSLTスタイルシートとXMLインスタンス・ドキュメントを入力します。

  2. XSLTリスナーを追加します。プログラムは、XSLTransfomer.addXSLTransformerListener()methodを起動します。

  3. スタイルシートを適用します。XSLTransfomer.processXSL()メソッドは、XSLT変換をバックグラウンドで開始します。

  4. オプションで、XSLTransformer Beanを使用してその他の処理を実行します。

  5. プログラムが非同期コールを受信したとき、XSLTリスナーをコールします。このリスナーは、XSLTransformerListenerインタフェースを実装する必要があり、xslTransformerOver()メソッドの起動によってコールされます。

  6. 変換結果をフェッチします。XSLTransformer.getResult()メソッドを起動して、結果文書のXML文書フラグメントを戻します。

  7. XML文書フラグメントを出力します。

XMLDBAccess JavaBeanの使用: 基本プロセス

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のメソッド

クラス/インタフェース 説明

createXMLTypeTable()

XMLType表を作成します。

insertXMLTypeData()

テキスト・ファイルをXMLType表の行として挿入します。

replaceXMLTypeData()

テキスト・ファイルをXMLType表の行として置換します。

getXMLTypeTableNames()

指定された文字列で開始する名前を持つXML表をすべて取得します。

getXMLTypeData()

XMLType表からテキスト・ファイルを取得します。

getXMLTypeXPathTextData()

XPath式に基づいてXMLType表からテキスト・データを取得します。


図10-3に、XMLDBAccess Beanの一般的な使用方法を示します。これは、DBAccess Beanを使用して、XMLTypeで格納されたXML文書をメンテナンスおよび操作する方法です。

図10-3 XMLDBAccess JavaBeanの使用方法

この図については次のテキストで説明しています。
「図10-3 XMLDBAccess JavaBeanの使用方法」の説明

たとえば、XMLDBAccessプログラムでは、次のようにXML文書を処理できます。

  1. XMLType表を作成します。データベース接続情報および表名を渡して、createXMLTypeTable()を起動します。

  2. XMLType表のリストを作成します。データベース接続情報および空の文字列を渡して、getXMLTypeTableNames()を起動します。

  3. 表にXMLデータをロードします。データベース接続情報、表名、XMLファイル名およびXMLを含む文字列を渡して、replaceXMLTypeData()を起動します。

  4. XMLデータをStringとして取得します。接続情報、表名およびXMLファイル名を渡して、getXMLTypeData()を起動します。

  5. XPath式に基づいてXMLデータを取得します。接続情報、表名、XMLファイル名およびXPath式を渡して、getXMLXPathTextData()を起動します。

  6. 接続を終了します。

XMLDiff JavaBeanの使用: 基本プロセス

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のメソッド

クラス/インタフェース 説明

diff()

2つの入力XMLファイルまたは2つのXMLDocumentオブジェクトの差分を検出します。

generateXSL()

2つの入力XMLファイルの差分を表すXSLファイルを生成します。生成されたスタイルシートを使用して、最初のXMLファイルを2つ目のXMLファイルに変換できます。2つのXMLファイルが同じである場合は、生成されたXSLで最初のXMLファイルを2つ目のXMLファイルに変換でき、ここで最初のファイルと2つ目のファイルは同等です。

関連メソッドは、generateXSLDoc()およびgenerateXSLFile()です。

setFiles()

比較する必要があるXMLファイルを設定します。

getDocument1()

最初のXMLツリーのドキュメント・ルートをXMLDocumentオブジェクトとして取得します。getDocument2()は、2つ目のツリーに使用する同等のメソッドです。

getDiffPane1()

テキスト・パネルを、最初のXMLファイルの差分をビジュアルに表示するJTextPaneオブジェクトとして取得します。getDiffPane2()は、2つ目のファイルに使用する同等のメソッドです。


図10-4に、XMLDiff Beanの一般的な使用方法を示します。これは、XMLDiff Beanを使用して入力XML文書を比較し、差分を表示する方法です。

図10-4 XMLDiff JavaBeanの使用方法

この図については次のテキストで説明しています。
「図10-4 XMLDiff JavaBeanの使用方法」の説明

たとえば、XMLDiffプログラムでは、次のようにXML文書を処理できます。

  1. XMLDiffオブジェクトを作成します。

  2. 比較するファイルを設定します。入力ファイルのFileオブジェクトを作成し、XMLDiff.setFiles()にオブジェクトへの参照を渡します。

  3. ドキュメントを比較します。XMLファイルが同一の場合はdiff()メソッドからfalseが戻り、異なる場合はtrueが戻ります。

  4. 入力XML文書が同一であるか異なるかに応じて対処します。たとえば、同一である場合は、JOptionPane.showMessageDialog()を起動してメッセージを出力します。

  5. 入力XML文書の差分を示すXSLTスタイルシートを生成します。たとえば、generateXSLDoc()は、XSLスタイルシートをXMLDocumentとして生成します。

  6. XMLDiffによって作成されたDOMツリーを表示します。

JavaBeanのデモ・プログラムの実行

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

(非推奨)

XMLTransformPanelSample.java

このビジュアル・アプリケーションでは、XMLTransformPanel Bean、DOMBuilder BeanおよびXSLTransformer Beanを使用します。このBeanは、XML文書にXSLT変換を適用して結果を表示します。

関連項目: 「sample1の実行」

sample2

(非推奨)

ViewSample.java

このビジュアルなサンプル・アプリケーションでは、XMLSourceView BeanおよびXMLTreeView Beanを使用します。XML文書ファイルをビジュアルに表現します。

関連項目: 「sample2の実行」

sample3

AsyncTransformSample.java

この非ビジュアル・アプリケーションでは、XSLTransformer BeanおよびDOMBuilder Beanを使用します。現在のディレクトリ内のすべての.xmlファイルに対して、doc.xslで指定されたXSLTスタイルシートを適用します。結果は、拡張子が.logであるファイルに書き込まれます。

関連項目: 「sample3の実行」

sample4

(非推奨)

DBViewSample.java

このビジュアル・アプリケーションでは、DBViewer Beanを使用して、保険金請求を処理する簡単なアプリケーションを実装します。

関連項目: 「sample4の実行」


DBViewClaims.java

このJFrameサブクラスはDBViewFrameクラスでインスタンス化され、DBViewFrameクラスはDBViewSampleプログラムでインスタンス化されます。


DBViewFrame.java

このJFrameサブクラスはDBViewSampleプログラムでインスタンス化されます。

sample5

XMLDBAccessSample.java

この非ビジュアル・アプリケーションでは、XMLDBAccess Beanを使用します。XMLDBAccess BeanのAPIを使用して、XMLType表にXML文書を格納し、取得する方法を示します。

XMLTypeを使用するには、Oracle Databaseおよびxdb.jarが必要です。このプログラムは、HOSTNAMEPORTSIDUSERIDおよびPASSWORDの値を受け入れます。データベースの表を作成し、ファイルbooklist.xmlからデータをロードします。出力はxmldbaccess.logに書き込まれます。

関連項目: 「sample5の実行」

sample6

(非推奨)

XMLDiffSample.java

このビジュアル・アプリケーションでは、XMLDiff Beanを使用して、2つのXMLファイルの差分を検出し、XSLTスタイルシートを生成します。このスタイルシートを使用して、最初の入力XMLファイルを2つ目の入力XMLファイルに変換できます。

関連項目: 「sample6の実行」


XMLDiffFrame.java

ActionListenerインタフェースを実装するクラスです。このクラスは、XMLDiffSampleプログラムで使用されます。


XMLDiffSrcView.java

XMLDiffSampleプログラムで使用されるJPanelサブクラスです。

sample7

(非推奨)

compviewer.java

このビジュアル・アプリケーションでは、XMLCompress Beanを使用してXMLを圧縮します。XMLファイルまたはSQL問合せにより取得したXMLデータをXML入力として使用できます。このアプリケーションでは、圧縮ストリームを解凍し、結果のDOMツリーを表示できます。

関連項目: 「sample7の実行」


compstreamdata.java

GUIの情報をBeanにパイプする単純なクラスです。このクラスは、dbpanel.javafilepanel.javaおよびxmlcompressutil.javaで使用されます。


dbpanel.java

xmlcompressutil.javaで使用されるJPanelサブクラスです。


filepanel.java

xmlcompressutil.javaで使用されるJPanelサブクラスです。


xmlcompressutil.java

compviewer.javaで使用されるJPanelサブクラスです。

sample8

(非推奨)

XMLSchemaTreeViewer.java

このビジュアル・アプリケーションでは、Treeviewer Bean、sourceviewer BeanおよびXSDValidator Beanを使用します。このアプリケーションは、XMLインスタンス・ドキュメントおよびXMLスキーマ・ドキュメントを入力として受け入れます。両方のドキュメントを解析し、インスタンス・ドキュメントをスキーマと照合して検証します。ドキュメントが無効な場合は、エラーを生じたノードがハイライト表示され、ツールチップにエラー・メッセージが表示されます。

関連項目: 「sample8の実行」


TreeViewerValidate.java

解析済のXMLインスタンス・ドキュメントをツリーとして表示するJPanelサブクラスです。このクラスは、XMLSchemaTreeViewer.javaプログラムで使用されます。

sample9

(非推奨)

XMLSrcViewer.java

このビジュアル・アプリケーションでは、sourceviewer BeanおよびXSDValidator Beanを使用します。このデモは、XMLファイルを入力として受け取ります。DTD、XMLスキーマまたは検証なしのいずれかを検証モードとして選択できます。XMLデータ・ファイルをDTDまたはスキーマに対して検証し、構文をハイライト表示します。検証エラーはログに記録されます。スキーマ検証の場合は、エラー・ノードが適切にハイライト表示されます。外部および内部のDTDを表示できます。

関連項目: 「sample9の実行」


XMLSrcViewPanel.java

XMLSourceViewオブジェクトおよびDTDSourceViewオブジェクトの使用方法を示すクラスです。このクラスは、XMLSrcViewer.javaプログラムで使用されます。goButton_actionPerformed()を起動して、各XMLSourceViewオブジェクトをJPanelのコンポーネントとして設定します。表示するXMLファイルを解析し、makeSrcPane()を起動して結果のXML文書をXMLSourceViewオブジェクトに設定します。この時点でハイライト表示およびDTD表示のプロパティを指定します。スキーマ検証を実行するには、makeSchemaValPane()を起動してスキーマ・オブジェクトを作成します。エラーがあるかどうかを確認し、異なるハイライト表示を使用してソース・コードを表示できます。dumpErrors()を起動すると、XMLSourceViewからスキーマ検証エラーのリストを取得できます。

sample10

XSDValidatorSample.java

このアプリケーションは、XSDValidator Beanの使用方法を示します。XMLファイルおよびXMLスキーマ・ファイルを入力として受け入れます。このプログラムでは、検証中に発生したエラーが、行番号を含めて表示されます。

関連項目: 「sample10の実行」


表10-6に、デモ・プログラムで使用されるその他のファイルを示します。

表10-6 JavaBeanのサンプル・ファイル

ファイル名 説明

XMLDiffData1.txt

XMLDiffSample.javaプログラムで使用されるXML文書です。デフォルトでは、XMLDiffData1.txtおよびXMLDiffData2.txtの2つのXMLファイルが比較され、出力XSLTはXMLDiffSample.xslとして格納されます。

XMLDiffData2.txt

XMLDiffSample.javaプログラムで使用されるXML文書です。デフォルトでは、XMLDiffData1.txtおよびXMLDiffData2.txtの2つのXMLファイルが比較され、出力XSLTはXMLDiffSample.xslとして格納されます。

booklist.xml

このXML文書は、XMLDBAccessSample.javaで使用されます。

claim.sql

ViewSample.javaおよびXMLDBAccessSample.javaで使用されるXML文書です。

doc.xml

AsyncTransformSample.javaで使用されるXML文書です。

doc.xsl

AsyncTransformSample.javaで使用されるXSLTスタイルシートです。

emptable.xsl

AsyncTransformSample.javaViewSample.javaまたはXMLTransformPanelSample.javaで使用されるXSLTスタイルシートです。

note_in_dtd.xml

XMLSrcViewer.javaで使用されるサンプルXML文書です。このファイルをDTD検証モードで使用すると、検証エラーとともに内部DTDを表示できます。オプションで、内部DTDをXMLデータとともに表示できます。

purchaseorder.xml

XSDValidatorSample.javaプログラムで使用されるXML文書です。インスタンス・ドキュメントpurchaseorder.xmlは、purchaseorder.xsdで定義されたXMLスキーマに準拠していないため、エラーが表示されます。

purchaseorder.xsd

XSDValidatorSample.javaプログラムで使用されるXMLスキーマ・ドキュメントです。インスタンス・ドキュメントpurchaseorder.xmlは、purchaseorder.xsdで定義されたXMLスキーマに準拠していないため、エラーが表示されます。


サンプル・プログラムのコンパイル方法および実行方法は、同じディレクトリにあるREADMEに示されています。基本手順は次のとおりです。

  1. ディレクトリを$ORACLE_HOME/xdk/demo/java/transviewerディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\transviewerディレクトリ(Windowsの場合)に変更します。

  2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。BeanにはJDK 1.2以上が必要です。HTMLをレンダリングするとき、DBViewer BeanおよびDBTransformPanel BeanにはJDK 1.2.2が必要です。これより前のバージョンのJDKでは、結果バッファのHTMLが適切にレンダリングされない場合があります。

  3. 使用する環境に応じて、Makefile(UNIXの場合)またはMake.bat(Windowsの場合)を編集します。具体的には、次の編集を行います。

    • MakefileJDKPATHを、JDKパスを指すように変更します。

    • PATHSEPを、オペレーティング・システムに合せて適切なパス・セパレータに変更します。

    • HOSTNAMEPORTSIDUSERIDおよびPASSWORDパラメータを変更して、JDBCシン・ドライバを通じてデータベースに接続できるようにします。これらのパラメータは、sample4およびsample5で使用されます。

  4. システム・プロンプトでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行して、クラス・ファイルを生成します。

  5. 次のようにgmakeを実行して、デモを実行します。

    gmake sample1
    gmake sample2
    gmake sample3
    gmake sample4
    gmake sample5
    gmake sample6
    gmake sample7
    gmake sample8
    gmake sample9
    gmake sample10
    

    次の項では、デモの実行方法を説明します。

sample1の実行

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の実行

sample2は、XMLSourceViewおよびXMLTreeView BeanのGUIベースのデモで、非推奨です。ViewSampleプログラムでは、booklist.xmlファイルが、ソース表示とツリー表示に別々に示されます。次のように手動でプログラムを実行できます。

java ViewSample

sample3の実行

sample3は、非同期のDOMBuilder BeanおよびXSLTransformer Beanの非ビジュアルなデモです。AsyncTransformSampleプログラムは、現在のディレクトリ内のすべての*.xmlファイルにdoc.xsl XSLTスタイルシートを適用します。結果は、拡張子が.logであるファイルに書き込まれます。次のようにプログラムを実行できます。

java AsyncTransformSample

sample4の実行

sample4DBViewer Beanのビジュアルなデモで、非推奨です。このデモは、次のように実行されます。

  1. SQL*Plusを起動し、Makefileで指定されたUSERIDおよびPASSWORDを使用してデータベースに接続し、claim.sqlスクリプトを実行します。このスクリプトは、DBViewSampleデモ・プログラムで使用する多数の表、ビューおよび型を作成します。

  2. DBViewSampleプログラムを次のように実行します。

    java -classpath "$(MAKE_CLASSPATH)" DBViewSample
    

JDBC接続情報は、デモで使用されるクラスを実装するDBViewClaims.javaソース・ファイルにハードコードされています。特に、USERIDPASSWORDおよびその他の値は、Makefileに設定された値であることが前提になっています。使用する構成が異なる場合は、DBViewClaims.javaの92行にナビゲートし、setUsername()setPassword()およびその他を現在のOracleデータベース構成を反映した値に変更します。

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>

sample6の実行

sample6プログラムは、XMLDiff Beanのビジュアルなデモです。XMLDIFFSampleクラスによってGUIが起動され、「XMLファイルの比較」を選択すると、「ファイル」メニューから入力データ・ファイルを選択できます。「変換」メニューを使用して、生成されたXSLTを最初の入力XMLに適用できます。「ファイル」メニューの「別名保存」を選択して、出力XMLファイルを保存します。このファイルは、2つ目の入力ファイルと同じになります。デフォルトでは、XMLDiffData1.txtXMLDiffData2.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の実行

sample7は、XMLCompress Beanの使用方法を示すビジュアルなデモです。compviewerクラスを使用すると、GUIを起動して、XMLファイルおよびデータベースから取得したデータを圧縮および解凍できます。ロード・オプションにより、データをファイル・システムまたはデータベースから取得できます。このアプリケーションでは、データベースからの圧縮データのロードおよび保存はサポートされません。圧縮係数は、XMLデータの圧縮率を示す大まかな値です。

次のように手動でプログラムを実行できます。

java compviewer

sample8の実行

sample8のデモは、XMLTreeViewer Beanの使用方法を示します。XMLSchemaTreeViewerプログラムを使用すると、XMLDocumentをツリー形式で表示できます。スキーマ・ドキュメントを入力することで、インスタンス・ドキュメントをスキーマに対して検証できます。ドキュメントが無効な場合は、無効なノードがハイライト表示され、エラー・メッセージが表示されます。また、すべてのライン情報のログが専用のパネルに表示され、このパネルを使用してインスタンス・ドキュメントを編集および再評価できます。サンプル・ファイルpurchaseorder.xmlおよびpurchaseorder.xsdを使用して、このプログラムをテストします。インスタンス・ドキュメントpurchaseorder.xmlは、purchaseorder.xsdで定義されたスキーマに準拠していません。

次のように手動でプログラムを実行できます。

java XMLSchemaTreeViewer

sample9の実行

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の実行

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

XDK JavaBeansによるXMLの処理

この項の内容は次のとおりです。

DOMBuilder BeanおよびXSLTransformer BeanによるXMLの非同期処理

「DOMBuilder」および「XSLTransformer」で説明したように、XDK Beanを使用して非同期XML処理を実行できます。

AsyncTransformSample.javaプログラムは、DOMBuilderおよびXSLTransformerの両方のBeanの使用方法を示します。このプログラムは次のメソッドを実装します。

  • runDOMBuilders()

  • runXSLTransformer()

  • saveResult()

  • makeXSLDocument()

  • createURL()

  • init()

  • exitWithError()

  • asyncTransform()

プログラムの基本的なアーキテクチャは次のとおりです。

  1. このプログラムは、クラスで使用されるフィールドを宣言および初期化します。入力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
    
  2. 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;
    }
    
  3. main()メソッドは次のようにAsyncTransformSampleをインスタンス化します。

    AsyncTransformSample inst = new AsyncTransformSample();
    
  4. main()メソッドがasyncTransform()メソッドを起動します。asyncTransform()メソッドの主なタスクは次のとおりです。

    1. makeXSLDocument()を起動して入力XSLTスタイルシートを解析します。

    2. 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()メソッドについて説明します。

入力XSLTスタイルシートの解析

makeXSLDocument()メソッドは、入力スタイルシートの簡単なDOM解析を示します。非同期解析は使用しません。使用する解析方法は、「基本的なDOM解析の実行」で説明している方法と同じです。

メソッドは次の手順を実行します。

  1. 新規DOMParser()オブジェクトを作成します。DOMSample.javaの次のコード部分は、この方法を示します。

    DOMParser parser = new DOMParser();
    
  2. パーサーを構成します。次のコード部分は、空白の保持を指定します。

    parser.setPreserveWhitespace(true);
    
  3. 入力スタイルシートからURLオブジェクトを作成します。次のコード部分は、このタスクを実行するためにcreateURL()ヘルパー・メソッドを起動します。

    xslURL = createURL (xslFile);
    
  4. 入力XSLTスタイルシートを解析します。この方法を示す文は次のとおりです。

    parser.parse (xslURL);
    
  5. メモリー内DOMツリーのルートへのハンドルを取得します。XMLDocumentオブジェクトを使用して、解析済XML文書のすべての部分にアクセスできます。この方法を示す文は次のとおりです。

    xsldoc = parser.getDocument();
    

XML文書の非同期処理

runDOMBuilders()メソッドは、DOMBuilder BeanおよびXSLTransformer Beanを使用して非同期処理を実行する方法を示します。XMLの解析および変換は、バックグラウンドで実行されます。

メソッドは次の手順を実行します。

  1. 入力XML文書を管理するリソース・マネージャを作成します。forループが作成され、XML文書が取得されます。次のコード部分は、この方法を示します。

    rm = new ResourceManager (numXMLDocs);
    for (int i = 0; i < numXMLDocs; i++)
    {
       rm.getResource();
       ...
    }
    
  2. 入力XML文書ごとにDOMビルダーBeanをインスタンス化します。次に例を示します。

    DOMBuilder builder = new DOMBuilder(i);
    
  3. 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");
    
  4. DOMビルダーを構成します。次のコード部分は、空白の保持を指定し、文書のベースURLを設定します。

    builder.setPreserveWhitespace(true);
    builder.setBaseURL (createURL(basedir + "/"));
    
  5. 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());
          }
       }
    );
    
  6. 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());
          }
       }
    );
    
  7. ドキュメントを解析します。この方法を示す文は次のとおりです。

    builder.parse (xmlURL);
    System.err.println("Parsing file " + xmlfiles.elementAt(i));
    
XSLTransformer BeanによるXMLの変換

DOM解析が完了すると、DOMリスナーは通知を受信します。domBuilderOver()メソッドは、このイベントに応答するための動作を実装します。プログラムからrunXSLTransformer()メソッドにDOMを渡すことで、XSLT変換を開始します。

メソッドは次の手順を実行します。

  1. XSLTransformer Beanをインスタンス化します。このオブジェクトは、XSLT処理を実行します。この方法を示す文は次のとおりです。

    XSLTransformer processor = new XSLTransformer (id);
    
  2. 新規スタイルシート・オブジェクトを作成します。次に例を示します。

    XSLStylesheet  xsl       = new XSLStylesheet (xsldoc, xslURL);
    
  3. XSLTプロセッサを構成します。たとえば、次の文は、警告を表示するようにプロセッサを設定し、エラー出力ストリームを構成します。

    processor.showWarnings (true);
    processor.setErrorStream (errors);
    
  4. 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());
          }
       }
    );
    
  5. 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());
          }
       }
    );
    
  6. XSLTスタイルシートを使用してXML文書を変換します。この方法を示す文は次のとおりです。

    processor.processXSL (xsl, xml);
    

XMLDiff BeanによるXML文書の比較

「XMLDiff」で説明しているように、XDK Beanを使用してXML文書の構造および重要なコンテンツを比較できます。

XMLDiffSample.javaプログラムは、XMLDiff Beanの使用方法を示します。このプログラムは次のメソッドを実装します。

  • showDiffs()

  • doXSLTransform()

  • createURL()

プログラムの基本的なアーキテクチャは次のとおりです。

  1. このプログラムは、クラスで使用されるフィールドを宣言および初期化します。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 */
    
  2. main()メソッドが次のようにXMLDiffSampleオブジェクトを作成します。

    dfxApp = new XMLDiffSample();
    
  3. main()メソッドが、比較の結果を表示するためのJFrameを追加および初期化します。この方法を示すコードは次のとおりです。

    diffFrame = new XMLDiffFrame(dfxApp);
    diffFrame.addTransformMenu();
    
  4. main()メソッドがXMLDiff Beanをインスタンス化します。この方法を示すコードは次のとおりです。

    xmlDiff = new XMLDiff();
    
  5. main()メソッドがshowDiffs()メソッドを起動します。このメソッドは、次のタスクを実行します。

    1. XMLDiff.diff()を起動して、入力XML文書を比較します。

    2. 入力文書の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()メソッドについて説明します。

XMLファイルの比較とスタイルシートの生成

showDiffs()メソッドは、XMLDiff Beanの使用方法を示します。

メソッドは次の手順を実行します。

  1. XMLDiffプロセッサに対してファイルを設定します。この方法を示す文は次のとおりです。

    xmlDiff.setFiles(file1, file2);
    
  2. ファイルを比較します。diff()メソッドは、入力文書の構造および内容が同一であるかどうかを示すブール値を戻します。同一である場合は、XMLDiffFrameクラスで実装されたJFrameにメッセージが出力されます。次のコード部分は、この方法を示します。

    if(!xmlDiff.diff())
    {
      JOptionPane.showMessageDialog
      (
        diffFrame,
        "Files are equivalent in XML representation",
        "XMLDiffSample Message",
        JOptionPane.PLAIN_MESSAGE
      );
    }
    
  3. 2つのドキュメントの差分を示すXSLTスタイルシート用にDOMを生成します。次のコード部分は、この方法を示します。

    xslDoc = xmlDiff.generateXSLDoc();
    
  4. XMLDiffFrameで実装されたJFrameにドキュメントを表示します。XMLSourceView Beanをインスタンス化するXMLDiffFrameは、非推奨です。メソッドは次の手順を実行します。

    1. 入力ドキュメントのためのソース・ペインを作成します。次に示すように、diffFrameオブジェクトに2つのドキュメントのDOMハンドルを渡して、ソース・ペインを作成します。

      diffFrame.makeSrcPane(xmlDiff.getDocument1(), xmlDiff.getDocument2());
      
    2. ドキュメントの差分を表示するペインを作成します。次に示すように、テキスト・ペインへの参照をdiffFrameに渡します。

      diffFrame.makeDiffSrcPane(new XMLDiffSrcView(xmlDiff.getDiffPane1()),
                                new XMLDiffSrcView(xmlDiff.getDiffPane2()));
      
    3. XSLTスタイルシートのペインを作成します。次に示すように、スタイルシートのDOMを渡します。

      diffFrame.makeXslPane(xslDoc, "Diff XSL Script");
      diffFrame.makeXslTabbedPane();