この章では、PL/SQLでのAPI for XMLType
の使用方法を説明します。
この章の内容は次のとおりです。
この章では、PL/SQL Application Program Interface(API)for XMLType
について説明します。内容は次のとおりです。
PL/SQLドキュメント・オブジェクト・モデル(DOM)API for XMLType
(パッケージDBMS_XMLDOM
): XMLType
オブジェクトにアクセスするために使用します。XML Schemaに基づく文書およびXML Schemaに基づかない文書にアクセスできます。データベースを起動する前に、初期化ファイル(.ORA
)に読取り元ディレクトリおよび書込み先ディレクトリを指定する必要があります。次に例を示します。
UTL_FILE_DIR=/mypath/insidemypath
読取り元ファイルおよび書込み先ファイルは、サーバーのファイル・システムに存在する必要があります。
DOMは、XML文書のメモリー内ツリーベースのオブジェクト表現で、要素および属性へのプログラム・アクセスを可能にします。DOMオブジェクトおよびそのインタフェースは、W3C勧告です。プログラム・アクセス用のAPIなど、XML文書のDOMを指定します。DOMは、解析対象ドキュメントをオブジェクトのツリーとして表示します。
PL/SQL XML Parser API for XMLType
(パッケージDBMS_XMLPARSER
): XML文書のコンテンツおよび構造にアクセスするために使用します。
PL/SQL XSLT Processor for XMLType
(パッケージDBMS_XSLPROCESSOR
): XSLTを使用してXML文書を他のフォーマットに変換するために使用します。
PL/SQL API for XMLType
を使用すると、次のタスクを実行できます。
XMLType
表、列およびビューの作成
別のキャラクタ・セットでエンコードされたデータからのXMLType
インスタンスの作成
XMLType
データへのアクセス
XMLType
データの操作
関連項目:
|
XMLType
ではメモリー内または仮想ドキュメント・オブジェクト・モデル(DOM)が提供されるため、XMLの遅延ロード(実体化の遅延ともいいます)というメモリー節約プロセスを使用できます。このプロセスは、データ行が要求されたときに、データ行のみをロードすることによって、メモリー使用量を最適化します。メモリーの使用量が大きくなりすぎた場合に、文書内の参照済の部分を廃棄します。XMLの遅延ロードは、多くの同時ユーザーが大規模なXML文書にアクセスする必要があるスケーラブルなアプリケーションに有効です。
XMLType
データ型では、XML Schemaもサポートされています。XML Schemaを作成し、XMLを使用してオブジェクト・リレーショナル記憶域からのマッピングに注釈を付けることができます。PL/SQL DOM APIを使用するには、まずXML Schemaを作成して登録します。その後、作成するXMLType
表および列が、登録したXML Schemaに準拠するように指定できます。
PL/SQLのXMLType
コンストラクタまたはcreateXML()
XMLType
メソッドを使用することにより、Oracleでサポートされているキャラクタ・セットのいずれかでエンコードされたデータから、XMLType
インスタンスを作成できます。ソースのXMLデータは、BFILE
またはBLOB
データ型を使用して指定する必要があります。データのエンコーディングは、csid
引数で指定されます。この引数が0
(ゼロ)の場合、ソース・データのエンコーディングは、「XML 1.0 Reference」の付録Fで指定されているとおりに、XMLのプロローグから判断されます。
getBLOBVal()
メソッドは、要求したキャラクタ・セットでXMLコンテンツを取り出します。
注意: AL32UTF8は、XMLType データに適切なOracle Databaseキャラクタ・セットです。これはIANAの登録済標準であるUTF-8エンコーディングと同等であり、すべての有効なXML文字をサポートします。
Oracle Databaseのデータベース・キャラクタ・セットUTF8(ハイフンなし)と、データベース・キャラクタ・セットAL32UTF8またはキャラクタ・エンコーディングUTF-8を混同しないでください。AL32UTF8は、データベース・キャラクタ・セットUTF8に置き換わったものです。XMLデータに対してUTF8を使用しないでください。UTF8でサポートされるのはUnicodeバージョン3.1以下のみで、すべての有効なXML文字がサポートされるわけではありません。AL32UTF8には、そのような制限はありません。 XMLデータにUTF8データベース・キャラクタ・セットを使用すると、システムが停止したり、セキュリティに悪影響を与えたりする場合があります。入力した文書要素の名前にデータベース・キャラクタ・セットでサポートされない文字が含まれている場合、その文字のかわりに置換文字(通常は「 |
この項では、PL/SQL DOM API for XMLType
であるDBMS_XMLDOM
について説明します。
関連項目: 各DBMS_XMLDOM メソッドの説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
World Wide Web Consortium(W3C)によって勧告された一般的なDOM仕様を十分に理解している場合は、この項をスキップしてください。
W3Cによって勧告されたドキュメント・オブジェクト・モデル(DOM)は、XML文書の構造にアクセスするための汎用APIです。DOMは、動的HTMLを形式化するために開発されました。動的HTMLは、Webページのアニメーション、対話および動的更新に使用されます。DOMは、WebページおよびXML文書に、言語およびプラットフォームに依存しないオブジェクト・モデルを提供します。DOMは、XMLのコンポーネントおよび要素にアクセスおよび操作するための、言語およびプラットフォームに依存しないインタフェースを記述します。XML文書の構造を、コンテンツに依存しない汎用的な方法で表現します。XML文書のコンテンツ、属性およびスタイルを動的に削除、追加および編集するアプリケーションを作成できます。DOMによって、すべてのブラウザ、サーバーおよびプラットフォームで適切に動作するアプリケーションを作成できます。
Oracle XML Developer's Kit(Oracle XDK)は、様々な方法でW3C DOM APIを拡張します。これらの拡張は、データベースに適用されないクライアント側の操作と関連するもの以外、すべてOracle XML DBでサポートされています。この種類の手続き型処理は、Oracle XDKのJavaおよびCコンポーネントで、SAXインタフェースを介して実行できます。
関連項目: 『Oracle XML Developer's Kitプログラマーズ・ガイド』 |
XMLにアクセスして操作するためのすべてのOracle XML DB APIは、W3Cで承認された標準のXML処理要件に準拠しています。PL/SQL DOMは、W3CのDOM仕様のレベル1.0およびレベル2.0をサポートします。
Oracle9iリリース1(9.0.1)では、Oracle XDK 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の拡張機能を介してデータベースに完全に統合されています。
次に、それぞれのレベルを簡単に説明します。
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ドキュメントに追加するための単純なメカニズムです。
XML用の一般的なAPIは、主に2つのカテゴリに分類できます。
ツリーベース:DOMは、XML用の主要な汎用ツリーベースAPIです。
イベントベース:Simple API for XML(SAX)は、XML ParserとXMLアプリケーション間の、主要な汎用イベントベース・プログラム・インタフェースです。
DOMは、オブジェクトを作成することによって機能します。これらのオブジェクトは子オブジェクトおよびプロパティを持ち、子オブジェクトはさらにその子オブジェクトおよびプロパティを持ち、以下同様に続きます。オブジェクトは、オブジェクト階層を下って検索するか、HTML要素にID属性を明示的に指定することによって参照されます。次に例を示します。
<img src="employee_jdoe.gif" ID="0123jdoe">
次に、構造的な操作の例を示します。
要素の再順序付け
要素の追加または削除
属性の追加または削除
要素名の変更
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
は、W3CのDOM勧告に準拠して、リレーショナル列またはオブジェクト・リレーショナル列にXMLType
のメモリー内インスタンスとして、XMLの構造化記憶域を定義および実装します。W3CのDOM勧告の詳細は、「PL/SQL DOM API for XMLTypeの使用: XMLデータの準備」を参照してください。
XML Schemaのサポート
PL/SQL DOM API for XMLType
は、XML Schemaをサポートしています。Oracle XML DBは、XML Schema内で注釈をメタデータとして使用し、XML文書およびその文書のデータベース・スキーマへのマッピングの両方を決定します。
注意: 下位互換性および柔軟性を得るために、PL/SQL DOMは、XML Schemaに基づく文書とXML Schemaに基づかない文書の両方をサポートします。 |
Oracle XML DBにXML Schemaが登録されると、PL/SQL DOM API for XMLType
は、ノード・オブジェクトの階層として関連XML文書のメモリー内ツリー表現を構築します。各ツリー表現は、独自の特別なインタフェースを持ちます。多くのノード・オブジェクト型は子ノード型を持つことができ、これによって、さらに特別な追加のインタフェースを実装できます。ノード型には、様々な型の子ノードを持つことができるものと、文書構造内に子ノードを持つことができないリーフ・ノードがあります。
Oracle XML DBは、DOMを使用して、複数のバックエンド・データ・ソースとXML間でデータを変換する標準的な方法を提供します。これによって、環境内の様々なデータ・ソースに個別のXML変換方法を使用する必要がなくなります。XMLデータを交換する必要があるアプリケーションでは、単一のネイティブなXMLデータベースを使用して、XML文書をキャッシュできます。そのため、XML DBは、Webアプリケーションとバックエンド・データ・ソース間の中間キャッシュとして機能することによって、リレーショナル・データベース内かファイル・システム内かにかかわらず、アプリケーションのパフォーマンスを向上させることができます。
Oracle XML DBに基づくアプリケーションを構築する場合、XDKに追加のコンポーネントは必要ありません。ただし、エンドツーエンドで実行するXML対応アプリケーションの統合スイートをデプロイするために、Oracle XDKのコンポーネントとともにOracle XML DBを使用することはできます。Oracle XDKの機能を次の処理に使用できます。
Simple API for XML(SAX)インタフェース処理。SAXは、XML Parserによって提供され、手続き型およびイベント・ベース・アプリケーションによって使用されるXML標準インタフェースです。
DOMインタフェース処理。再帰的な構造型オブジェクト・ベース処理に使用します。
Oracle XDKには、クライアント、ブラウザまたはプラグインで実行するアプリケーションを作成するための基本的な構成ブロックが含まれています。通常、これらのアプリケーションでは、XML文書の読取り、操作、変換、表示などを行います。様々なデプロイメント・オプションを提供するために、Oracle XDKはJava、C、およびC++で使用できます。Oracle XDKは、フル・サポートされており、商用再配布ライセンスを受けています。
Oracle XDK for Javaは、次のコンポーネントで構成されています。
XML Parsers: 業界標準のDOMインタフェースおよびSAXインタフェースを使用して、XMLを作成および解析します。Java、C、C++および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にカプセル化されたデータをデータベースにロードします。インストールに有効な追加機能が含まれています。
XSQLサーブレット: サーバー内のXML、SQLおよびXSLTを組み合せて、動的Webコンテンツを配信します。
XMLパイプライン・プロセッサ: XML制御ファイルを使用してJavaプロセッサを起動します。
XSLT VMおよびコンパイラ: コンパイルされたスタイルシートを使用する、高パフォーマンスなCベースのXSLT変換エンジンを提供します。
XML JavaBeans: Javaコンポーネントを使用して、XML文書を解析、変換、比較、取得および圧縮します。
関連項目: 『Oracle XML Developer's Kitプログラマーズ・ガイド』 |
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データを操作します。
XML SchemaをXML文書で参照できるようにするには、まず、登録する必要があります。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やFTPなど、パスベースのプロトコルを使用してOracle XML DBに文書が挿入されると、指定されたXML Schemaの名前および場所が事前に登録されていない場合は、その文書が準拠するXML Schemaが暗黙的に登録されます。
関連項目: 各DBMS_XMLSCHEMA メソッドの説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
XML Schema内で宣言された要素および属性は、対応するSQLオブジェクト型の個別の属性にマップされます。コメント、処理命令、名前空間、宣言および接頭辞など、XML文書内のエンコードされた他の情報は、直接表現されません。
このような追加情報を格納するため、SYS_XDBPD$
というバイナリ属性が、生成されたすべてのSQLオブジェクト型に存在します。この属性では、元のXML文書内で、他のデータベース属性を使用して格納されないすべての情報が格納されます。このような補足情報を保持することで、Oracle XML DB内に格納されるXML文書のDOM再現性が保証されます。つまり、データベースから取得されるXML文書は、格納される元の文書と同じものになります。
注意: このマニュアルの多くの例では、簡略化のためSYS_XDBPD$ 属性を省略しています。ただし、この属性は、スキーマの登録によって生成されたSQLオブジェクト型に常に存在します。 |
既存のリレーショナル・データおよびオブジェクト・リレーショナル・データをXMLアプリケーションで使用できるようにするには、データをXML形式にラップして、XMLType
ビューを作成します。これにより、PL/SQL DOM APIを使用してこのXMLデータにアクセスできます。
XMLとSQLオブジェクト型間のマッピングを表す注釈を含むXML Schemaを登録した後、このXML Schemaに準拠するXMLType
を作成できます。
次の例外を除き、Oracle XML DBでは、すべてのDBMS_XMLDOM
メソッドがサポートされています。
writeExternalDTDToFile()
writeExternalDTDToBuffer()
writeExternalDTDToClob()
関連項目: 各DBMS_XMLDOM メソッドの説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
DOM仕様では、「ドキュメント」という用語は、DOMの対象となる様々な情報またはデータのコンテナを示すために使用されます。DOMは、XML文書コンテナ内の要素を使用して、オブジェクト・ベースのツリー構造を作成し、XML文書に格納されたオブジェクトを管理および使用するためのインタフェースを定義および公開する方法を指定します。また、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
表12-1に、XMLおよびHTMLのノード型と、それに対応する使用可能な子ノード型を示します。
表12-1 XMLおよびHTMLのDOMノード型およびその子ノード型
ノード型 | 子ノード型 |
---|---|
Document |
|
DocumentFragment |
|
DocumentType |
子を持ちません。 |
EntityReference |
|
Element |
|
Attr |
|
ProcessingInstruction |
子を持ちません。 |
Comment |
子を持ちません。 |
Text |
子を持ちません。 |
CDATASection |
子を持ちません。 |
Entity |
|
Notation |
子を持ちません。 |
Oracle XML DB DOM API for XMLType
は、次のインタフェースも指定します。
A NodeListインタフェース: 次のような、順序付けられたノードのリストを処理します。
ノードの子
要素インタフェースのgetElementsByTagName
メソッドによって戻された要素
A NamedNodeMapインタフェース: 要素の属性など、名前属性によって参照される、順序付けられていない一連のノードを処理します。
Oracle Databaseには、キャラクタ・セット変換およびファイル・システムへの入出力用に、いくつかの拡張機能があります。PL/SQL API for XMLType
は、XML Schemaに基づくXMLインスタンスを操作するために最適化されています。関数newDOMDocument
は、指定されたXMLType
値でDOM文書ハンドルを構成します。
PL/SQLアプリケーションの一般的な使用例は次のとおりです。
XMLType
インスタンスのフェッチまたは構成
XMLType
インスタンス上でのDOMDocument
ノードの構成
DOM APIを使用したXMLデータへのアクセスおよび操作
注意: DOMDocument では、ノード型はXMLフラグメントのデータ自体ではなく、XMLフラグメントへのハンドルを表します。
たとえば、ノード値をコピーすると、 |
DOMのNodeList
オブジェクトおよびNamedNodeMap
オブジェクトはアクティブです。基礎となる文書構造への変更は、関連するすべてのNodeList
オブジェクトおよびNamedNodeMap
オブジェクトに反映されます。
たとえば、DOMユーザーが要素の子を含むNodeList
オブジェクトを取得し、その要素に子を追加(または削除や変更)した場合、これらの変更は自動的にNodeList
に伝播されます。同様に、ツリー内のノードへの変更は、NodeList
オブジェクトおよびNamedNodeMap
オブジェクトのノードへのすべての参照に伝播されます。
Text
、Comment
およびCDATASection
インタフェースは、CharacterData
インタフェースを継承します。
図12-1に、PL/SQL DOM API for XMLType
(DBMS_XMLDOM
)の使用方法を示します。
DOM文書(DOMDocument
)は、既存のXMLType
から作成するか、または空の文書として作成できます。
newDOMDocument
プロシージャが、XMLType
または空の文書を処理します。これによって、DOMDocument
インスタンスが作成されます。
DOM APIメソッド(createElement
、createText
、createAttribute
、createComment
など)を使用して、DOMツリーを検索および拡張します。
DOMElement
およびDOMText
などのメソッドの結果をmakeNode
に渡して、DOMNode
インタフェースを取得することもできます。
この項に、PL/SQL DOM API for XMLType
の使用例を示します。
このインタフェースを使用する際、DOMDocument
インスタンスごとにfreeDocument
プロシージャを必ずコールするようにしてください。このプロシージャにより、文書とそのノードがすべて解放されます。DOMDocument
インスタンスが解放された後でも、DOMDocument
インスタンスが構築されたXMLType
インスタンスにアクセスできます。
例12-1 DOM文書の作成および操作
この例では、XML文書の階層的なメモリー表現である、DOM文書を作成します。ここでは、このDOM文書へのハンドルを使用して、操作、出力、一部の変更、および変更後の出力を行います。ハンドルによりDOM文書を操作すると、この文書で表現されるXMLデータにも間接的に影響するため、変更後にそのデータを問い合せると、変更した結果が示されます。
メモリー内の文書は、PL/SQL関数であるnewDOMDocument
を使用してXMLType
変数から作成されます。この文書へのハンドルは、makeNode
関数を使用して作成されます。また、この文書は、writeToBuffer
関数を使用してVARCHAR2
バッファに書き込まれ、さらに、このバッファは、DBMS_OUTPUT.put_line
を使用して出力されます。
DBMS_XMLDOM
プロシージャを使用してこの文書を操作した後、XMLType
変数内の(変更された)データは表内に挿入され、問い合せることで変更を確認できます。データがデータベース表内に挿入されるまでは、永続的にならず、メモリー内にのみ存在します。この永続性は、メモリー内の文書(DOMDocument
インスタンス)が解放されてからデータベース問合せが作成されるという事実からわかります。
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.
例12-2 要素ノードの作成および関連情報の取得
この例では、空のDOM文書を作成し、要素ノード(<ELEM>
)をこの文書に追加します。DBMS_XMLDOM
APIノード・プロシージャを使用して、要素ノードの名前(<ELEM>
)、値(NULL
)および型(1
=要素ノード)を取得します。
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
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
で定義されているバイナリ・ストリーム・メソッドおよび文字ストリーム・メソッドは、これらのアクセス・モデルを認識します。アクセス・モデルはそれぞれ別の項で説明しており、パッケージDBMS_XMLDOM
の大規模ノードで動作するPL/SQLのファンクションおよびプロシージャについても説明しています。
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はプログラムから見えるノードのキャラクタ・セットを示しています。 |
関連項目:
|
このモデルでノード値を読み取るため、バイナリ出力ストリームまたは文字出力ストリームが作成され、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
で実行しているところを示しています。
例12-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); ); -- Here, you write the code to implement these methods ...
例12-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;
このモデルでノード値を読み取るため、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
のインスタンスを戻します。ノード・データが文字の場合は、現在のセッションのキャラクタ・セットに変換されます。ノード・データが文字以外の場合は、まず文字データに変換されます。
例12-5では、ノード値をバイナリ・データとして50バイトずつ読み取っています。
例12-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;
例12-6では、ノード値を文字データとして50文字ずつ読み取っています。
例12-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;
このモードでノード値を書き込むため、バイナリ入力ストリームまたは文字入力ストリームが作成され、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セッションのキャラクタ・セットになります。
例12-7は、ノード値をMyBinaryInputStream
と呼ばれるユーザー定義サブタイプSYS.utl_BinaryInputStream
で定義されたreadメソッドで作成したバイナリ・データに設定しているところを示しています。
例12-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);
MyBinaryInputStream
型のオブジェクトを使用して、ノード値を次のように設定できます。
DECLARE istream MyBinaryInputStream = MyBinaryInputStream (); node DBMS_XMLDOM.domnode; ... BEGIN ... -- This drives the read methods in MyBinaryInputStream DBMS_XMLDOM.setNodeValueAsBinaryStream (node, istream); ... END;
このモードでノード値を新たに書き込むため、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セッションのキャラクタ・セットからノードのキャラクタ・セットに変換されます。
例12-8では、50バイトのセグメントをSYS.utl_BinaryOutputStream
に書き込むことで、ノード値をバイナリ・データに設定しています。
例12-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;
ノード値にアクセスする場合に文字ストリームを使用するか、バイナリ・ストリームを使用するかを判断するには、DBMS_XMLDOM
パッケージに記載されている次の方法を使用します。
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
を使用してのみアクセスできます。
XML文書は、エンティティというデータの格納単位で構成され、各エンティティには解析対象または解析対象外のデータが含まれます。解析対象データは文字で構成され、中には文書内の文字データを形成したり、タグを形成するものもあります。タグ付けは、文書のデータ格納レイアウトおよび論理構造の記述をエンコーディングします。XMLは、データ格納レイアウトおよび論理構造を制約するメカニズムを提供します。
XMLパーサーまたはプロセッサというソフトウェア・モジュールは、XML文書を読み取り、その文書のコンテンツおよび構造にアクセスします。XMLパーサーは、他のモジュール(通常はアプリケーション)のかわりに作業を行います。
PL/SQL Parser API for XMLType
(DBMS_XMLPARSER
)は、PL/SQL APIによってアクセス可能な結果ツリーを構築します。解析が正常に実行されない場合、エラーが発生します。
PL/SQL Parser API for XMLType
(DBMS_XMLPARSER
)の各メソッドの説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
メソッドDBMS_XMLPARSER.setErrorLog()
はサポートされません。
図12-2に、PL/SQL Parser for XMLType
(DBMS_XMLPARSER
)の使用方法を示します。次の手順を実行します。
メソッドを使用してパーサーのインスタンスを構成します。
parseBuffer()
、parseClob()
およびparse(URI)
などのメソッドを使用してXML文書を解析します。入力された文書が妥当なXML文書ではない場合、エラーを戻されます。
パーサーでgetDocument
をコールし、DOMDocument
インタフェースを取得します。
例12-9 XML文書の解析
この例では、単純なXML文書を解析します。XMLパーサー(DBMS_XMLPARSERパーサー
のインスタンス)を作成し、これを使用して、indoc
変数のXML文書(テキスト)を解析します。解析によって、DBMS_XMLPARSER.getDocument
を使用してパーサーから取り出されるDOM文書が作成されます。文書全体を含んだDOMノードが作成され、そして、このノードが出力されます。DOM文書を解放(破棄)した後、DBMS_XMLPARSER.freeParser
を使用して、パーサーのインスタンスが解放されます。
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>
W3CのXSL勧告では、ソース・ツリーから結果ツリーへ変換する規則が記載されています。Extensible Stylesheet Language Transformation(XSLT)言語で表現される変換を、XSLスタイルシートといいます。指定された変換は、XSLTスタイルシートに定義したテンプレートとパターンを対応付けることによって実行されます。結果ツリーの一部を作成するために、テンプレートはインスタンス化されます。
Oracle XML DB PL/SQL DOM API for XMLType
は、XSLTもサポートします。これによって、あるXML文書を別のXML、またはHTMLやPDFなどのその他の形式に変換できます。XSLTは、XMLをブラウザで表示するために、HTMLに変換するためにも広く使用されます。
埋込みXSLTプロセッサは、Extensible Stylesheet Language(XSL)文に従い、DOMツリー構造内のXMLType
に存在するXMLデータを検索します。Oracle XML DBアプリケーションでは、以前のリリースで必要であったXML Parser for PL/SQLのような個別のパーサーは必要ありません。ただし、外部処理を必要とするアプリケーションでは、最初にXML Parser for PL/SQLを使用して文書構造を公開できます。
PL/SQLパッケージDBMS_XSLPROCESSOR
は、単一のスタイルシートを複数の文書に適用する便利で効率的な方法を提供します。このパッケージのパフォーマンスは、スタイルシートの解析が1回のみなので、SQL関数transform
およびXMLType
メソッドtransform()
のパフォーマンスよりも優れています。
注意: Oracle XDKのXML Parser for PL/SQLは、XML文書(または単独のDTD)を解析して、通常はクライアントで実行しているアプリケーションでこの文書を処理できるようにします。PL/SQL API forXMLType は、サーバーで実行され、データベースにネイティブに統合されたアプリケーションに使用されます。これによるメリットには、パフォーマンスの向上、アクセスや操作のオプションの拡張などが含まれます。 |
PL/SQL XSLT Processor for XMLType
(DBMS_XSLPROCESSOR
)は、Oracle XML DBによるXSLプロセッサの実装です。これは、W3CのXSLT最終勧告(REC-xslt-19991116)に準拠しています。この最終勧告には、XSLTスタイルシートの読取り方法および変換方法に関して、XSLプロセッサに必要な動作が記載されています。
PL/SQL XSLT Processor APIの型およびメソッドは、PL/SQLパッケージDBMS_XSLPROCESSOR
に付属しています。このパッケージ内のメソッドでは、XSLプロセッサの実装に固有の2つのPL/SQLデータ型である、PROCESSOR
およびSTYLESHEET
が使用されます。
setErrorLog()
メソッドの例外を除き、Oracle XML DBでは、すべてのDBMS_XSLPROCESSOR
メソッドがサポートされています。
関連項目: 各DBMS_XSLPROCESSOR メソッドの説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
図12-3に、XSLT Processor for XMLType
(DBMS_XSLPROCESSOR
)の使用方法を示します。次の手順を実行します。
newProcessor
を使用して、XSLTプロセッサを構成します。
newStylesheet
を使用して、DOM文書からSTYLESHEET
オブジェクトを構築します。
オプションとして、setParams
を使用してSTYLESHEET
オブジェクトにパラメータを設定できます。
processXSL
を使用して、このプロセッサおよびSTYLESHEET
オブジェクトを使用しDOM文書を変換します。
PL/SQL DOM API for XMLType
を使用して、XSLT処理の結果を操作します。
例12-10 XSLスタイルシートを使用したXML文書の変換
この例では、processXSL
プロシージャを使用してXML文書を変換します。これは、同じパーサー・インスタンスを使用して、変換するXMLテキストとXSLTスタイルシートの2つの異なるDOM文書を作成します。XSLプロセッサ・インスタンスが作成され、このスタイルシートをソースのXMLに適用して、新しいDOMフラグメントを生成します。DOMノード(outnode
)が、このフラグメントから作成され、このノードのコンテンツが出力されます。freeDocFrag
、freeParser
およびfreeProcessor
プロシージャをそれぞれ使用して、出力されたDOMフラグメント、パーサーおよびXSLTプロセッサ・インスタンスが解放されます。
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>
セキュリティ・オブジェクトがOracle XML DBリポジトリに格納される場合、XMLType
インスタンスとして格納されます。セキュリティ・オブジェクトには、様々な言語で検索または表示できるように、変換が必要な文字列も含まれています。これらの文字列を変換したものは、元のドキュメントと関連付ける必要があるため、Oracle XML DBリポジトリに元の文字列とともに格納されています。ユーザーの言語設定に応じて、これらの文字列を取得および操作できます。
Oracle XML DBでは、DBMS_XMLTRANSLATIONS
パッケージを使用して変換サポートが提供されています。このパッケージは変換を実行するインタフェースを提供し、様々な言語での検索や表示を可能にしています。
DBMS_XMLTRANSLATIONS
パッケージでは次のメソッドが提供されています。
updateTranslation
: 指定されたXPATH
にある、特定の言語での変換を更新します。その言語での変換が存在しない場合は、それが挿入されます。
setSourceLang
: ソース言語をXPATH
にある、特定の言語に設定します。
translateXML
: 特定の言語で文書を戻します。
getBaseDocument
: 主ドキュメントをすべての変換とともに戻します。
extractXLiff
: XMLTYPE
インスタンスまたはOracle XML DBリポジトリのリソースから変換をXLIFF
形式で抽出します。
mergeXLiff
: XMLTYPE
インスタンスまたはOracle XML DBリポジトリのリソースに、変換をXLIFF
形式でマージします。
disableTranslation
: 現在のセッションで変換を無効にして、問合せまたは取出しが、セッションの言語値を無視して主ドキュメント上で行われるようにします。
enableTranslation
: 現在のセッションで変換を有効にします。
関連項目: 各DBMS_XMLTRANSLATIONS メソッドの説明は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |