11 PL/SQL API for XMLType

いくつかのPL/SQLパッケージで、API for XMLTypeが提供されます。

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文書を他のフォーマットに変換するために使用します。

11.1.1 PL/SQL API for XMLType: 機能

PL/SQL API for XMLTypeを使用すると、XMLType表、列およびビューを作成したり、別のキャラクタ・セットでエンコードされたデータからXMLTypeインスタンスを構築したり、様々な方法でXMLTypeにアクセスして操作したりできます。

関連項目:

11.1.1.1 XMLデータの遅延ロード(実体化の遅延)

XMLの遅延ロードでは、データ行が要求されたときにのみデータ行がロードされるため、大規模なXML文書と多くの同時ユーザーが関与するアプリケーションのスケーラビリティが向上します。

XMLTypeでは動的メモリーまたは仮想ドキュメント・オブジェクト・モデル(DOM)が提供されるため、XMLの遅延ロード(実体化の遅延と言われることもあります)というメモリー節約プロセスを使用できます。このプロセスは、データ行が要求されたときに、データ行のみをロードすることによって、メモリー使用量を最適化します。メモリーの使用量が大きくなりすぎた場合に、文書内の参照済の部分を廃棄します。XMLの遅延ロードは、多くの同時ユーザーが大規模なXML文書にアクセスする必要がある高度にスケーラブルなアプリケーションをサポートします。

11.1.1.2 XMLTypeデータ型でのXML Schemaのサポート

SQLデータ型XMLTypeではXML Schemaがサポートされています。

XML Schemaを作成し、XMLを使用してオブジェクト・リレーショナル記憶域からのマッピングに注釈を付けることができます。PL/SQL DOM APIを使用するには、まずXML Schemaを作成して登録します。その後、作成するXMLType表および列が、登録したXML Schemaに準拠するように指定できます。

11.1.1.3 XMLTypeによる異なるキャラクタ・セットのデータのサポート

PL/SQLを使用して、Oracleでサポートされているキャラクタ・セットのいずれかでエンコードされたデータから、XMLTypeインスタンスを作成できます。これを行うには、PL/SQLのXMLTypeコンストラクタまたはXMLTypecreateXML()メソッドを使用します。

ソースの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を使用すると、システムが停止したりセキュリティに悪影響を及ぼす可能性があります。入力した文書要素の名前にデータベース・キャラクタ・セットでサポートされない文字が含まれている場合、その文字は置換文字(通常は「?」)で置き換えられます。このため、解析が終了して例外が発生します。リカバリ不能なエラーが発生する可能性があります。

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パッケージおよびタイプ・リファレンスです。

関連項目:

表11-1 XMLに関連するPL/SQL API

API ドキュメント 説明

XMLType

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「XMLType」

XMLTypeデータのXML操作(検証、変換)で使用するPL/SQLのAPI

データベースURIタイプ

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「データベースURIタイプ」

様々なURIタイプに使用される関数

DBMS_METADATA

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_METADATA」

データベース・ディクショナリからメタデータをXMLとして取り出す、または関連付けられているオブジェクトを再作成するために作成DDLを取り出してXMLを送信するためのPL/SQL API

DBMS_RESCONFIG

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_RESCONFIG」

リソース構成リストを操作し、リソースのリスナー情報を取り出すPL/SQL API

DBMS_XDB_ADMIN

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_ADMIN」

データベース管理者がOracle XML DBリポジトリを管理するためのPL/SQL API

DBMS_XDB_CONFIG

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_CONFIG」

Oracle XML DBの構成セッションを管理するためのPL/SQL API

DBMS_XDB_CONSTANTS

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_CONSTANTS」

Oracle XML DBで使用するPL/SQL定数

DBMS_XDB_REPOS

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_REPOS」

アプリケーション開発者がOracle XML DBリポジトリを使用するためのPL/SQL API

DBMS_XDBRESOURCE

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDBRESOURCE」

リポジトリ・リソース・メタデータおよびコンテンツを操作するPL/SQL API

DBMS_XDBT

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDBT」

リポジトリ・リソースにテキスト索引を作成するためのPL/SQL API

DBMS_XDB_VERSION

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDB_VERSION」

リポジトリ・リソースのバージョン管理のためのPL/SQL API

DBMS_XDBZ

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XDBZ」

Oracle XML DBリポジトリのACLベースのセキュリティ

DBMS_XEVENT

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XEVENT」

イベント関連のタイプを提供し、インタフェースをサポートするPL/SQL API

DBMS_XMLDOM

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLDOM」

DOM API for XMLTypeのPL/SQL実装

DBMS_XMLGEN

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLGEN」

SQL問合せ結果を正規のXML形式に変換するためのPL/SQL API

DBMS_XMLINDEX

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLINDEX」

PL/SQL API for XMLIndex

DBMS_XMLPARSER

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLPARSER」

DOM Parser API for XMLTypeのPL/SQL実装

DBMS_XMLSCHEMA

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLSCHEMA」

Oracle Database内のXML Schemaを管理(スキーマの登録、削除)するためのPL/SQL API

DBMS_XMLSCHEMA_ANNOTATE

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLSCHEMA_ANNOTATE」

Oracle固有のXML Schema注釈を追加および管理するためのPL/SQL API。

DBMS_XMLSTORAGE_MANAGE

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLSTORAGE_MANAGE」

XML Schemaの登録後にXMLデータの記憶域を管理および変更するためのPL/SQL API

DBMS_XMLSTORE

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XMLSTORE」

XMLデータをリレーショナル表に格納するためのPL/SQL API

DBMS_XSLPROCESSOR

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの章「DBMS_XSLPROCESSOR」

XSLTプロセッサのPL/SQL実装

11.2 PL/SQL DOM API for XMLType(DBMS_XMLDOM)

PL/SQL DOM API for XMLType (DBMS_XMLDOM)では、DOMを使用してXMLTypeインスタンスを操作できます。

関連項目:

DBMS_XMLDOMメソッドの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

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によって、すべてのブラウザ、サーバーおよびプラットフォームで適切に動作するアプリケーションを作成できます。

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データの準備を参照してください。

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を使用するためにデータを準備するには、次の操作を実行します。

  1. 標準のXML Schemaを作成します。
  2. 使用するSQLオブジェクトの定義をXML Schemaの注釈として付けます。
  3. 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が暗黙的に登録されます

関連項目:

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

Element(1つ以下)、ProcessingInstructionCommentDocumentType(1つ以下)

DocumentFragment

ElementProcessingInstructionCommentTextCDATASectionEntityReference

DocumentType

子を持ちません。

EntityReference

ElementProcessingInstructionCommentTextCDATASectionEntityReference

Element

ElementTextCommentProcessingInstructionCDATASectionEntityReference

Attr

TextEntityReference

ProcessingInstruction

子を持ちません。

Comment

子を持ちません。

Text

子を持ちません。

CDATASection

子を持ちません。

Entity

ElementProcessingInstructionCommentTextCDATASectionEntityReference

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アプリケーションの一般的な使用例は次のとおりです。

  1. XMLTypeインスタンスのフェッチまたは構成

  2. XMLTypeインスタンス上でのDOMDocumentノードの構成

  3. DOM APIを使用したXMLデータへのアクセスおよび操作

    注意:

    DOMDocumentでは、ノード型はXMLフラグメントのデータ自体ではなく、XMLフラグメントへのハンドルを表します。

    たとえば、ノード値をコピーすると、DOMDocumentによって、基礎となる同じデータへのハンドルもコピーされます。一方のハンドルによって変更されたデータは、もう一方のハンドルでアクセスしても参照できます。DOMDocumentハンドルが構成されたXMLType値はデータであり、このハンドルに対して行われたすべてのDOM操作の結果が反映されます。

11.2.10 DOM NodeListオブジェクトおよびNamedNodeMapオブジェクト

DOMDocumentインスタンスの基礎となるドキュメント構造を変更した場合、変更はすべての適切なNodeListオブジェクトおよびNamedNodeMapオブジェクトに反映されます。

たとえば、DOMユーザーが要素の子を含むNodeListオブジェクトを取得し、その要素に子を追加(または子の削除や既存の子の変更)した場合、これらの変更は自動的にNodeListに伝播されます。同様に、ツリー内のノードへの変更は、NodeListオブジェクトおよびNamedNodeMapオブジェクトのノードへのすべての参照に伝播されます。

TextCommentおよび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-1 PL/SQL DOM API for XMLTypeの使用

図11-1の説明が続きます
「図11-1 PL/SQL DOM API for XMLTypeの使用」の説明

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はプログラムから見えるノードのキャラクタ・セットを示しています。

関連項目:

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)の使用方法を示します。次のステップを実行します。

  1. PL/SQLメソッドnewParser()を使用してパーサーのインスタンスを構成します。

  2. parseBuffer()parseClob()parse(URI)などのPL/SQLメソッドを使用してXML文書を解析します。入力された文書が妥当なXML文書ではない場合、エラーを戻されます。

  3. パーサーでPL/SQL関数getDocumentをコールし、DOMDocumentインタフェースを取得します。

図11-2 PL/SQL Parser API for XMLTypeの使用

図11-2の説明が続きます
「図11-2 PL/SQL Parser API for XMLTypeの使用」の説明

例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>

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は、サーバーで実行され、データベースにネイティブに統合されたアプリケーションに使用されます。サーバーでアプリケーションを実行するメリットには、パフォーマンスの向上、アクセスや操作のオプションの拡張などが含まれます。

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)の使用方法を示します。

図11-3 PL/SQL XSLT Processor for XMLTypeの使用

図11-3の説明が続きます
「図11-3 PL/SQL XSLT Processor for XMLTypeの使用」の説明

次のステップを実行します。

  1. newProcessorを使用して、XSLTプロセッサを構成します。

  2. newStylesheetを使用して、DOM文書からSTYLESHEETオブジェクトを構築します。

  3. オプションとして、setParamsを使用してSTYLESHEETオブジェクトにパラメータを設定できます。

  4. processXSLを使用して、このプロセッサおよびSTYLESHEETオブジェクトを使用しDOM文書を変換します。

  5. PL/SQL DOM API for XMLTypeを使用して、XSLT処理の結果を操作します。

例11-10では、processXSLプロシージャを使用してXML文書を変換します。これは、同じパーサー・インスタンスを使用して、変換するXMLテキストとXSLTスタイルシートの2つの異なるDOM文書を作成します。XSLプロセッサ・インスタンスが作成され、このスタイルシートをソースのXMLに適用して、新しいDOMフラグメントを生成します。DOMノード(outnode)が、このフラグメントから作成され、このノードのコンテンツが出力されます。freeDocFragfreeParserおよび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>