11 PL/SQL API for XMLType
いくつかのPL/SQLパッケージで、API for XMLType
が提供されます。
- PL/SQL API for XMLTypeの概要
PL/SQL Application Program Interface (API) forXMLType
には、DOM API、パーサーAPI、プロセッサAPIなどがあります。 - PL/SQL DOM API for XMLType (DBMS_XMLDOM)
PL/SQL DOM API forXMLType
(DBMS_XMLDOM
)では、DOMを使用してXMLType
インスタンスを操作できます。 - PL/SQL Parser API for XMLType (DBMS_XMLPARSER)
PL/SQL Parser API forXMLType
(DBMS_XMLPARSER
)は、PL/SQL APIによってアクセス可能な解析結果ツリーを構築します。解析が正常に実行されない場合、エラーが発生します。 - PL/SQL XSLT Processor for XMLType (DBMS_XSLPROCESSOR)
PL/SQLパッケージDBMS_XSLPROCESSOR
を使用して、あるXML文書を別のXML文書に変換したり、XMLデータをHTML、PDFまたは他の形式に変換したりできます。このパッケージは、DOMツリーで文書を検索して、それにExtensible Stylesheet Language Transformation (XSLT)文を適用して、変換された文書を生成します。
親トピック: XMLType API
11.1 Overview of PL/SQL API for XMLTypeの概要
PL/SQL Application Program Interface (API) for XMLType
には、DOM API、パーサーAPI、プロセッサAPIなどがあります。
-
PL/SQLドキュメント・オブジェクト・モデル(DOM)API for
XMLType
(パッケージDBMS_XMLDOM
):XMLType
オブジェクトにアクセスするために使用します。XML Schemaに基づく文書およびXML Schemaに基づかない文書にアクセスできます。DOMは、XML文書の動的メモリー内ツリーベースのオブジェクト表現です。要素および属性へのプログラム・アクセスを可能にします。DOMオブジェクトおよびそのインタフェースは、W3C勧告です。プログラム・アクセス用のAPIなど、XML文書のDOMを指定します。DOMは、解析対象文書をオブジェクトのツリーとして表示します。
-
PL/SQL XML Parser API for
XMLType
(パッケージDBMS_XMLPARSER
): DOMの作成や、XML文書のコンテンツおよび構造にアクセスするために使用します。 -
PL/SQL XSLT Processor for
XMLType
(パッケージDBMS_XSLPROCESSOR
): XSLTを使用してXML文書を他のフォーマットに変換するために使用します。
- PL/SQL APIs for XMLType: 機能
PL/SQL API forXMLType
を使用すると、XMLType
表、列およびビューを作成したり、別のキャラクタ・セットでエンコードされたデータからXMLType
インスタンスを構築したり、様々な方法でXMLType
にアクセスして操作したりできます。 - PL/SQL APIs for XMLType: リファレンス
PL/SQL Application Program Interface (API) forXMLType
について説明します。
親トピック: PL/SQL API for XMLType
11.1.1 PL/SQL API for XMLType: 機能
PL/SQL API for XMLType
を使用すると、XMLType
表、列およびビューを作成したり、別のキャラクタ・セットでエンコードされたデータからXMLType
インスタンスを構築したり、様々な方法でXMLType
にアクセスして操作したりできます。
- XMLデータの遅延ロード(実体化の遅延)
XMLの遅延ロードでは、データ行が要求されたときにのみデータ行がロードされるため、大規模なXML文書と多くの同時ユーザーが関与するアプリケーションのスケーラビリティが向上します。 - XMLTypeデータ型でのXML Schemaのサポート
SQLデータ型XMLType
ではXML Schemaがサポートされています。 - XMLTypeによる異なるキャラクタ・セットのデータのサポート
PL/SQLを使用して、Oracleでサポートされているキャラクタ・セットのいずれかでエンコードされたデータから、XMLType
インスタンスを作成できます。これを行うには、PL/SQLのXMLType
コンストラクタまたはXMLType
のcreateXML()
メソッドを使用します。
関連トピック
関連項目:
親トピック: PL/SQL API for XMLTypeの概要
11.1.1.1 XMLデータの遅延ロード(実体化の遅延)
XMLの遅延ロードでは、データ行が要求されたときにのみデータ行がロードされるため、大規模なXML文書と多くの同時ユーザーが関与するアプリケーションのスケーラビリティが向上します。
XMLType
では動的メモリーまたは仮想ドキュメント・オブジェクト・モデル(DOM)が提供されるため、XMLの遅延ロード(実体化の遅延と言われることもあります)というメモリー節約プロセスを使用できます。このプロセスは、データ行が要求されたときに、データ行のみをロードすることによって、メモリー使用量を最適化します。メモリーの使用量が大きくなりすぎた場合に、文書内の参照済の部分を廃棄します。XMLの遅延ロードは、多くの同時ユーザーが大規模なXML文書にアクセスする必要がある高度にスケーラブルなアプリケーションをサポートします。
親トピック: PL/SQL API for XMLType: 機能
11.1.1.2 XMLTypeデータ型でのXML Schemaのサポート
SQLデータ型XMLType
ではXML Schemaがサポートされています。
XML Schemaを作成し、XMLを使用してオブジェクト・リレーショナル記憶域からのマッピングに注釈を付けることができます。PL/SQL DOM APIを使用するには、まずXML Schemaを作成して登録します。その後、作成するXMLType
表および列が、登録したXML Schemaに準拠するように指定できます。
親トピック: PL/SQL API for XMLType: 機能
11.1.1.3 XMLTypeによる異なるキャラクタ・セットのデータのサポート
PL/SQLを使用して、Oracleでサポートされているキャラクタ・セットのいずれかでエンコードされたデータから、XMLType
インスタンスを作成できます。これを行うには、PL/SQLのXMLType
コンストラクタまたはXMLType
のcreateXML()
メソッドを使用します。
ソースのXMLデータは、BFILE
またはBLOB
データ型を使用して指定する必要があります。データのエンコーディングは、csid
引数で指定されます。この引数が0
(ゼロ)の場合、ソース・データのエンコーディングは、「XML 1.0 Reference」の付録Fで指定されているとおりに、XMLのプロローグから判断されます。
注意:
AL32UTF8は、XMLType
データに適したOracle Databaseキャラクタ・セットです。これはIANAの登録済標準であるUTF-8エンコーディングと同等であり、すべての有効なXML文字をサポートします。
Oracle Databaseのデータベース・キャラクタ・セットUTF8(ハイフンなし)とデータベース・キャラクタ・セットAL32UTF8またはキャラクタ・エンコーディングUTF-8を混同しないでください。データベース・キャラクタ・セットUTF8はAL32UTF8で置き換えられています。XMLデータにはUTF8を使用しないでください。キャラクタ・セットUTF8でサポートされるのはUnicodeバージョン3.1以下のみです。すべての有効なXML文字がサポートされるわけではありません。AL32UTF8には、このような制限はありません。
XMLデータにデータベース・キャラクタ・セットUTF8を使用すると、システムが停止したりセキュリティに悪影響を及ぼす可能性があります。入力した文書要素の名前にデータベース・キャラクタ・セットでサポートされない文字が含まれている場合、その文字は置換文字(通常は「?
」)で置き換えられます。このため、解析が終了して例外が発生します。リカバリ不能なエラーが発生する可能性があります。
親トピック: PL/SQL API for XMLType: 機能
11.1.2 PL/SQL API for XMLType: リファレンス
PL/SQL Application Program Interface (API) for XMLType
について説明します。
表11-1に、XMLデータの操作に使用できるPL/SQLのAPIのリファレンス・ドキュメントを示します。PL/SQLのAPIの主なリファレンスは、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスです。
関連項目:
-
Java API for XMLの詳細は、Oracle Database XML Java APIリファレンスを参照してください。
-
C API for XMLの詳細は、Oracle Database XML C APIリファレンスを参照してください。
-
C++ API for XMLの詳細は、Oracle Database XML C++ APIリファレンスを参照してください。
表11-1 XMLに関連するPL/SQL API
API | ドキュメント | 説明 |
---|---|---|
|
|
|
データベースURIタイプ |
様々なURIタイプに使用される関数 |
|
|
データベース・ディクショナリからメタデータをXMLとして取り出す、または関連付けられているオブジェクトを再作成するために作成DDLを取り出してXMLを送信するためのPL/SQL API |
|
|
リソース構成リストを操作し、リソースのリスナー情報を取り出すPL/SQL API |
|
|
データベース管理者がOracle XML DBリポジトリを管理するためのPL/SQL API |
|
|
Oracle XML DBの構成セッションを管理するためのPL/SQL API |
|
|
Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_CONSTANTS」 |
Oracle XML DBで使用するPL/SQL定数 |
|
アプリケーション開発者がOracle XML DBリポジトリを使用するためのPL/SQL API |
|
|
Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDBRESOURCE」 |
リポジトリ・リソース・メタデータおよびコンテンツを操作するPL/SQL API |
|
リポジトリ・リソースにテキスト索引を作成するためのPL/SQL API |
|
|
Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_VERSION」 |
リポジトリ・リソースのバージョン管理のためのPL/SQL API |
|
Oracle XML DBリポジトリのACLベースのセキュリティ |
|
|
イベント関連のタイプを提供し、インタフェースをサポートするPL/SQL API |
|
|
DOM API for |
|
|
SQL問合せ結果を正規のXML形式に変換するためのPL/SQL API |
|
|
PL/SQL API for |
|
|
DOM Parser API for |
|
|
Oracle Database内のXML Schemaを管理(スキーマの登録、削除)するためのPL/SQL API |
|
|
Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLSCHEMA_ANNOTATE」 |
Oracle固有のXML Schema注釈を追加および管理するためのPL/SQL API。 |
|
Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLSTORAGE_MANAGE」 |
XML Schemaの登録後にXMLデータの記憶域を管理および変更するためのPL/SQL API |
|
XMLデータをリレーショナル表に格納するためのPL/SQL API |
|
|
Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XSLPROCESSOR」 |
XSLTプロセッサのPL/SQL実装 |
親トピック: PL/SQL API for XMLTypeの概要
11.2 PL/SQL DOM API for XMLType(DBMS_XMLDOM)
PL/SQL DOM API for XMLType
(DBMS_XMLDOM
)では、DOMを使用してXMLType
インスタンスを操作できます。
- W3Cのドキュメント・オブジェクト・モデル(DOM)勧告の概要
World Wide Web Consortium (W3C)によって勧告されたドキュメント・オブジェクト・モデル(DOM)は、XML文書の構造にアクセスするための汎用APIです。 - PL/SQL DOM API for XMLType(DBMS_XMLDOM): 機能
Oracle XML DBは、XMLデータの格納と取出しのSQLサポート以外にも、Oracle Database XML開発プラットフォームを拡張しています。PL/SQL、JavaおよびCでDOMを使用して、XMLType
インスタンスを操作できます。 - Oracle XML Developer's KitおよびOracle XML DBを使用したアプリケーションの設計
Oracle XML DBに基づくアプリケーションを構築する場合、Oracle XML Developer's Kit (XDK)で提供される追加のコンポーネントは必要ありません。ただし、エンドツーエンドで実行するXML対応アプリケーションの統合スイートをデプロイするために、XDKのコンポーネントとともにOracle XML DBを使用することはできます。 - PL/SQL DOM API for XMLTypeを使用するためのXMLデータの準備
XML Schemaを作成して、それに注釈を付けてXMLをSQLオブジェクトにマップして、XML Schemaを登録します。 - XML Schema型のSQLオブジェクト型へのマッピング
XML SchemaをXML文書で参照できるようにするには、まず、Oracle XML DBに登録する必要があります。XML Schemaを登録すると、その中で宣言される要素および属性が、データベース内の対応するSQLオブジェクト型の属性にマップされます。 - XMLTypeビューによる既存データのXMLとしてのラップ
既存のリレーショナル・データおよびオブジェクト・リレーショナル・データをXMLアプリケーションで使用できるようにするには、それに基づいてXMLType
ビューを作成します。これにより、PL/SQL DOM APIを使用して結果のXMLデータにアクセスできます。 - Oracle XML DBによってサポートされるDBMS_XMLDOMメソッド
いくつかの例外はありますが、Oracle XML DBでは、すべてのDBMS_XMLDOM
メソッドがサポートされています。 - PL/SQL DOM API for XMLType: ノード型
DOMでは、オブジェクトベースのツリー構造を作成するためのXML文書内の要素の使用方法が指定されます。これにより、XML文書に格納されたオブジェクトを管理および使用するためのインタフェースが定義されて公開されます。DOMは様々なシステムの文書の格納をサポートします。 - PL/SQL関数NEWDOMDOCUMENTおよびDOMDOCUMENTのノード
PL/SQL関数newDOMDocument
は、指定されたXMLType
値でDOM文書ハンドルを構成します。結果のハンドルの型はDOMDocument
です。 - DOM NodeListオブジェクトおよびNamedNodeMapオブジェクト
DOMDocument
インスタンスの基礎となるドキュメント構造を変更した場合、変更はすべての適切なNodeList
オブジェクトおよびNamedNodeMap
オブジェクトに反映されます。 - PL/SQL DOM API for XMLType (DBMS_XMLDOM)の使用方法の概要
PL/SQLパッケージDBMS_XMLDOM
の使用には、通常、DOM文書の作成、DOMツリーの検索と拡張、およびノードの作成と操作が関与します。 - PL/SQL DOM API for XMLTypeの例
PL/SQL DOM API forXMLType
の使用例を示します。 - DBMS_XMLDOMを使用した大規模ノードの処理
Oracle XML DBでは、抽象ストリームおよびストリーム操作の各メソッドが提供され、これらを使用して、64 KBを超えるXMLノードを処理できます。 - 大規模ノード処理のGet-Pushモデル
このモデルでは、プッシュ・モードのパーサーを使用して、DOMノードの値を取得します。Oracle XML DBでは、パーサーによって読み取られた出力ストリームにノード・データを書き込みます。 - 大規模ノード処理のGet-Pullモデル
このモデルでは、プル・モードのパーサーを使用して、DOMノードの値を取得します。Oracle XML DBでは、パーサーによって書き込まれた入力ストリームからイベント・データを読み取ります。 - 大規模ノード処理のSet-Pullモデル
このモデルでは、取出しモードのパーサーを使用して、DOMノードの値を設定します。Oracle XML DBでは、パーサーによって書き込まれた入力ストリームからイベント・データを読み取ります。 - 大規模ノード処理のSet-Pushモデル
このモデルでは、プッシュ・モードのパーサーを使用して、DOMノードの値を設定します。Oracle XML DBでは、パーサーによって読み取られた出力ストリームにノード・データを書き込みます。 - 大規模ノード処理のバイナリ・ストリームか文字ストリームかの判断
サブプログラムDBMS_XMLDOM.useBinaryStream
を使用して、大規模ノードのコンテンツにアクセスする場合に文字ストリームを使用するか、バイナリ・ストリームを使用するかを判断します。
関連項目:
各DBMS_XMLDOM
メソッドの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
親トピック: PL/SQL API for XMLType
11.2.1 W3Cのドキュメント・オブジェクト・モデル(DOM)勧告の概要
World Wide Web Consortium (W3C)によって勧告されたドキュメント・オブジェクト・モデル(DOM)は、XML文書の構造にアクセスするための汎用APIです。
DOMは、XML文書の構造にアクセスするための汎用APIです。動的HTMLを使用すると、Webページのアニメーション、対話および動的更新が可能になります。DOMは、WebページおよびXML文書に、言語およびプラットフォームに依存しないオブジェクト・モデルを提供します。DOMは、XMLのコンポーネントおよび要素にアクセスおよび操作するための、言語およびプラットフォームに依存しないインタフェースを記述します。XML文書の構造を、コンテンツに依存しない汎用的な方法で表現します。XML文書のコンテンツ、属性およびスタイルを動的に削除、追加および編集するアプリケーションを作成できます。DOMによって、すべてのブラウザ、サーバーおよびプラットフォームで適切に動作するアプリケーションを作成できます。
- W3C DOM標準へのOracle XML Developer's Kit拡張
Oracle XML Developer's Kit (XDK)は、W3C DOM APIを拡張します。これらの拡張は、データベースに適用されないクライアント側の操作と関連するもの以外、Oracle XML DBでサポートされています。Oracle XML Developer's KitのJavaおよびCコンポーネントのSimple API for XML (SAX)インタフェースを参照してください。 - W3CのDOM勧告のサポート
XMLデータにアクセスして操作するためのすべてのOracle XML DB APIは、W3Cで承認された標準のXML処理要件に準拠しています。PL/SQL DOMは、W3CのDOM仕様のレベル1および2をサポートします。 - DOMとSAXの違い
DOMは、XML用の主要な汎用ツリーベースAPIです。SAX (Simple API for XML)は、XML ParserとXMLアプリケーション間の、主要な汎用イベントベース・プログラム・インタフェースです。
11.2.1.1 W3C DOM標準へのOracle XML Developer's Kit拡張
Oracle XML Developer's Kit (XDK)は、W3C DOM APIを拡張します。これらの拡張は、データベースに適用されないクライアント側の操作と関連するもの以外、Oracle XML DBでサポートされています。Oracle XML Developer's KitのJavaおよびCコンポーネントのSimple API for XML (SAX)インタフェースを参照してください。
11.2.1.2 W3CのDOM勧告のサポート
XMLデータにアクセスして操作するためのすべてのOracle XML DB APIは、W3Cで承認された標準のXML処理要件に準拠しています。PL/SQL DOMは、W3CのDOM仕様のレベル1および2をサポートします。
-
DOMレベル1.0: 1998年10月に勧告された、DOM仕様の最初の形式レベルです。レベル1.0では、XML 1.0およびHTMLへのサポートが定義されています。
-
DOMレベル2.0: 2000年11月に勧告され、レベル2.0では、名前空間を含むXML 1.0をサポートすることによって、レベル1.0が拡張されています。また、カスケーディング・スタイルシート(CSS)およびイベント(ユーザー・インタフェース・イベントおよびツリー操作イベント)のサポートが追加され、ツリー操作(ツリーの範囲および検索メカニズム)が拡張されています。CSSは、スタイル(フォント、カラー、間隔など)をWebドキュメントに追加するための単純なメカニズムです。
DOMのOracleサポートは次のとおりです。
-
Oracle9iリリース1(9.0.1)では、Oracle XML Developer's Kit for PL/SQLにDOMレベル1.0およびレベル2.0の一部が実装されていました。
-
Oracle9i リリース2(9.2)およびOracle Database 10g リリース1(10.1)では、PL/SQL API for
XMLType
にDOMレベル1.0およびレベル2.0コアが実装され、XMLType
APIの拡張機能を介してデータベースに完全に統合されています。
11.2.1.3 DOMとSAXの違い
DOMは、XML用の主要な汎用ツリーベースAPIです。SAX (Simple API for XML)は、XML ParserとXMLアプリケーション間の、主要な汎用イベントベース・プログラム・インタフェースです。
DOMは、オブジェクトを作成することによって機能します。これらのオブジェクトには、子オブジェクトおよびプロパティがあります。子オブジェクトには、それ自体の子オブジェクトおよびプロパティが含まれ、それ以降の子オブジェクトにも同様に含まれます。オブジェクトは、オブジェクト階層を下って検索するか、HTML要素にID属性を明示的に指定することによって参照されます。例:
<img src="employee_jdoe.gif" ID="0123jdoe">
次に、構造的な操作の例を示します。
-
要素の再順序付け
-
要素の追加または削除
-
属性の追加または削除
-
要素名の変更
11.2.2 PL/SQL DOM API for XMLType(DBMS_XMLDOM): 機能
Oracle XML DBは、XMLデータの格納と取出しのSQLサポート以外にも、Oracle Database XML開発プラットフォームを拡張しています。PL/SQL、JavaおよびCでDOMを使用して、XMLType
インスタンスを操作できます。
PL/SQL DOM API for XMLType
(DBMS_XMLDOM
)のデフォルトの動作は、次のとおりです。
-
DOM APIによってアクセス可能な解析ツリーを生成します。
-
DTDが検出された場合に検証を行います。検出されない場合は検証を行いません。
-
解析が正常に実行されない場合、アプリケーション・エラーが発生します。
対象のドキュメントが指示された時点でDTD検証が実行されます。実体化の遅延を使用する場合は、使用時にドキュメントの検証が行われます。
PL/SQL DOM APIは、サーバーでCベース表現のXMLを使用し、XML Schemaに基づくXMLインスタンスを操作します。PL/SQL DOM API for XMLType、Java DOM API for XMLTypeおよびC DOM API for XMLType
は、W3CのDOM勧告に準拠して、リレーショナル列またはオブジェクト・リレーショナル列にXMLType
の動的メモリー・インスタンスとして、XMLデータのオブジェクト・リレーショナル記憶域を定義および実装します。W3CのDOM勧告の詳細は、PL/SQL DOM API for XMLTypeを使用するためのXMLデータの準備を参照してください。
- XML Schemaに対するPL/SQL DOM APIサポート
PL/SQL DOM API forXMLType
は、XML Schemaをサポートしています。Oracle XML DBは、XML Schema内で注釈をメタデータとして使用し、XML文書およびその文書のデータベース・スキーマへのマッピングの両方を決定します。 - DOMのパフォーマンスの向上
Oracle XML DBは、DOMを使用して、複数のバックエンド・データ・ソースとXML間でデータを変換する標準的な方法を提供します。これによって、環境内の様々なデータ・ソースに個別のXML変換方法を使用する必要がなくなります。
11.2.2.1 XML Schemaに対するPL/SQL DOM APIサポート
PL/SQL DOM API for XMLType
は、XML Schemaをサポートしています。Oracle XML DBは、XML Schema内で注釈をメタデータとして使用し、XML文書およびその文書のデータベース・スキーマへのマッピングの両方を決定します。
注意:
下位互換性および柔軟性を得るために、PL/SQL DOMは、XML Schemaに基づく文書とスキーマに基づかない文書の両方をサポートします。
Oracle XML DBにXML Schemaが登録されると、PL/SQL DOM API for XMLType
は、ノード・オブジェクトの階層として関連XML文書の動的メモリー内ツリー表現を構築します。各ツリー表現は、独自の特別なインタフェースを持ちます。多くのノード・オブジェクト型は子ノード型を持つことができ、これによって、さらに特別な追加のインタフェースを実装できます。ノード型には、様々な型の子ノードを持つことができるものと、子ノードを持つことができないリーフ・ノードがあります。
11.2.2.2 DOMのパフォーマンスの向上
Oracle XML DBは、DOMを使用して、複数のバックエンド・データ・ソースとXML間でデータを変換する標準的な方法を提供します。これによって、環境内の様々なデータ・ソースに個別のXML変換方法を使用する必要がなくなります。
XMLデータを交換する必要があるアプリケーションでは、単一のネイティブなXMLデータベースを使用して、XML文書をキャッシュできます。そのため、XML DBは、Webアプリケーションとバックエンド・データ・ソース間の中間キャッシュとして機能することによって、リレーショナル・データベース内かファイル・システム内かにかかわらず、アプリケーションのパフォーマンスを向上させることができます。
11.2.3 Oracle XML Developer's KitおよびOracle XML DBを使用したアプリケーションの設計
Oracle XML DBに基づくアプリケーションを構築する場合、Oracle XML Developer's Kit (XDK)で提供される追加のコンポーネントは必要ありません。ただし、エンドツーエンドで実行するXML対応アプリケーションの統合スイートをデプロイするために、XDKのコンポーネントとともにOracle XML DBを使用することはできます。
これらのXDK機能は、Oracle XML DBに基づくXMLアプリケーションを開発する場合に特に役立ちます。
-
Simple API for XML(SAX)インタフェース処理。SAXは、XML Parserによって提供され、手続き型およびイベント・ベース・アプリケーションによって使用されるXML標準インタフェースです。
-
DOMインタフェース処理。再帰的な構造型オブジェクト・ベース処理に使用します。
Oracle XML Developer's Kitには、クライアント、ブラウザまたはプラグインで実行するアプリケーションを作成するための基本的な構成ブロックが含まれています。通常、これらのアプリケーションでは、XML文書の読取り、操作、変換、表示などを行います。様々なデプロイメント・オプションを提供するために、Oracle XML Developer's KitはJava、C、およびC++で使用できます。Oracle XML Developer's Kitは、フル・サポートされており、商用再配布ライセンスを受けています。
Oracle XML Developer's Kit for Javaは、次のコンポーネントで構成されています。
-
XML Parsers: 業界標準のDOMインタフェースおよびSAXインタフェースを使用して、XMLを作成および解析します。Java、C、C++、Java API for XML Processing(JAXP)をサポートします。
-
XSLプロセッサ: XMLを、HTMLなどの他のテキストベース形式に変換またはレンダリングします。Java、CおよびC++をサポートします。
-
XML Schemaプロセッサ: XMLの単純および複合なデータ型を使用します。Java、CおよびC++をサポートします。
-
XML Class Generator、Oracle JAXB Class Generator: DTDおよびXML Schemaから自動的にJavaクラスおよびC++クラスを生成し、WebフォームまたはアプリケーションからXMLデータを送信します。Class Generatorは、入力ファイルを受け入れ、対応する機能を持つ一連の出力クラスを作成するユーティリティです。XML Class Generatorの場合、入力ファイルはDTDであり、出力は、そのDTDに準拠するXML文書を作成するために使用できる一連のクラスです。
-
XML SQL Utility: SQL問合せから、XML文書、DTDおよびXML Schemaを生成します。Javaをサポートします。
-
TransX Utility: XMLにカプセル化されたデータをデータベースにロードします。インストールに有効な追加機能が含まれています。
-
XMLパイプライン・プロセッサ: XML制御ファイルを使用してJavaプロセッサを起動します。
-
XSLT VMおよびコンパイラ: コンパイルされたXSLスタイルシートを使用する、高パフォーマンスなCベースのXSLT変換エンジンを提供します。
-
XML JavaBeans: Javaコンポーネントを使用して、XML文書を解析、変換、比較、取得および圧縮します。
11.2.4 PL/SQL DOM API for XMLTypeを使用するためのXMLデータの準備
XML Schemaを作成して、それに注釈を付けてXMLをSQLオブジェクトにマップして、XML Schemaを登録します。
Oracle XML DBでPL/SQL DOM APIを使用するためにデータを準備するには、次の操作を実行します。
- 標準のXML Schemaを作成します。
- 使用するSQLオブジェクトの定義をXML Schemaの注釈として付けます。
- XML Schemaを登録して、必要なデータベース・マッピングを生成します。
これによって、次のいずれかの操作を実行できます。
-
XMLType
ビューを使用して、既存のリレーショナルまたはオブジェクト・リレーショナル・データをXML形式にラップして、XML形式のアプリケーションで使用できるようにします。XMLTypeビューによる既存データのXMLとしてのラップを参照してください。 -
XMLデータを
XMLType
列に挿入します。 -
Oracle XML DBのPL/SQL DOM APIおよびJava DOM APIを使用して、
XMLType
列および表に格納されたXMLデータを操作します。
11.2.5 XML Schema型のSQLオブジェクト型へのマッピング
XML SchemaをXML文書で参照できるようにするには、まず、Oracle XML DBに登録する必要があります。XML Schemaを登録すると、その中で宣言される要素および属性が、データベース内の対応するSQLオブジェクト型の属性にマップされます。
XML Schemaの登録完了後、このXML Schemaに準拠、および参照するXML文書をOracle XML DBで管理できます。準拠する文書を格納するための表および列を、このXML Schemaによって定義されたルート要素に対して作成できます。
XML Schemaを登録するには、PL/SQLパッケージのDBMS_XMLSCHEMA
を使用し、スキーマ・ドキュメントとそのスキーマの場所のURLを指定します。このURLは、データベース内に登録されたスキーマを一意に識別する名前です。実際の場所に対応する必要はなく、また、特に、スキーマ・ドキュメントの場所を示す必要はありません。
スキーマのターゲット名前空間は、XML Schemaで使用される別のURLです。XML Schemaの要素および型の名前空間を指定します。XML文書は、ルート要素の名前空間と、この要素を定義するスキーマの場所のURLの両方を指定する必要があります。
HTTP(S)やFTPなど、パスベースのプロトコルを使用してOracle XML DBに文書が挿入されると、指定されたXML Schemaの名前および場所が事前に登録されていない場合は、その文書が準拠するXML Schemaが暗黙的に登録されます。
- XML SchemaのマッピングのためのDOM再現性
XML Schema内で宣言された要素および属性は、対応するSQLオブジェクト型の個別の属性にマップされます。コメント、処理命令、名前空間、宣言および接頭辞など、XML文書内のエンコードされた他の情報は、直接表現されません。
関連トピック
関連項目:
各DBMS_XMLSCHEMA
メソッドの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
11.2.5.1 XML SchemaのマッピングのためのDOM再現性
XML Schema内で宣言された要素および属性は、対応するSQLオブジェクト型の個別の属性にマップされます。コメント、処理命令、名前空間、宣言および接頭辞など、XML文書内のエンコードされた他の情報は、直接表現されません。
このような追加情報を格納するため、SYS_XDBPD$
というバイナリ属性が、生成されたすべてのSQLオブジェクト型に存在します。この属性では、元のXML文書内で、他のデータベース属性を使用して格納されないすべての情報が格納されます。このような補足情報を保持することで、Oracle XML DB内に格納されるXML文書のDOM再現性が保証されます。つまり、データベースから取得されるXML文書は、格納された元の文書と同じものです。
注意:
このマニュアルの多くの例では、簡略化のため属性SYS_XDBPD$
を省略しています。ただし、この属性は、スキーマの登録によって生成されたSQLオブジェクト型に常に存在します。
11.2.6 XMLTypeビューによる既存データのXMLとしてのラップ
既存のリレーショナル・データおよびオブジェクト・リレーショナル・データをXMLアプリケーションで使用できるようにするには、それに基づいてXMLType
ビューを作成します。これにより、PL/SQL DOM APIを使用して結果のXMLデータにアクセスできます。
XMLとSQLオブジェクト型間のマッピングを表す注釈を含むXML Schemaを登録した後、このXML Schemaに準拠するXMLType
を作成できます。
関連トピック
11.2.7 Oracle XML DBによってサポートされるDBMS_XMLDOMメソッド
いくつかの例外はありますが、Oracle XML DBでは、すべてのDBMS_XMLDOM
メソッドがサポートされています。
次のメソッドはOracle XML DBでサポートされていません。
-
writeExternalDTDToFile()
-
writeExternalDTDToBuffer()
-
writeExternalDTDToClob()
関連項目:
各DBMS_XMLDOM
メソッドの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
11.2.8 PL/SQL DOM API for XMLType: ノード型
DOMでは、オブジェクトベースのツリー構造を作成するためのXML文書内の要素の使用方法が指定されます。これにより、XML文書に格納されたオブジェクトを管理および使用するためのインタフェースが定義されて公開されます。DOMは様々なシステムの文書の格納をサポートします。
DOM仕様では、ドキュメントという用語は、DOMの対象となる様々な情報またはデータのコンテナを示します。
getNodeType(myNode)
などの要求が起動されると、親ノードによってサポートされるノード型myNodeType
が戻されます。次の定数は、ノードが使用可能な様々な型を表します。
-
ELEMENT_NODE
-
ATTRIBUTE_NODE
-
TEXT_NODE
-
CDATA_SECTION_NODE
-
ENTITY_REFERENCE_NODE
-
ENTITY_NODE
-
PROCESSING_INSTRUCTION_NODE
-
COMMENT_NODE
-
DOCUMENT_NODE
-
DOCUMENT_TYPE_NODE
-
DOCUMENT_FRAGMENT_NODE
-
NOTATION_NODE
表11-2に、XMLおよびHTMLのノード型と、それに対応する使用可能な子ノード型を示します。
表11-2 XMLおよびHTMLのDOMノード型およびその子ノード型
ノード・タイプ | 子ノード型 |
---|---|
Document |
|
DocumentFragment |
|
DocumentType |
子を持ちません。 |
EntityReference |
|
Element |
|
Attr |
|
ProcessingInstruction |
子を持ちません。 |
Comment |
子を持ちません。 |
Text |
子を持ちません。 |
CDATASection |
子を持ちません。 |
Entity |
|
Notation |
子を持ちません。 |
Oracle XML DB DOM API for XMLType
は、次のインタフェースも指定します。
-
NodeListインタフェース: 次のような、順序付けられたノードのリストを処理します。
-
ノードの子
-
要素インタフェースの
getElementsByTagName()
メソッドによって戻された要素
-
-
NamedNodeMapインタフェース: 要素の属性など、名前属性によって参照される、順序付けられていない一連のノードを処理します。
11.2.9 PL/SQL関数NEWDOMDOCUMENTおよびDOMDOCUMENTのノード
PL/SQL関数newDOMDocument
は、指定されたXMLType
値でDOM文書ハンドルを構成します。結果のハンドルの型はDOMDocument
です。
PL/SQLアプリケーションの一般的な使用例は次のとおりです。
-
XMLType
インスタンスのフェッチまたは構成 -
XMLType
インスタンス上でのDOMDocument
ノードの構成 -
DOM APIを使用したXMLデータへのアクセスおよび操作
注意:
DOMDocument
では、ノード型はXMLフラグメントのデータ自体ではなく、XMLフラグメントへのハンドルを表します。たとえば、ノード値をコピーすると、
DOMDocument
によって、基礎となる同じデータへのハンドルもコピーされます。一方のハンドルによって変更されたデータは、もう一方のハンドルでアクセスしても参照できます。DOMDocument
ハンドルが構成されたXMLType
値はデータであり、このハンドルに対して行われたすべてのDOM操作の結果が反映されます。
11.2.10 DOM NodeListオブジェクトおよびNamedNodeMapオブジェクト
DOMDocument
インスタンスの基礎となるドキュメント構造を変更した場合、変更はすべての適切なNodeList
オブジェクトおよびNamedNodeMap
オブジェクトに反映されます。
たとえば、DOMユーザーが要素の子を含むNodeList
オブジェクトを取得し、その要素に子を追加(または子の削除や既存の子の変更)した場合、これらの変更は自動的にNodeList
に伝播されます。同様に、ツリー内のノードへの変更は、NodeList
オブジェクトおよびNamedNodeMap
オブジェクトのノードへのすべての参照に伝播されます。
Text
、Comment
およびCDATASection
インタフェースは、CharacterData
インタフェースを継承します。
11.2.11 PL/SQL DOM API for XMLType (DBMS_XMLDOM)の使用方法の概要
PL/SQLパッケージDBMS_XMLDOM
の使用には、通常、DOM文書の作成、DOMツリーの検索と拡張、およびノードの作成と操作が関与します。
図11-1に、PL/SQL DOM API for XMLType
(DBMS_XMLDOM
)の使用方法を示します。
-
DOM文書(
DOMDocument
)は、既存のXMLType
から作成するか、または空の文書として作成できます。newDOMDocument
プロシージャが、XMLType
インスタンスまたは空の文書を処理します。これによって、
DOMDocument
インスタンスが作成されます。 -
DOM API PL/SQLメソッド(
createElement()
、createText()
、createAttribute()
、createComment()
など)を使用して、DOMツリーを検索および拡張します。 -
DOMElement()
およびDOMText()
などのPL/SQLメソッドの結果をPL/SQL関数makeNode
に渡して、DOMNode
インタフェースを取得することもできます。
11.2.12 PL/SQL DOM API for XMLTypeの例
PL/SQL DOM API for XMLType
の使用例を示します。
このインタフェースを使用する際、DOMDocumentインスタンスごとに
freeDocument
プロシージャを必ずコールするようにしてください。このプロシージャにより、文書とそのノードがすべて解放されます。DOMDocument
インスタンスが解放された後でも、DOMDocument
インスタンスが構築されたXMLType
インスタンスにアクセスできます。
例11-1では、動的メモリー内のXML文書の階層的な表現であるDOM文書を作成します。
例11-1では、DOM文書へのハンドルを使用して、操作、出力、一部の変更、および変更後の出力を行います。ハンドルによりDOM文書を操作すると、この文書で表現されるXMLデータにも間接的に影響するため、変更後にそのデータを問い合せると、変更した結果が示されます。
DOM文書は、PL/SQL関数newDOMDocument
を使用してXMLType
変数から作成されます。この文書へのハンドルは、makeNode
関数を使用して作成されます。また、この文書は、writeToBuffer
関数を使用してVARCHAR2
バッファに書き込まれ、さらに、このバッファは、DBMS_OUTPUT.put_line
を使用して出力されます。
様々なDBMS_XMLDOM
プロシージャを使用してこの文書を操作した後、XMLType
変数内の(変更された)データは表内に挿入され、問い合せることで変更を確認できます。データがデータベース表内に挿入されると、永続的になります。それまではメモリー内にのみ存在します。この永続性は、動的メモリー内の文書(DOMDocument
インスタンス)が解放されてからデータベース問合せが作成されるという事実からわかります。
例11-2では、空のDOM文書を作成し、要素ノード(<ELEM>
)をこの文書に追加します。DBMS_XMLDOM
APIノード・プロシージャを使用して、要素ノードの名前(<ELEM>
)、値(NULL
)および型(1
=要素ノード)を取得します。
例11-1 DOM文書の作成および操作
CREATE TABLE person OF XMLType;
DECLARE
var XMLType;
doc DBMS_XMLDOM.DOMDocument;
ndoc DBMS_XMLDOM.DOMNode;
docelem DBMS_XMLDOM.DOMElement;
node DBMS_XMLDOM.DOMNode;
childnode DBMS_XMLDOM.DOMNode;
nodelist DBMS_XMLDOM.DOMNodelist;
buf VARCHAR2(2000);
BEGIN
var := XMLType('<PERSON><NAME>ramesh</NAME></PERSON>');
-- Create DOMDocument handle
doc := DBMS_XMLDOM.newDOMDocument(var);
ndoc := DBMS_XMLDOM.makeNode(doc);
DBMS_XMLDOM.writeToBuffer(ndoc, buf);
DBMS_OUTPUT.put_line('Before:'||buf);
docelem := DBMS_XMLDOM.getDocumentElement(doc);
-- Access element
nodelist := DBMS_XMLDOM.getElementsByTagName(docelem, 'NAME');
node := DBMS_XMLDOM.item(nodelist, 0);
childnode := DBMS_XMLDOM.getFirstChild(node);
-- Manipulate element
DBMS_XMLDOM.setNodeValue(childnode, 'raj');
DBMS_XMLDOM.writeToBuffer(ndoc, buf);
DBMS_OUTPUT.put_line('After:'||buf);
DBMS_XMLDOM.freeDocument(doc);
INSERT INTO person VALUES (var);
END;
/
これによって、次の出力が生成されます。
Before:<PERSON> <NAME>ramesh</NAME> </PERSON> After:<PERSON> <NAME>raj</NAME> </PERSON>
この問合せでは、データが変更されたことを確認します。
SELECT * FROM person;
SYS_NC_ROWINFO$
---------------
<PERSON>
<NAME>raj</NAME>
</PERSON>
1 row selected.
例11-2 要素ノードの作成および関連情報の取得
DECLARE
doc DBMS_XMLDOM.DOMDocument;
elem DBMS_XMLDOM.DOMElement;
nelem DBMS_XMLDOM.DOMNode;
BEGIN
doc := DBMS_XMLDOM.newDOMDocument;
elem := DBMS_XMLDOM.createElement(doc, 'ELEM');
nelem := DBMS_XMLDOM.makeNode(elem);
DBMS_OUTPUT.put_line('Node name = ' || DBMS_XMLDOM.getNodeName(nelem));
DBMS_OUTPUT.put_line('Node value = '|| DBMS_XMLDOM.getNodeValue(nelem));
DBMS_OUTPUT.put_line('Node type = ' || DBMS_XMLDOM.getNodeType(nelem));
DBMS_XMLDOM.freeDocument(doc);
END;
/
これによって、次の出力が生成されます。
Node name = ELEM
Node value =
Node type = 1
11.2.13 DBMS_XMLDOMを使用した大規模ノード処理
Oracle XML DBでは、抽象ストリームおよびストリーム操作の各メソッドが提供され、これらを使用して、64 KBを超えるXMLノードを処理できます。
Oracle Database 11gリリース(11.1)以前は、Oracle XML DBにより処理されるテキスト・ノードまたは属性値のサイズはそれぞれ64KBに制限されていました。リリース11.1以降、この制限はなくなりました。
このサイズ制限を克服し、ノードにグラフィック・ファイル、PDFファイル、およびマルチバイト文字エンコーディングを含めるには、次の抽象ストリームが使用できます。これらの抽象PL/SQLストリームは、対応するJavaストリームに類似しています。各入力ストリームには関連ライターまたはデータ・プロデューサがあり、各出力ストリームには関連リーダーまたはデータ・コンシューマがあります。
-
バイナリ入力ストリーム: バイトの連続した(配列ではない)線形空間として、データ・コンシューマにはソース・データへの読取り専用アクセスが与えられます。コンシューマは、(表現内容を問わず)基礎となるバイナリ形式のソース・データに反復して読取りアクセスできます。つまり、変換されていないRAW形式のソース・データへ読取りアクセスします。コンシューマは、このバイト・シーケンスがノードに存在しているとみなします。ソース・データの形式や表現の指定はありません。特に、関連付けられたキャラクタ・セットはありません。
-
バイナリ出力ストリーム: バイトの連続した(配列ではない)線形空間として、データ・プロデューサにはターゲット・データへの書込み専用アクセスが与えられます。プロデューサはバイナリ形式のターゲット・データに反復して書込みアクセスできます。つまり、データ・セマンティクスのない純粋なバイナリ形式でのターゲット・データへ書込みアクセスします。プロデューサはバイト・シーケンスを渡し、ターゲット・データはこれらのバイトと置換されます。データ変換は行われません。
-
文字入力ストリーム: 文字の連続した(配列ではない)線形空間として、データ・コンシューマには、ソース・データの表現や形式とは関係なくソース・データへの読取り専用アクセスが与えられます。ソース・データの変換は行われる場合も、行われない場合もあります。
-
文字出力ストリーム: 文字の連続した(配列ではない)線形空間として、データ・プロデューサはターゲット・データに反復して書込み専用アクセスができます。プロデューサは文字シーケンスを渡し、ターゲット・データはこの文字シーケンスと置換されます。渡されたデータの変換は行われる場合も、行われない場合もあります。
入力ストリームにはそれぞれ、open、read、closeという抽象メソッドがあります。出力ストリームにはそれぞれ、open、write、flush、closeという抽象メソッドがあります。出力ストリームについては、ノードが物理的に書き込まれる前にストリームを閉じる必要があります。
読取りおよび書込みには、4つの一般ノード・アクセス・モデルがあります。各アクセス・モデルには、バイナリ・バージョンとキャラクタ・バージョンの両方があります。データ型DOMNode
で定義されているバイナリ・ストリーム・メソッドおよび文字ストリーム・メソッドは、これらのアクセス・モデルを認識します。
アプリケーションはクライアントとして機能し、そのサービス・プロバイダとしてパーサーを使用します。パーサーのモードによって、ストリーム・データ・フローの起動元がパーサーであるか、アプリケーションであるかが決定されます。
-
パーサーがプッシュ・モードである場合は、アプリケーションから出力ストリームのパーサーにデータがプッシュされて、要求した操作の結果がパーサーから戻されます。
-
パーサーがプル・モードである場合は、アプリケーションによって、入力ストリームのパーサーからデータがプルされます。ストリームの各データ項目が、1つの解析イベントの結果となります。
アクセス・モデルはそれぞれ別の項で説明しており、パッケージDBMS_XMLDOM
の大規模ノードで動作するPL/SQLのファンクションおよびプロシージャについても説明しています。各サブプログラムの名前は、データを読み取る(get)か書き込む(set)か、およびパーサーがプッシュ・モード(push)で使用されているか、プル・モード(pull)で使用されているかを反映しています。
get-pushおよびset-pullを除くすべてのアクセス・モデル(バイナリまたは文字)について、使用できる具体的なストリームが(暗黙的に)提供されています。get-pushおよびset-pullについては、提供される抽象ストリーム・タイプのサブタイプを定義し、さらにそのアクセス・メソッド(open、closeなど)を実装する必要があります。get-pushおよびset-pullについては、ストリーム・タイプをインスタンス化し、ストリームをアクセス・メソッドへの引数として提供します。たとえば、get-pushにはmy_node.getNodeValueAsCharacterStream(my-stream)
、get-pullにはmy_node.getNodeValueAsCharacterStream()
を使用します。Oracleが提供する具体的なストリームを使用するため、get-pullには明示的なストリーム引数は必要ありません。
注意:
文字データ・ストリームにアクセスすると、使用するアクセス・メソッドにより、アクセスされるノードのキャラクタ・セットが決まります。ストリームへのアクセスにJavaを使用する場合、Javaプログラムから見えるキャラクタ・セットはUCS2(またはアプリケーション固有のキャラクタ・セット)です。ストリームへのアクセスにPL/SQLを使用する場合、PL/SQLプログラムから見えるキャラクタ・セットはデータベース・セッションのキャラクタ・セット(またはアプリケーション固有のキャラクタ・セット)です。しかし、いずれの場合も、XMLデータはデータベース・キャラクタ・セットのデータベースに格納されます。
次の説明では、C1はデータベースに格納されているノードのキャラクタ・セットを、C2はプログラムから見えるノードのキャラクタ・セットを示しています。
関連トピック
関連項目:
-
大規模ノード処理のためのJava関数の詳細は、Oracle Database XML Java APIリファレンスを参照してください。
-
大規模ノード処理のためのC関数の詳細は、Oracle Database XML C APIリファレンスを参照してください。
11.2.14 大規模ノード処理のGet-Pushモデル
このモデルでは、プッシュ・モードのパーサーを使用して、DOMノードの値を取得します。Oracle XML DBでは、パーサーによって読み取られた出力ストリームにノード・データを書き込みます。
このモデルでノード値を読み取るため、バイナリ出力ストリームまたは文字出力ストリームが作成され、Oracle XML DBに渡されます。この場合、ソース・データはノード値です。Oracle XML DBは、ノード・データをストリームに追加することで出力ストリームを移入します。ストリームが文字出力ストリームの場合、キャラクタ・セットC2がセッションのキャラクタ・セットになり、必要に応じてC1からC2にノード・データが変換されます。また、ノードのデータ型は、Oracle XML DBでサポートされる型になることができます。ノード・データ型が文字データでない場合は、まずノード・データがC2の文字データに変換されます。バイナリ出力ストリームの場合は、ノードのデータ型はRAW
またはBLOB
である必要があります。
この場合に使用するDBMS_XMLDOM
パッケージのプロシージャは次のとおりです。
PROCEDURE getNodeValueAsBinaryStream (n IN DBMS_XMLDOM.domnode,
value IN SYS.utl_BinaryOutputStream);
Oracle XML DBによるノードのコンテンツの書込み先となるSYS.utl_BinaryOutputStream
の実装が渡されます。ノードのデータ型は、RAW
またはCLOB
である必要があります。それ以外の場合は、例外が発生します。
PROCEDURE getNodeValueAsCharacterStream (n IN DBMS_XMLDOM.domnode,
value IN SYS.utl_CharacterOutputStream);
ノード・データは必要に応じてセッションのキャラクタ・セットに変換され、SYS.utl_CharacterOutputStream
にプッシュされます。
次の例は、ノード値をバイナリ・データとして読み取り、writeメソッドをMyBinaryOutputStream
と呼ばれるユーザー定義サブタイプSYS.utl_BinaryOutPutStream
で実行しているところを示しています。
例11-3 ユーザー定義サブタイプSYS.util_BinaryOutputStream()の作成
CREATE TYPE MyBinaryOutputStream UNDER SYS.utl_BinaryOutputStream (
CONSTRUCTOR FUNCTION MyBinaryOutputStream ()
RETURN SELF AS RESULT,
MEMBER FUNCTION write (bytes IN RAW) RETURN INTEGER,
MEMBER PROCEDURE write (bytes IN RAW, offset IN INTEGER, length IN OUT
INTEGER),
MEMBER FUNCTION flush () RETURN BOOLEAN,
MEMBER FUNCTION close () RETURN BOOLEAN);
);
-- Put code here that implements these methods
...
例11-4 ユーザー定義ストリームによるノード値の取得
DECLARE
ostream MyBinaryOutputStream = MyBinaryOutputStream ();
node DBMS_XMLDOM.domnode;
...
BEGIN
...
-- This drives the write methods in MyBinaryOutputStream,
-- flushes the data, and closes the stream after the value has been
-- completely written.
DBMS_XMLDOM.getNodeValueAsBinaryStream (node, ostream);
...
END;
11.2.15 大規模ノード処理のGet-Pullモデル
このモデルでは、プル・モードのパーサーを使用して、DOMノードの値を取得します。Oracle XML DBでは、パーサーによって書き込まれた入力ストリームからイベント・データを読み取ります。
このモデルでノード値を読み取るため、Oracle XML DBはバイナリ入力ストリームまたは文字入力ストリームを作成し、この値をコール元に戻します。文字入力ストリームのキャラクタ・セットC2は、現在のセッションのキャラクタ・セットです。Oracle XML DBは、コール元がノード・データをストリームから抽出するに従って入力ストリームを移入するため、Oracle XML DBは再度データ・プロデューサになります。ストリームが文字入力ストリームの場合は、ノード・データ型はOracle XML DBでサポートされる型になることができ、文字の場合は必要に応じてノード・データはC1からC2に変換されます。ノード・データが文字以外の場合は、C2の文字に変換されます。バイナリ入力ストリームの場合、ノードのデータ型はRAW
またはBLOB
である必要があります。
この場合に使用するDBMS_XMLDOM
パッケージのファンクションは、getNodeValueAsBinaryStream
およびgetNodeValueAsCharacterStream
です。
FUNCTION getNodeValueAsBinaryStream(n IN DBMS_XMLDOM.domnode) RETURN SYS.utl_BinaryInputStream;
このファンクションは、大規模ノード処理のSet-Pullモデルの項で説明している定義済メソッドで読み取ることができる新しいPL/SQL SYS.utl_BinaryInputStream
のインスタンスを戻します。ノードのデータ型は、RAW
またはBLOB
である必要があります。それ以外の場合は、例外が発生します。
FUNCTION getNodeValueAsCharacterStream (n IN DBMS_XMLDOM.domnode) RETURN SYS.utl_CharacterInputStream;
このファンクションは、定義済メソッドで読み取ることができる新しいPL/SQL SYS.utl_CharacterInputStream
のインスタンスを戻します。ノード・データが文字の場合は、現行セッションのキャラクタ・セットに変換されます。ノード・データが文字データでない場合は、最初に文字データに変換されます。
例11-5では、ノード値をバイナリ・データとして50バイトずつ読み取っています。
例11-6では、ノード値を文字データとして50文字ずつ読み取っています。
例11-5 バイナリ・データのGet-Pull
DECLARE istream SYS.utl_BinaryInputStream; node DBMS_XMLDOM.domnode; buffer raw(50); numBytes pls_integer; ... BEGIN ... istream := DBMS_XMLDOM.getNodeValueAsBinaryStream (node); -- Read stream in 50-byte chunks LOOP numBytes := 50; istream.read ( buffer, numBytes); if numBytes <= 0 then exit; end if; -- Process next 50 bytes of node value in buffer END LOOP ... END;
例11-6 文字データのGet-Pull
DECLARE istream SYS.utl_CharacterInputStream; node DBMS_XMLDOM.domnode; buffer varchar2(50); numChars pls_integer; ... BEGIN ... istream := DBMS_XMLDOM.getNodeValueAsCharacterStream (node); -- Read stream in 50-character chunks LOOP numChars := 50; istream.read ( buffer, numChars); IF numChars <= 0 then exit; END IF; -- Process next 50 characters of node value in buffer END LOOP ... END;
11.2.16 大規模ノード処理のSet-Pullモデル
このモデルでは、取出しモードのパーサーを使用して、DOMノードの値を設定します。Oracle XML DBでは、パーサーによって書き込まれた入力ストリームからイベント・データを読み取ります。
このモードでノード値を書き込むため、バイナリ入力ストリームまたは文字入力ストリームが作成され、Oracle XML DBに渡されます。
文字入力ストリームのキャラクタ・セットC2は、セッションのキャラクタ・セットです。Oracle XML DBは、データを入力ストリームから抽出し、ノードに移入します。ストリームが文字入力ストリームの場合、ノードのデータ型はOracle XML DBでサポートされる型になることができます。ノードのデータ型が文字以外の場合、まずストリーム・データはノード・データ型に変換されます。ノード・データ型が文字の場合は変換されないため、ノード・データはキャラクタ・セットC2に残ります。ストリームがバイナリ入力ストリーム
の場合、ノードのデータ型はRAW
またはBLOB
である必要があり、変換は行われません。
この場合に使用するDBMS_XMLDOM
パッケージのプロシージャは、setNodeValueAsBinaryStream
およびsetNodeValueAsCharacterStream
です。
PROCEDURE setNodeValueAsBinaryStream(n IN DBMS_XMLDOM.domnode,
value IN SYS.utl_BinaryInputStream);
Oracle XML DBがノードに移入するためデータの読取り元となるSYS.utl_BinaryInputStream
の実装が渡されます。ノードのデータ型は、RAW
またはBLOB
である必要があります。それ以外の場合は、例外が発生します。
PROCEDURE setNodeValueAsCharacterStream (n IN DBMS_XMLDOM.domnode,
value IN SYS.utl_CharacterInputStream);
Oracle XML DBがノードに移入するため読取り元となるSYS.utl_CharacterInputStream
の実装が渡されます。ノードのデータ型は、Oracle XML DBでサポートされる任意の有効な型になることができます。文字以外のデータ型の場合、ストリームから読み取られた文字データはノードのデータ型に変換されます。ノードのデータ型が文字またはCLOB
のいずれかの場合、変換は行われず、ノードのキャラクタ・セットはPL/SQLセッションのキャラクタ・セットになります。
例11-7は、ノード値をMyBinaryInputStream
と呼ばれるユーザー定義サブタイプSYS.utl_BinaryInputStream
で定義されたreadメソッドで作成したバイナリ・データに設定しているところを示しています。
MyBinaryInputStream
型のオブジェクトを使用して、ノード値を次のように設定できます。
DECLARE
istream MyBinaryInputStream = MyBinaryInputStream ();
node DBMS_XMLDOM.domnode;
...
BEGIN
...
-- This drives the read methods in MyBinaryInputStream
DBMS_XMLDOM.setNodeValueAsBinaryStream (node, istream);
...
END;
例11-7 バイナリ・データのSet-Pull
CREATE TYPE MyBinaryInputStream UNDER SYS.utl_BinaryInputStream (
CONSTRUCTOR FUNCTION MyBinaryInputStream ()
RETURN SELF AS RESULT,
MEMBER FUNCTION read () RETURN RAW,
MEMBER PROCEDURE read (bytes IN OUT RAW, numbytes IN OUT INTEGER),
MEMBER PROCEDURE read (bytes IN OUT RAW,
offset IN INTEGER,
length IN OUT INTEGER),
MEMBER FUNCTION close () RETURN BOOLEAN);
11.2.17 大規模ノード処理のSet-Pushモデル
このモデルでは、プッシュ・モードのパーサーを使用して、DOMノードの値を設定します。Oracle XML DBでは、パーサーによって読み取られた出力ストリームにノード・データを書き込みます。
このモードでノード値を新たに書き込むため、Oracle XML DBはバイナリ出力ストリームまたは文字出力ストリームを作成し、この値をコール元に戻します。文字出力ストリームのキャラクタ・セットC2は、現在のセッションのキャラクタ・セットです。コール元はデータを出力ストリームにプッシュし、Oracle XML DBはこれをOracle XML DBノードに書き込みます。ストリームが文字出力ストリームの場合、ノードのデータ型はOracle XML DBでサポートされる型になることができます。この場合、文字データはノード・データ型に変換されます。ノード・データ型が文字の場合、キャラクタ・セットC1はC2に変換されます。データ変換は行われません。ストリームがバイナリ入力ストリームの場合、ノードのデータ型はRAW
またはBLOB
である必要があります。この場合、ストリームはデータ変換されず読み取られます。
この場合に使用するDBMS_XMLDOM
パッケージのプロシージャは、setNodeValueAsBinaryStream
およびsetNodeValueAsCharacterStream
です。
FUNCTION setNodeValueAsBinaryStream(n IN DBMS_XMLDOM.domnode)
RETURN SYS.utl_BinaryOutputStream;
このファンクションは、コール元によるノード値の書込み先となるSYS.utl_BinaryOutputStream
のインスタンスを戻します。ノードのデータ型は、RAW
またはBLOB
である必要があります。それ以外の場合は、例外が発生します。
FUNCTION setNodeValueAsCharacterStream (n IN DBMS_XMLDOM.domnode)
RETURN SYS.utl_CharacterOutputStream;
このファンクションは、コール元によるノード値の書込み先となるPL/SQLのSYS.utl_CharacterOutputStream
型のインスタンスを戻します。ノードのデータ型は、任意の有効なOracle XML DBデータ型になることができます。タイプが文字またはCLOB
でない場合、ストリームに書き込まれる文字データは、ノードのデータ・タイプに変換されます。ノードのデータ型が文字またはCLOB
の場合、ストリームに書き込まれる文字データは、PL/SQLセッションのキャラクタ・セットからノードのキャラクタ・セットに変換されます。
例11-8では、50バイトのセグメントをSYS.utl_BinaryOutputStream
に書き込むことで、ノード値をバイナリ・データに設定しています。
例11-8 バイナリ・データのSet-Push
DECLARE
ostream SYS.utl_BinaryOutputStream;
node DBMS_XMLDOM.domnode;
buffer raw(500);
segment raw(50);
numBytes pls_integer;
offset pls_integer;
...
BEGIN
...
ostream := DBMS_XMLDOM.setNodeValueAsBinaryStream (node);
offset := 0;
length := 500;
-- Write to stream in 50-byte chunks
LOOP
numBytes := 50;
-- Get next 50 bytes of buffer
ostream.write ( segment, offset, numBytes);
length := length - numBytes;
IF length <= 0 then
exit;
END IF;
END LOOP
ostream.close();
...
END;
11.2.18 大規模ノード処理のバイナリ・ストリームか文字ストリームかの判断
サブプログラムDBMS_XMLDOM.useBinaryStream
を使用して、大規模ノードのコンテンツにアクセスする場合に文字ストリームを使用するか、バイナリ・ストリームを使用するかを判断します。
FUNCTION useBinaryStream (n IN DBMS_XMLDOM.domnode) RETURN BOOLEAN;
このファンクションは、ノードのデータ型がRAW
またはBLOB
の場合はSYS.utl_BinaryInputStream
またはSYS.utl_BinaryOutputStream
のいずれかを使用してノード値の読取りまたは書込みができるようTRUE
を戻します。値FALSE
が戻されると、ノード値はSYS.utl_CharacterInputStream
またはSYS.utl_CharacterOutputStream
を使用してのみアクセスできます。
11.3 PL/SQL Parser API for XMLType(DBMS_XMLPARSER)
PL/SQL Parser API for XMLType
(DBMS_XMLPARSER
)は、PL/SQL APIによってアクセス可能な解析結果ツリーを構築します。解析が正常に実行されない場合、エラーが発生します。
XMLパーサーまたはプロセッサというソフトウェア・モジュールは、XML文書を読み取り、その文書のコンテンツおよび構造にアクセスします。XMLパーサーは、他のモジュール(通常はアプリケーション)のかわりに作業を行います。
XML文書は、エンティティというデータの格納単位で構成され、各エンティティには解析対象または解析対象外のデータが含まれます。解析対象データは文字で構成され、その一部は文字データを構成し、その一部はタグとして機能します。タグ付けは、文書のデータ格納レイアウトおよび論理構造の記述をエンコーディングします。XMLは、データ格納レイアウトおよび論理構造を制約するメカニズムを提供します。
図11-2に、PL/SQL Parser for XMLType
(DBMS_XMLPARSER
)の使用方法を示します。次のステップを実行します。
-
PL/SQLメソッド
newParser()
を使用してパーサーのインスタンスを構成します。 -
parseBuffer()
、parseClob()
、parse(URI)
などのPL/SQLメソッドを使用してXML文書を解析します。入力された文書が妥当なXML文書ではない場合、エラーを戻されます。 -
パーサーでPL/SQL関数
getDocument
をコールし、DOMDocument
インタフェースを取得します。
例11-9では、単純なXML文書を解析します。XMLパーサー(DBMS_XMLPARSER.parser
のインスタンス)を作成し、これを使用して、indoc
変数のXML文書(テキスト)を解析します。解析によって、DBMS_XMLPARSER.getDocument
を使用してパーサーから取り出されるDOM文書が作成されます。文書全体を含んだDOMノードが作成され、そして、このノードが出力されます。DOM文書を解放(破棄)した後、DBMS_XMLPARSER.freeParser
を使用して、パーサーのインスタンスが解放されます。
注意:
メソッドDBMS_XMLPARSER.setErrorLog()
はサポートされません。
関連項目:
各DBMS_XMLPARSER
メソッドの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
例11-9 XML文書の解析
DECLARE indoc VARCHAR2(2000); indomdoc DBMS_XMLDOM.DOMDocument; innode DBMS_XMLDOM.DOMNode; myparser DBMS_XMLPARSER.parser; buf VARCHAR2(2000); BEGIN indoc := '<emp><name>De Selby</name></emp>'; myParser := DBMS_XMLPARSER.newParser; DBMS_XMLPARSER.parseBuffer(myParser, indoc); indomdoc := DBMS_XMLPARSER.getDocument(myParser); innode := DBMS_XMLDOM.makeNode(indomdoc); DBMS_XMLDOM.writeToBuffer(innode, buf); DBMS_OUTPUT.put_line(buf); DBMS_XMLDOM.freeDocument(indomdoc); DBMS_XMLPARSER.freeParser(myParser); END; /
これによって、次の出力が生成されます。
<emp><name>De Selby</name></emp>
親トピック: PL/SQL API for XMLType
11.4 PL/SQL XSLT Processor for XMLType(DBMS_XSLPROCESSOR)
PL/SQLパッケージDBMS_XSLPROCESSOR
を使用して、あるXML文書を別のXML文書に変換したり、XMLデータをHTML、PDFまたは他の形式に変換することができます。このパッケージは、DOMツリーで文書を検索して、それにExtensible Stylesheet Language Transformation (XSLT)文を適用して、変換された文書を生成します。
W3CのXSL勧告では、ソース・ツリーから結果ツリーへ変換する規則が記載されています。XSLで表現する変換は、XSLTスタイルシートと呼ばれます。指定した変換は、パターンをXSLTスタイルシートで定義したテンプレートに関連付けることで実行されます。結果ツリーの一部を作成するために、テンプレートはインスタンス化されます。XSLTは、XMLデータをWebブラウザで表示するために、HTMLに変換する場合にも広く使用されます。
注意:
Oracle XML DBアプリケーションには、個別のXMLパーサーは必要ありません。ただし、外部処理を必要とするアプリケーションでは、最初にXML Parser for PL/SQLを使用して文書構造を公開できます。Oracle XML Developer's KitのXML Parser for PL/SQLは、XML文書(または単独のDTD)を解析して、通常はクライアントで実行しているアプリケーションでこのXML文書を処理できるようにします。PL/SQL API for XMLType
は、サーバーで実行され、データベースにネイティブに統合されたアプリケーションに使用されます。サーバーでアプリケーションを実行するメリットには、パフォーマンスの向上、アクセスや操作のオプションの拡張などが含まれます。
- PL/SQL XSLT Processor for XMLType: 機能
PL/SQL XSLT Processor forXMLType
(DBMS_XSLPROCESSOR
)は、W3CのXSLT最終勧告(REC-xslt-19991116)に準拠します。これは単一のXSLスタイルシートを複数の文書に適用する便利で効率的な方法を提供します。 - PL/SQL XSLT Processor API for XMLType(DBMS_XSLPROCESSOR)の使用
XSLTプロセッサを作成して、DOM文書からSTYLESHEET
オブジェクトを構築して、プロセッサおよびスタイルシートを使用して文書を変換して、DOM API forXMLType
を使用してXSLT処理の結果を操作します。
関連トピック
親トピック: PL/SQL API for XMLType
11.4.1 PL/SQL XSLT Processor for XMLType: 機能
PL/SQL XSLT Processor for XMLType
(DBMS_XSLPROCESSOR
)は、W3CのXSLT最終勧告(REC-xslt-19991116)に準拠します。これは単一のXSLスタイルシートを複数の文書に適用する便利で効率的な方法を提供します。
PL/SQLパッケージDBMS_XSLPROCESSOR
内のメソッドでは、XSLプロセッサの実装に固有のPL/SQLデータ型である、PROCESSOR
およびSTYLESHEET
が使用されます。setErrorLog()
メソッドの例外を除き、Oracle XML DBでは、すべてのDBMS_XSLPROCESSOR
メソッドがサポートされています。
関連項目:
各DBMS_XSLPROCESSOR
メソッドの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
11.4.2 PL/SQL XSLT Processor API for XMLType(DBMS_XSLPROCESSOR)の使用
XSLTプロセッサを作成して、DOM文書からSTYLESHEET
オブジェクトを構築して、プロセッサおよびスタイルシートを使用して文書を変換して、DOM API for XMLType
を使用してXSLT処理の結果を操作します。
図11-3に、XSLT Processor for XMLType
(DBMS_XSLPROCESSOR
)の使用方法を示します。
次のステップを実行します。
-
newProcessor
を使用して、XSLTプロセッサを構成します。 -
newStylesheet
を使用して、DOM文書からSTYLESHEET
オブジェクトを構築します。 -
オプションとして、
setParams
を使用してSTYLESHEET
オブジェクトにパラメータを設定できます。 -
processXSL
を使用して、このプロセッサおよびSTYLESHEET
オブジェクトを使用しDOM文書を変換します。 -
PL/SQL DOM API for
XMLType
を使用して、XSLT処理の結果を操作します。
例11-10では、processXSL
プロシージャを使用してXML文書を変換します。これは、同じパーサー・インスタンスを使用して、変換するXMLテキストとXSLTスタイルシートの2つの異なるDOM文書を作成します。XSLプロセッサ・インスタンスが作成され、このスタイルシートをソースのXMLに適用して、新しいDOMフラグメントを生成します。DOMノード(outnode
)が、このフラグメントから作成され、このノードのコンテンツが出力されます。freeDocFrag
、freeParser
およびfreeProcessor
プロシージャをそれぞれ使用して、出力されたDOMフラグメント、パーサーおよびXSLTプロセッサ・インスタンスが解放されます。
例11-10 XSLスタイルシートを使用したXML文書の変換
DECLARE
indoc VARCHAR2(2000);
xsldoc VARCHAR2(2000);
myParser DBMS_XMLPARSER.parser;
indomdoc DBMS_XMLDOM.DOMDocument;
xsltdomdoc DBMS_XMLDOM.DOMDocument;
xsl DBMS_XSLPROCESSOR.stylesheet;
outdomdocf DBMS_XMLDOM.DOMDocumentFragment;
outnode DBMS_XMLDOM.DOMNode;
proc DBMS_XSLPROCESSOR.processor;
buf VARCHAR2(2000);
BEGIN
indoc := '<emp><empno>1</empno>
<fname>robert</fname>
<lname>smith</lname>
<sal>1000</sal>
<job>engineer</job>
</emp>';
xsldoc := '<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8"/>
<!-- alphabetizes an xml tree -->
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="*|text()">
<xsl:sort select="name(.)" data-type="text"
order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="normalize-space(.)"/>
</xsl:template>
</xsl:stylesheet>';
myParser := DBMS_XMLPARSER.newParser;
DBMS_XMLPARSER.parseBuffer(myParser, indoc);
indomdoc := DBMS_XMLPARSER.getDocument(myParser);
DBMS_XMLPARSER.parseBuffer(myParser, xsldoc);
xsltdomdoc := DBMS_XMLPARSER.getDocument(myParser);
xsl := DBMS_XSLPROCESSOR.newStyleSheet(xsltdomdoc, '');
proc := DBMS_XSLPROCESSOR.newProcessor;
--apply stylesheet to DOM document
outdomdocf := DBMS_XSLPROCESSOR.processXSL(proc, xsl, indomdoc);
outnode := DBMS_XMLDOM.makeNode(outdomdocf);
-- PL/SQL DOM API for XMLType can be used here
DBMS_XMLDOM.writeToBuffer(outnode, buf);
DBMS_OUTPUT.put_line(buf);
DBMS_XMLDOM.freeDocument(indomdoc);
DBMS_XMLDOM.freeDocument(xsltdomdoc);
DBMS_XMLDOM.freeDocFrag(outdomdocf);
DBMS_XMLPARSER.freeParser(myParser);
DBMS_XSLPROCESSOR.freeProcessor(proc);
END;
/
これによって、次の出力が生成されます。
<emp>
<empno>1</empno>
<fname>robert</fname>
<job>engineer</job>
<lname>smith</lname>
<sal>1000</sal>
</emp>