この章では、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に基づかない文書にアクセスできます。データベースを起動する前に、ファイル(initialization.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のプロローグから判断されます。
|
注意: 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 DOM API for XMLTypeであるDBMS_XMLDOMについて説明します。
|
関連項目: 各DBMS_XMLDOMメソッドの説明は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 |
World Wide Web Consortium(W3C)によって勧告された一般的なDOM仕様を十分に理解している場合は、この項をスキップしてください。
W3Cによって勧告されたドキュメント・オブジェクト・モデル(DOM)は、XML文書の構造にアクセスするための汎用APIです。動的HTMLを使用すると、Webページのアニメーション、対話および動的更新が可能になります。DOMは、WebページおよびXML文書に、言語およびプラットフォームに依存しないオブジェクト・モデルを提供します。DOMは、XMLのコンポーネントおよび要素にアクセスおよび操作するための、言語およびプラットフォームに依存しないインタフェースを記述します。XML文書の構造を、コンテンツに依存しない汎用的な方法で表現します。XML文書のコンテンツ、属性およびスタイルを動的に削除、追加および編集するアプリケーションを作成できます。DOMによって、すべてのブラウザ、サーバーおよびプラットフォームで適切に動作するアプリケーションを作成できます。
Oracle XML Developer's Kit (XDK)は、様々な方法でW3C DOM APIを拡張します。これらの拡張は、データベースに適用されないクライアント側の操作と関連するもの以外、すべてOracle XML DBでサポートされています。この種類の手続き型処理は、Oracle XML Developer's KitのJavaおよびCコンポーネントで、Simple API for XML(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 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の拡張機能を介してデータベースに完全に統合されています。
次に、それぞれのレベルを簡単に説明します。
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です。
イベントベース。SAX (Simple API for XML)は、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データの準備」を参照してください。
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に基づくアプリケーションを構築する場合、Oracle XML Developer's Kitに追加のコンポーネントは必要ありません。ただし、エンドツーエンドで実行するXML対応アプリケーションの統合スイートをデプロイするために、Oracle XML Developer's KitのコンポーネントとともにOracle XML DBを使用することはできます。Oracle XML Developer's Kitの機能を次の処理に使用できます。
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およびコンパイラ: コンパイルされたスタイルシートを使用する、高パフォーマンスな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(S)や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
表13-1に、XMLおよびHTMLのノード型と、それに対応する使用可能な子ノード型を示します。
表13-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フラグメントへのハンドルを表します。
たとえば、ノード値をコピーすると、 |
基礎となるドキュメント構造への変更は、すべての適切なNodeListオブジェクトおよびNamedNodeMapオブジェクトに反映されます。
たとえば、DOMユーザーが要素の子を含むNodeListオブジェクトを取得し、その要素に子を追加(または削除や変更)した場合、これらの変更は自動的にNodeListに伝播されます。同様に、ツリー内のノードへの変更は、NodeListオブジェクトおよびNamedNodeMapオブジェクトのノードへのすべての参照に伝播されます。
Text、CommentおよびCDATASectionインタフェースは、CharacterDataインタフェースを継承します。
図13-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インタフェースを取得することもできます。
この項に、PL/SQL DOM API for XMLTypeの使用例を示します。
このインタフェースを使用する際、DOMDocumentインスタンスごとにfreeDocumentプロシージャを必ずコールするようにしてください。このプロシージャにより、文書とそのノードがすべて解放されます。DOMDocumentインスタンスが解放された後でも、DOMDocumentインスタンスが構築されたXMLTypeインスタンスにアクセスできます。
例13-1では、動的メモリー内のXML文書の階層的な表現であるDOM文書を作成します。
例13-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.
例13-1では、DOM文書へのハンドルを使用して、操作、出力、一部の変更、および変更後の出力を行います。ハンドルによりDOM文書を操作すると、この文書で表現されるXMLデータにも間接的に影響するため、変更後にそのデータを問い合せると、変更した結果が示されます。
DOM文書は、PL/SQL関数newDOMDocumentを使用してXMLType変数から作成されます。この文書へのハンドルは、makeNode関数を使用して作成されます。また、この文書は、writeToBuffer関数を使用してVARCHAR2バッファに書き込まれ、さらに、このバッファは、DBMS_OUTPUT.put_lineを使用して出力されます。
様々なDBMS_XMLDOMプロシージャを使用してこの文書を操作した後、XMLType変数内の(変更された)データは表内に挿入され、問い合せることで変更を確認できます。データがデータベース表内に挿入されると、永続的になります。それまではメモリー内にのみ存在します。この永続性は、動的メモリー内の文書(DOMDocumentインスタンス)が解放されてからデータベース問合せが作成されるという事実からわかります。
例13-2では、空のDOM文書を作成し、要素ノード(<ELEM>)をこの文書に追加します。DBMS_XMLDOM APIノード・プロシージャを使用して、要素ノードの名前(<ELEM>)、値(NULL)および型(1 =要素ノード)を取得します。
例13-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
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で実行しているところを示しています。
例13-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
...
例13-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 Model"の項で説明している定義済メソッドで読み取ることができる新しいPL/SQL SYS.utl_BinaryInputStreamのインスタンスを戻します。ノードのデータ型は、RAWまたはBLOBである必要があります。それ以外の場合は、例外が発生します。
FUNCTION getNodeValueAsCharacterStream (n IN DBMS_XMLDOM.domnode)
RETURN SYS.utl_CharacterInputStream;
このファンクションは、定義済メソッドで読み取ることができる新しいPL/SQL SYS.utl_CharacterInputStreamのインスタンスを戻します。ノード・データが文字の場合は、現在のセッションのキャラクタ・セットに変換されます。ノード・データが文字以外の場合は、まず文字データに変換されます。
例13-5では、ノード値をバイナリ・データとして50バイトずつ読み取っています。
例13-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;
例13-6では、ノード値を文字データとして50文字ずつ読み取っています。
例13-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セッションのキャラクタ・セットになります。
例13-7は、ノード値をMyBinaryInputStreamと呼ばれるユーザー定義サブタイプSYS.utl_BinaryInputStreamで定義されたreadメソッドで作成したバイナリ・データに設定しているところを示しています。
例13-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セッションのキャラクタ・セットからノードのキャラクタ・セットに変換されます。
例13-8では、50バイトのセグメントをSYS.utl_BinaryOutputStreamに書き込むことで、ノード値をバイナリ・データに設定しています。
例13-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によってアクセス可能な結果ツリーを構築します。解析が正常に実行されない場合、エラーが発生します。
メソッドDBMS_XMLPARSER.setErrorLog()はサポートされません。
|
関連項目: 各DBMS_XMLPARSERメソッドの説明は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 |
図13-2に、PL/SQL Parser for XMLType(DBMS_XMLPARSER)の使用方法を示します。次の手順を実行します。
PL/SQLメソッドnewParser()を使用してパーサーのインスタンスを構成します。
parseBuffer()、parseClob()、parse(URI)などのPL/SQLメソッドを使用してXML文書を解析します。入力された文書が妥当なXML文書ではない場合、エラーを戻されます。
パーサーでPL/SQL関数getDocumentをコールし、DOMDocumentインタフェースを取得します。
例13-9では、単純なXML文書を解析します。XMLパーサー(DBMS_XMLPARSER.parserのインスタンス)を作成し、これを使用して、indoc変数のXML文書(テキスト)を解析します。解析によって、DBMS_XMLPARSER.getDocumentを使用してパーサーから取り出されるDOM文書が作成されます。文書全体を含んだDOMノードが作成され、そして、このノードが出力されます。DOM文書を解放(破棄)した後、DBMS_XMLPARSER.freeParserを使用して、パーサーのインスタンスが解放されます。
例13-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>
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を使用して文書構造を公開できます。
|
注意: Oracle XML Developer's KitのXML Parser for PL/SQLは、XML文書(または単独のDTD)を解析して、通常はクライアントで実行しているアプリケーションでこのXML文書を処理できるようにします。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プロセッサの実装に固有のPL/SQLデータ型である、PROCESSORおよびSTYLESHEETが使用されます。
setErrorLog()メソッドの例外を除き、Oracle XML DBでは、すべてのDBMS_XSLPROCESSORメソッドがサポートされています。
|
関連項目: 各DBMS_XSLPROCESSORメソッドの説明は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 |
図13-3に、XSLT Processor for XMLType(DBMS_XSLPROCESSOR)の使用方法を示します。次の手順を実行します。
newProcessorを使用して、XSLTプロセッサを構成します。
newStylesheetを使用して、DOM文書からSTYLESHEETオブジェクトを構築します。
オプションとして、setParamsを使用してSTYLESHEETオブジェクトにパラメータを設定できます。
processXSLを使用して、このプロセッサおよびSTYLESHEETオブジェクトを使用しDOM文書を変換します。
PL/SQL DOM API for XMLTypeを使用して、XSLT処理の結果を操作します。
例13-10では、processXSLプロシージャを使用してXML文書を変換します。これは、同じパーサー・インスタンスを使用して、変換するXMLテキストとXSLTスタイルシートの2つの異なるDOM文書を作成します。XSLプロセッサ・インスタンスが作成され、このスタイルシートをソースのXMLに適用して、新しいDOMフラグメントを生成します。DOMノード(outnode)が、このフラグメントから作成され、このノードのコンテンツが出力されます。freeDocFrag、freeParserおよびfreeProcessorプロシージャをそれぞれ使用して、出力されたDOMフラグメント、パーサーおよびXSLTプロセッサ・インスタンスが解放されます。
例13-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>
セキュリティ・オブジェクトがOracle XML DBリポジトリに格納される場合、XMLTypeインスタンスとして格納されます。セキュリティ・オブジェクトには、様々な言語で検索または表示できるように、変換が必要な文字列も含まれています。これらの文字列を変換したものは、元のドキュメントと関連付ける必要があるため、Oracle XML DBリポジトリに元の文字列とともに格納されています。ユーザーの言語設定に応じて、これらの文字列を取得および操作できます。
Oracle XML DBでは、DBMS_XMLTRANSLATIONSパッケージを使用して変換サポートが提供されています。このパッケージは変換を実行するインタフェースを提供し、様々な言語での検索や表示を可能にしています。
PL/SQLパッケージ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パッケージおよびタイプ・リファレンス』を参照してください。 |