Oracle® XML Developer's Kit

プログラマーズ・ガイド

11gリリース2(11.2)

B56264-06(原本部品番号:E23582-06)

2014年12月

Oracle XML Developer's Kitプログラマーズ・ガイド, 11gリリース2(11.2)

B56264-06

Copyright © 2001, 2014, Oracle and/or its affiliates.All rights reserved.

原本著者: Drew Adams、Lance Ashdown、Janis Greenberg、Jack Melnick、Sue Pelski

原本協力者:  Steve Muench, Mark Scardina, Jinyu Wang

原本協力者: Nipun Agarwal, Sivasankaran Chandrasekar, Dan Chiba, Steve Ding, Mark Drake, Bill Han, Bhushan Khaladkar, Roza Leyderman, Valarie Moore, Ravi Murthy, Anguel Novoselsky, Helen Slattery, Balu Sthanikam, Lu Sun, Asha Tarachandani, Tim Yu, Simon Wong, Kongyi Zhou

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

例一覧

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

XDKの新機能

- Oracle XML Developer's Kit 11gリリース1(11.1)で導入された機能

- Oracle XDK 11gリリース2(11.2)で導入された機能

- Oracle XDK 11gリリース2 (11.2)で変更された機能

1 Oracle XML Developer's Kitの概要

- Oracle XML Developer's Kit(XDK)の概要

- XDKコンポーネント

- XMLパーサー

- XSLTプロセッサ

- XML Schema Processor

- XML Class Generator

- XML Pipeline Processor

- XDK JavaBeans

- Oracle XML SQL Utility(XSU)

- XML文書の処理または表現

- XML Class GeneratorでのXSUの使用

- TransX Utility

- XSQLページ・パブリッシング・フレームワーク

- SOAPサービス

- XSLT Virtual Machine(XVM)

- XDKコンポーネントによるXML文書の生成

- JavaによるXML文書の生成

- CによるXML文書の生成

- C++によるXML文書の生成

- XDK用の開発ツールと開発フレームワーク

- Oracle JDeveloper

- User Interface XML(UIX)

- Oracle Reports

- Oracle XML Gateway

- Oracle Data Provider for .NET

- XDKのインストール

第I部 XDK for Java

2 統合Java API for XML

- 統合Java APIの概要

- コンポーネントの統合

- 統合Java APIモデルへの移行

- XMLTypeクラスのJava DOM API

- 拡張API

- 文書作成Java API

3 Java XDKコンポーネントを使用する前に

- Java XDKコンポーネントのインストール

- Java XDKコンポーネントの依存性

- Java XDK環境の設定

- UNIXでのJava XDK環境変数の設定

- UNIXでのJava XDK環境のテスト

- WindowsでのJava XDK環境変数の設定

- WindowsでのJava XDK環境のテスト

- Java XDKコンポーネントのバージョンの確認

4 XML Parsing for Java

- XML Parsing for Javaの概要

- 前提条件

- 標準と仕様

- 巨大ノードの処理

- JavaでのXML解析

- XML解析でのDOM

- DOM作成

- 拡張性のあるDOM

- プラガブルなDOMサポート

- 遅延マテリアライズ

- 構成可能なDOM設定

- XML ParserでのSAX

- XML ParserでのJAXP

- XML Parserでの名前空間のサポート

- XML Parserでの検証

- XML Parserでの圧縮

- XML Parsing for Javaの使用: 概要

- XML Parser for Javaの使用: 基本プロセス

- XML Parserのデモ・プログラムの実行

- XML Parserコマンドライン・ユーティリティの使用

- DOMを使用したXMLの解析

- DOM APIの使用

- DOMパーサーのアーキテクチャ

- 基本的なDOM解析の実行

- 有用なメソッドおよびインタフェース

- 拡張性のあるDOMの作成

- プラガブルなDOMの使用

- 遅延マテリアライズの使用

- 構成可能なDOM設定の使用

- 構成可能なDOM設定へのパフォーマンス上の利点

- 拡張性のあるDOMアプリケーション

- 名前空間を使用したDOM操作の実行

- イベントを使用したDOM操作の実行

- 範囲を使用したDOM操作の実行

- TreeWalkerを使用したDOM操作の実行

- SAXを使用したXMLの解析

- SAX APIの使用

- 基本的なSAX解析の実行

- 名前空間を使用した基本的なSAX解析の実行

- XMLTokenizerを使用したSAX解析の実行

- JAXPを使用したXMLの解析

- JAXP APIの使用

- JAXPを介したSAX APIの使用

- JAXPを介したDOM APIの使用

- JAXPを介したXMLの変換

- JAXPを使用した解析

- JAXPを使用した基本的な変換の実行

- XMLの圧縮

- DOMからXMLへの圧縮と解凍

- DOMオブジェクトの圧縮

- DOMオブジェクトの解凍

- SAXからXMLへの圧縮と解凍

- SAXオブジェクトの圧縮

- SAXオブジェクトの解凍

- XML解析のヒントと方法

- DOMツリーからのノード値の抽出

- appendChild()を使用した文書のマージ

- DTDの解析

- 外部DTDのロード

- setDoctypeによるDTDのキャッシュ

- XML Parserでのキャラクタ・セットの処理

- オペレーティング・システム上でのXMLファイルの検出およびエンコーディング

- NCLOB列に格納されたXMLのエンコーディングの検出

- デフォルト以外のエンコーディングでのXMLファイルの作成

- 文字列内のXMLの操作

- アクセント付き文字を含むXML文書の解析

- タグ名内の特殊文字の処理

5 バイナリXML for Javaの使用

- バイナリXML for Javaの概要

- バイナリXML格納形式

- バイナリXMLプロセッサ

- バイナリXMLの使用モデル

- バイナリXMLの用語集

- スタンドアロン・モデル

- クライアントサーバー・モデル

- リポジトリを使用したWebサービス・モデル

- リポジトリを使用しないWebサービス・モデル

- バイナリXML for Javaの各部分

- バイナリXMLエンコーディング

- バイナリXMLデコーディング

- バイナリXMLボキャブラリ管理

- スキーマ管理

- スキーマ登録

- スキーマ識別

- スキーマ注釈

- ユーザー・レベル注釈

- システム・レベル注釈

- トークン管理

- JavaバイナリXMLパッケージの使用

- バイナリXMLエンコーダ

- スキーマなしオプション

- インライン・トークン・オプション

- バイナリXMLデコーダ

- スキーマ登録

- xsi:schemaLocationの解決

- バイナリXML DB

- メタデータの永続的格納

6 XSLT Processor for Javaの使用

- XSLT Processorの概要

- 前提条件

- 標準と仕様

- XSLT 1.0および2.0でのXML変換

- XSLT Processor for Javaの使用: 概要

- XSLT Processorの使用: 基本プロセス

- XSLT Processorのデモ・プログラムの実行

- XSLT Processorコマンドライン・ユーティリティの使用

- XSLT Processorコマンドライン・ユーティリティの使用: 例

- XMLの変換

- 基本的なXSL変換の実行

- XSL変換からのDOM結果の取得

- Oracle XSLT拡張によるプログラミング

- Oracle XSLT拡張の概要

- XSLT拡張関数の名前空間の指定

- XSLTでのstaticおよび非static Javaメソッドの使用

- コンストラクタ拡張関数の使用

- 戻り値拡張関数の使用

- XML変換のヒントと方法

- XML文書とXSLTのマージ

- 表の列に基づくHTML入力フォームの作成

7 Schema Processor for Javaの使用

- XML検証の概要

- 前提条件

- 標準と仕様

- DTDを使用したXML検証

- XDKでのDTDの例

- XMLスキーマを使用したXML検証

- XDKでのXML Schemaの例

- XMLスキーマとDTDの違い

- XML Schema Processorの使用: 概要

- XML Schema Processorの使用: 基本プロセス

- XML Schema Processorのデモ・プログラムの実行

- XML Schema Processorコマンドライン・ユーティリティの使用

- oraxmlを使用したスキーマに対する検証

- oraxmlを使用したDTDに対する検証

- XMLスキーマを使用したXMLの検証

- 内部参照XMLスキーマに対する検証

- 外部参照XMLスキーマに対する検証

- XML文書のサブセクションの検証

- SAXストリームからのXMLの検証

- DOMからのXMLの検証

- 設計した型および要素からのXMLの検証

- XSDValidator BeanによるXMLの検証

- XMLスキーマを使用したプログラミングのヒントと方法

- エンティティ・リゾルバによるスキーマの場所のオーバーライド

- DTDからXMLスキーマへの変換

8 JAXB Class Generatorの使用

- JAXB Class Generatorの概要

- 前提条件

- 標準と仕様

- JAXB Class Generatorの機能

- JAXBを使用したマーシャリングおよびアンマーシャリング

- JAXBでの検証

- JAXBのカスタマイズ

- JAXB Class Generatorの使用: 概要

- JAXBプロセッサの使用: 基本プロセス

- XML Schema Processorのデモ・プログラムの実行

- JAXB Class Generatorコマンドライン・ユーティリティの使用

- JAXB Class Generatorコマンドライン・ユーティリティの使用: 例

- XDKでサポートされていないJAXB機能

- JAXB Class Generatorを使用したXMLの処理

- 複合型のバインディング

- スキーマの定義

- Javaクラスの生成およびコンパイル

- XMLデータの処理

- 最上位レベル要素でのクラス名のカスタマイズ

- スキーマの定義

- Javaクラスの生成およびコンパイル

- XMLデータの処理

9 XML Pipeline Processor for Javaの使用

- XML Pipeline Processorの概要

- 前提条件

- 標準と仕様

- XMLのマルチステージ処理

- カスタマイズしたパイプライン・プロセス

- XML Pipeline Processorの使用: 概要

- XML Pipeline Processorの使用: 基本プロセス

- XML Pipeline Processorのデモ・プログラムの実行

- XML Pipeline Processorコマンドライン・ユーティリティの使用

- パイプラインでのXMLの処理

- パイプライン文書の作成

- パイプライン文書の例

- Pipeline Processorアプリケーションの作成

- パイプライン・エラー・ハンドラの作成

10 XDK JavaBeansの使用

- XDK JavaBeansの概要

- 前提条件

- 標準と仕様

- XDK JavaBeansの機能

- DOMBuilder

- XSLTransformer

- DBAccess

- XMLDBAccess

- XMLDiff

- XMLCompress

- XSDValidator

- XDK JavaBeansの使用: 概要

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

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

- XSLTransformer JavaBeanの使用: 基本プロセス

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

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

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

- sample1の実行

- sample2の実行

- sample3の実行

- sample4の実行

- sample5の実行

- sample6の実行

- sample7の実行

- sample8の実行

- sample9の実行

- sample10の実行

- XDK JavaBeansによるXMLの処理

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

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

- XML文書の非同期処理

- XMLDiff BeanによるXML文書の比較

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

11 XML SQL Utility(XSU)の使用

- XML SQL Utility(XSU)の概要

- 前提条件

- XSUの機能

- XSUの制限

- XML SQL Utility(XSU)の使用: 概要

- XSUの使用: 基本プロセス

- XSUのJava APIを使用したXMLの生成: 基本プロセス

- XSUのJava APIを使用したDMLの実行: 基本プロセス

- XSUのPL/SQL APIを使用したXMLの生成: 基本プロセス

- PL/SQL APIを使用したDMLの実行: 基本プロセス

- XSUのインストール

- データベースへのXSUのインストール

- アプリケーション・サーバーへのXSUのインストール

- WebサーバーへのXSUのインストール

- XSUのデモ・プログラムの実行

- XSUコマンドライン・ユーティリティの使用

- XSUコマンドライン・ユーティリティを使用したXMLの生成

- XSUコマンドライン・ユーティリティを使用したXMLTypeデータの生成

- XSUコマンドライン・ユーティリティを使用したDMLの実行

- XSU Java APIを使用したプログラミング

- OracleXMLQueryを使用した文字列の生成

- testXMLSQLプログラムの実行

- OracleXMLQueryを使用したDOMツリーの生成

- OracleXMLQueryを使用した結果ページの区切り

- 結果セット内の行数の制限

- ユーザーのセッション期間にわたるオブジェクトのオープン状態の保持

- OracleXMLQueryを使用した結果ページの区切り: 例

- スクロール可能な結果セットの生成

- カーソル・オブジェクトからのXMLの生成

- OracleXMLSaveを使用した行の挿入

- OracleXMLSaveを使用したすべての列へのXMLの挿入

- OracleXMLSaveを使用した列のサブセットへのXMLの挿入

- OracleXMLSaveを使用した行の更新

- OracleXMLSaveを使用したキー列による更新

- OracleXMLSaveを使用した列リストの更新

- OracleXMLSaveを使用した行の削除

- OracleXMLSaveを使用した行による削除

- OracleXMLSaveを使用したキーによる削除

- XSUのJava例外の処理

- 親である例外の取得

- 該当する行がない場合の例外の生成

- XSU PL/SQL APIを使用したプログラミング

- DBMS_XMLQueryを使用した単純な問合せからのXMLの生成

- DBMS_XMLQueryを使用した要素名の指定

- DBMS_XMLQueryを使用した結果ページの区切り

- XSUへのスタイルシートの設定

- XSUでの値のバインド

- DBMS_XMLSaveを使用したXMLの挿入

- DBMS_XMLSaveを使用したすべての列への値の挿入

- DBMS_XMLSaveを使用した列のサブセットへの挿入

- DBMS_XMLSaveを使用した更新

- DBMS_XMLSaveを使用したキー列による更新

- DBMS_XMLSaveを使用した列のリストの指定: 例

- DBMS_XMLSaveを使用した削除

- DBMS_XMLSaveを使用した行による削除: 例

- DBMS_XMLSaveを使用したキーによる削除: 例

- XSUのPL/SQL APIの例外処理

- DBMS_XMLSaveを使用したコンテキスト・ハンドルの再利用

- XSUを使用したプログラミングのヒントと方法

- XSUによるSQLとXML間のマップ方法

- SQLからXMLへのデフォルト・マッピング

- XMLからSQLへのデフォルトのマッピング

- 生成されるXMLのカスタマイズ

- XSUのSQL文の処理方法

- XSUのデータベースへの問合せ方法

- XSUの行の挿入方法

- XSUの行の更新方法

- XSUの行の削除方法

- DML実行後のXSUのコミット方法

12 TransX Utilityの使用

- TransX Utilityの概要

- 前提条件

- TransX Utilityの機能

- 多言語データ・ロードの簡略化

- 簡易データ形式のサポートおよびインタフェース

- その他のTransX Utilityの機能

- TransX Utilityの使用: 概要

- TransX Utilityの使用: 基本プロセス

- TransX Utilityのデモ・プログラムの実行

- TransXコマンドライン・ユーティリティの使用

- TransX Utilityのコマンドライン・オプション

- TransX Utilityコマンドライン・パラメータ

- TransX Utilityを使用したデータのロード

- データベースへのメッセージの格納

- 事前定義済形式でのデータセットの作成

- 入力XML文書の形式

- データセットの翻訳の指定

- データのロード

- データの問合せ

13 データ・ローディング・フォーマット(DLF)仕様

- DLFの概要

- DLFの命名規則

- 要素と属性

- 値

- ファイル拡張子

- DLFの一般的な構造

- DLFのツリー構造

- DLFの仕様

- DLFでのXML宣言

- DLFでの実体参照

- DLFの要素

- 最上位の表要素

- 変換の要素

- 検索キーの要素

- メタデータ要素

- データ要素

- DLFの属性

- DLFの属性

- XML名前空間の属性

- DLFの例

- 最小のDLFドキュメント

- 一般的なDLFドキュメント

- ローカライズしたDLFドキュメント

- DLFの参照

14 XSQLページ・パブリッシング・フレームワークの使用

- XSQLページ・パブリッシング・フレームワークの概要

- 前提条件

- XSQLページ・パブリッシング・フレームワークの使用: 概要

- XSQLページ・フレームワークの使用: 基本プロセス

- XSQLページ・フレームワークの設定

- Oracle JDeveloperでのXSQLページの作成およびテスト

- XSQLページのCLASSPATHの設定

- XSQLサーブレット・コンテナの構成

- 接続定義の設定

- XSQLページのデモ・プログラムの実行

- XSQLデモの設定

- XSQLデモの実行

- XSQLページ・コマンドライン・ユーティリティの使用

- XSQLサーブレットでのXMLの生成および変換

- XSQLページの作成

- バインド・パラメータの使用

- 字句置換パラメータの使用

- バインド・パラメータおよび置換パラメータのデフォルト値の指定

- XSQL Page Processorによる各種パラメータの処理方法

- SQL問合せからのデータグラムの生成

- 別のXML形式へのXMLデータグラムの変換

- 表示用のHTMLへのXMLデータグラムの変換

- JavaプログラムでのXSQLの使用

- XSQLページのヒントと使用方法

- XSQLページの制限事項

- XSQLサーブレットの使用ヒント

- XSQL出力をWMLドキュメントに変換中にDTDを指定する方法

- XSQLページ内の条件のテスト

- 問合せ結果を別の問合せのWHERE句に渡す方法

- 複数値のHTMLフォーム・パラメータを処理する方法

- PL/SQLラッパー・プロシージャを起動してXMLデータグラムを生成する方法

- ポストされたXMLコンテンツへのアクセス

- データベース接続を動的に変更する方法

- 現行のXSQLページから名前を取得する方法

- 一般的なXSQL接続エラーの解決

- 接続不能エラーの原因

- HTTP POST使用時に「処理対象の文書がポストされていません」というエラーが発生する原因

- XSQLページのセキュリティ上の注意事項

- 安全なディレクトリへのXSQL構成ファイルのインストール

- クライアントによるスタイルシートのオーバーライドをデフォルトで不可にする設定

- 置換パラメータの不正使用に対する予防措置

15 XSQLページ・パブリッシング・フレームワークの使用: 高度なトピック

- XSQL構成ファイル名のカスタマイズ

- スタイルシートの処理方法の制御

- クライアントのスタイルシートでのオーバーライド

- 戻されたドキュメントのコンテンツ・タイプの制御

- スタイルシートの動的割当て

- クライアントでのXSLTスタイルシートの処理

- 複数のスタイルシートの提供

- 配列値パラメータの使用

- 配列値パラメータの値のサポート

- 文字列からの配列値ページまたはセッション・パラメータの設定

- SQL文およびPL/SQL文での配列値パラメータのバインド

- 組込みアクションでのエラー・パラメータの設定

- エラー・パラメータでの条件付きロジックの使用

- XSQLアクション・ハンドラ・エラーのフォーマット

- XMLType問合せ結果のXSQLページへの反映

- ポストされたXMLコンテンツの処理

- XMLポスト・オプションの理解

- FOPシリアライザを使用したPDF出力の生成

- XSQLのカスタマイズの実行

- カスタムXSQLアクション・ハンドラの作成

- XSQLActionHandlerインタフェースの実装

- カスタムXSQLアクション内での複数値パラメータの使用

- カスタムXSQLシリアライザの実装

- カスタム・シリアライザの使用方法

- カスタム・シリアライザへの短縮名の割当て

- JDBCデータソースに対するカスタムXSQL Connection Managerの使用

- カスタムXSQL Connection Managerの作成

- カスタムConnection Managerの認証情報にアクセスする方法

- カスタムXSQLErrorHandlerの実装

- カスタムXSQLログ出力実装の提供

第II部 XDK for C

16 C XDKコンポーネントを使用する前に

- C XDKコンポーネントのインストール

- C XDKコンポーネント用のUNIX環境の構成

- UNIXでのC XDKコンポーネントの依存性

- UNIXでのC XDK環境変数の設定

- UNIXでのC XDK実行時環境のテスト

- UNIXでのC XDKコンパイル時環境の設定とテスト

- UNIXでのC XDKコンパイル時環境のテスト

- UNIXでのC XDKコンポーネントのバージョンの検証

- C XDKコンポーネント用のWindows環境の構成

- WindowsでのC XDKコンポーネントの依存性

- WindowsでのC XDK環境変数の設定

- WindowsでのC XDK実行時環境のテスト

- WindowsでのC XDKコンパイル時環境の設定とテスト

- WindowsでのC XDKコンパイル時環境のテスト

- WindowsでのC XDKコンポーネントとVisual C/C++の使用

- Visual C/C++でのプロジェクト・パスの設定(Windows)

- Visual C/C++でのライブラリ・パスの設定(Windows)

- 統合C APIの概要

- C XDKコンポーネントのグローバリゼーション・サポート

17 XSLT Processor for CおよびXVM Processor for Cの使用

- XVMプロセッサ

- XVMの使用例

- XVM Processorコマンドライン・ユーティリティの使用

- XVM Processor for Cの入手方法

- XSLTプロセッサ

- XSLTプロセッサの使用例

- XPathプロセッサの使用例

- C XSLT Processorコマンドライン・ユーティリティの使用

- Oracle XSLT Processor for Cの入手方法

- ソフトウェアに含まれるデモ・ファイルの使用

- XSLT for Cデモ・プログラムの作成

18 XML Parser for Cの使用

- XML Parser for Cの概要

- 前提条件

- 標準と仕様

- XML Parser for Cの使用

- Parser API for Cの概要

- XML Parser for Cのデータ型

- XML Parser for Cのデフォルト

- XML Parser for Cのコール順序

- XML Parser for Cの使用: 基本プロセス

- XML Parser for Cのデモ・プログラムの実行

- XML Parser for Cコマンドライン・ユーティリティの使用

- XML Parser for Cコマンドライン・ユーティリティの使用: 例

- DOM API for Cの使用

- C APIに対応するXML文書のデータ・エンコーディングの制御

- NULL文字終了および長さエンコードのC API関数の使用

- C APIを使用したエラー処理

- orastream関数の使用

- SAX API for Cの使用

- XML Pull Parser for Cの使用

- 基本的なXML Pull Parsing機能の使用

- XMLイベント・コンテキスト

- XMLイベント・コンテキストの概要

- 複数のXML文書の解析

- IDコールバック

- XML Pull Parserのエラー処理

- パーサー・エラー

- プログラミング・エラー

- サンプルPull Parserアプリケーション

- XML Pull Parserサンプル・アプリケーション

- サンプル文書

- XML Pull Parserサンプル・アプリケーションにより生成されたイベント

- OCIおよびXDK C APIの使用

- XMLType関数の使用および説明

- XML DBに対するXMLコンテキストの初期化

- クライアント上でのXMLTypeインスタンスの作成

- データベース・サーバーのXMLデータに対する操作

- OCIおよびXDK C APIの使用: 例

19 バイナリXML for Cの使用

- バイナリXML for Cの概要

- 前提条件

- バイナリXML格納形式

20 XML Schema Processor for Cの使用

- XML Schema Processor for Cの概要

- XML Schema Processor for Cの機能

- 標準への準拠

- XML Schema Processor for C: 提供されるソフトウェア

- C XML Schema Processorコマンドライン・ユーティリティの使用

- XML Schema Processor for Cの使用方法

- XML Schema Processor for Cサンプル・プログラムの実行

- ストリーミング・バリデータの概要

- 透明モードの使用

- 透明モードでのエラー処理

- ストリーミング・バリデータの例

- 不透明モードの使用

- 不透明モードでのエラー処理

- 不透明モードのアプリケーションの例

- 既存のXmlSchemaLoad()関数の拡張

- 検証オプション

21 Cを使用したXML差分の検出

- CにおけるXMLDiffの概要

- XMLDiffに関するプロセスのフロー

- XmlDiffの使用

- 最適化に関するユーザー・オプション

- ハッシュに関するユーザー・オプション

- XmlDiffでの入力文書の見方

- XmlDiffコマンドライン・ユーティリティの使用

- 入力文書のサンプル

- Xdiffインスタンス・ドキュメントのサンプル

- 出力モデルおよびXML処理命令

- Xdiff操作

- Xdiffインスタンス・ドキュメントの形式

- Xdiffスキーマ

- アプリケーションでのXMLDiffの使用

- 出力のカスタマイズ

- XmlPatchの使用

- XmlPatchコマンドライン・ユーティリティの使用

- アプリケーションでのXmlPatchの使用

- XmlHashの使用

- XmlDiffおよびXmlPatchのコール

22 C XDKでのSOAPの使用

- SOAP for Cの概要

- SOAPメッセージの概要

- SOAPメッセージの書式

- SOAPクライアントの使用

- SOAPサーバーの使用

- SOAP C関数

- SOAPの例1: XML文書の送信

- SOAPの例2: 明確化を求めるレスポンス

- SOAPの例3: POSTの使用

第III部 Oracle XDK for C++

23 C++ XDKコンポーネントを使用する前に

- C++ XDKコンポーネントのインストール

- C++ XDKコンポーネント用のUNIX環境の構成

- UNIXでのC++ XDKコンポーネントの依存性

- UNIXでのC++ XDK環境変数の設定

- UNIXでのC++ XDK実行時環境のテスト

- UNIXでのC++ XDKコンパイル時環境の設定とテスト

- UNIXでのC++ XDKコンパイル時環境のテスト

- UNIXでのC++ XDKコンポーネントのバージョンの検証

- C++ XDKコンポーネント用のWindows環境の構成

- WindowsでのC++ XDKコンポーネントの依存性

- WindowsでのC++ XDK環境変数の設定

- WindowsでのC++ XDK実行時環境のテスト

- WindowsでのC++ XDKコンパイル時環境の設定とテスト

- WindowsでのC++ XDKコンパイル時環境のテスト

- Visual C/C++でのC++ XDKコンポーネントの使用

24 統合C++インタフェースの概要

- 統合C++ APIの概要

- C++インタフェースへのアクセス

- OracleXML名前空間

- OracleXMLインタフェース

- Ctx名前空間

- OracleXMLデータ型

- Ctxインタフェース

- IO名前空間

- IOデータ型

- IOインタフェース

- ツール製品のパッケージ

- ツール製品のインタフェース

- エラー・メッセージ・ファイル

25 XML Parser for C++の使用

- Parser for C++の概要

- DOM名前空間

- DOMデータ型

- DOMインタフェース

- DOM TraversalおよびRangeデータ型

- DOM TraversalおよびRangeインタフェース

- パーサーの名前空間

- GParserインタフェース

- DOMParserインタフェース

- SAXParserインタフェース

- SAXイベント・ハンドラ

- スレッド・セーフティ

- XML Parser for C++の使用方法

- XML Parser for C++のデフォルト動作

- C++のサンプル・ファイル

26 XSLT Processor for C++の使用

- XSLT for C++の入手方法

- XSL名前空間

- XSLインタフェース

- XSLT for C++のDOMインタフェースの使用方法

- XSLT for C++の起動

- コマンドラインの使用方法

- 提供されるAPIを使用するためのC++コードの記述

- ソフトウェアに含まれるサンプル・ファイルの使用

27 XML Schema Processor for C++の使用

- XML Schema Processor for C++の概要

- XML Schema Processor for C++の機能

- オンライン・ドキュメント

- 標準への準拠

- XML Schema ProcessorのAPI

- XML Schema Processor for C++の起動

- 指定したXML Schema for C++サンプル・プログラムの実行

28 XPath Processor for C++の使用

- XPathインタフェース

- サンプル・プログラム

29 XML Class Generator for C++の使用

- XML C++ Class Generatorの入手方法

- XML C++ Class Generatorの使用

- 外部DTDの解析

- エラー・メッセージ・ファイル

- XML C++ Class Generatorコマンドライン・ユーティリティの使用

- XML C++ Class Generatorへの入力

- XML C++ Class Generatorの使用例

- XML C++ Class Generatorの例1: XML - Class Generatorの入力ファイルsample.xml

- XML C++ Class Generatorの例2: DTD - Class Generatorの入力ファイルsample.dtd

- XML C++ Class Generatorの例3: sample.cppサンプル・プログラム

第IV部 Oracle XDKリファレンス

30 XSQLページ・リファレンス

- XSQL構成ファイルのパラメータ

- <xsql:action>

- <xsql:delete-request>

- <xsql:dml>

- <xsql:if-param>

- <xsql:include-owa>

- <xsql:include-param>

- <xsql:include-posted-xml>

- <xsql:include-request-params>

- <xsql:include-xml>

- <xsql:include-xsql>

- <xsql:insert-param>

- <xsql:insert-request>

- <xsql:query>

- <xsql:ref-cursor-function>

- <xsql:set-cookie>

- <xsql:set-page-param>

- <xsql:set-session-param>

- <xsql:set-stylesheet-param>

- <xsql:update-request>

31 XDK標準

- XDKがサポートするXML標準

- XDKがサポートするXML標準の概要

- XDK for JavaのXML標準

- XDK for JavaのDOM標準

- XDK for JavaのXSLT標準

- XDK for JavaのJAXB標準

- XDK for JavaのためのPipeline Definition Language標準

- XDKがサポートするキャラクタ・セット

- XDK for Javaがサポートするキャラクタ・セット

- XDK for Cがサポートするキャラクタ・セット

A Oracle XDK for Java XMLエラー・メッセージ

- XMLパーサー・エラー・メッセージ

- DOMエラー・メッセージ

- XSLT変換エラー・メッセージ

- XPathエラー・メッセージ

- XMLスキーマ検証エラー・メッセージ

- スキーマ表現制約のエラー・メッセージ

- スキーマ・コンポーネント制約のエラー・メッセージ

- XSQLサーバー・ページのエラー・メッセージ

- XMLパイプラインのエラー・メッセージ

- Java API for XML Binding(JAXB)のエラー・メッセージ

B Oracle XDK for Java TXUエラー・メッセージ

- 一般的なTXUエラー・メッセージ

- DLFエラー・メッセージ

- TransX情報メッセージ

- TransXエラー・メッセージ

- アサーション・メッセージ

- 使用方法の説明メッセージ

C Oracle XDK for Java XSUエラー・メッセージ

- エラー・メッセージのキーワードと構文

- 一般的なエラー・メッセージ

- 問合せエラー・メッセージ

- DMLエラー・メッセージ

- エラー・メッセージの項目

用語集

索引

例一覧

- 3-1 Java XDKのライブラリ、ユーティリティおよびデモ

- 3-2 UNIXでのJava XDK環境のテスト

- 3-3 WindowsでのJava XDK環境のテスト

- 3-4 XDKVersion.java

- 4-1 サンプルXML文書

- 4-2 名前空間を使用しないサンプルXML文書

- 4-3 名前空間を使用したサンプルXML文書

- 4-4 selectNodes()を使用したDOMツリーのコンテンツの抽出

- 4-5 appendChild()の不適切な使用方法

- 4-6 appendChild()を使用した文書のマージ

- 4-7 DTDSample.java

- 4-8 文字列内のXMLの変換

- 4-9 アクセント付き文字を含む文書の解析

- 6-1 math.xml

- 6-2 math.xsl

- 6-3 math.htm

- 6-4 XSLTスタイルシートでの静的関数の使用

- 6-5 XSLTスタイルシートでのコンストラクタの使用

- 6-6 gettitle.xsl

- 6-7 msg_w_num.xml

- 6-8 msg_w_text.xml

- 6-9 msgmerge.xsl

- 6-10 msgmerge.xml

- 7-1 family.dtd

- 7-2 family.xml

- 7-3 report.xml

- 7-4 report.xsd

- 7-5 oraxmlを使用したスキーマに対する検証

- 7-6 oraxmlを使用したDTDに対する検証

- 8-1 sample3.xml

- 8-2 sample3.xsd

- 8-3 Address.java

- 8-4 sample10.xml

- 8-5 sample10.xsd

- 8-6 BusinessType.java

- 9-1 pipedoc.xml

- 11-1 コマンドラインでのskipRowsおよびmaxRowsの指定

- 11-2 upd_emp.xml

- 11-3 insertClob.sql

- 11-4 insertEmployee.sql

- 11-5 INSERT文の形式

- 11-6 insertClob2.sql

- 11-7 insertEmployee2.sql

- 11-8 insertClob3.sql

- 11-9 updateEmployee.sql

- 11-10 updateEmployee2.sql

- 11-11 行による削除

- 11-12 キーによる削除

- 11-13 XSUにより生成されたサンプル文書

- 11-14 customer.xml

- 11-15 createRelSchema.sql

- 12-1 表translated_messagesの構造

- 12-2 translated_messagesの問合せ

- 12-3 example.xml

- 12-4 Language属性を持つexample.xml

- 12-5 dateTime Row

- 12-6 example_es.xml

- 12-7 Language属性を持つexample_es.xml

- 12-8 txdemo1.java

- 13-1 DLFのツリー構造

- 13-2 最小のDLFドキュメント

- 13-3 サンプルDLF文書

- 13-4 DLFのローカライゼーション

- 14-1 サンプルXSQLページ

- 14-2 XSQLConfig.xmlの接続定義セクション

- 14-3 AvailableFlightsToday.xsql

- 14-4 <xsql:query>要素のラップ

- 14-5 CustomerPortfolio.xsql

- 14-6 CustomerPortfolio.xsql

- 14-7 DevOpenBugs.xsql

- 14-8 DevOpenBugs.xsql

- 14-9 デフォルト値の設定

- 14-10 複数のデフォルト値の設定

- 14-11 バインド変数のデフォルト

- 14-12 デフォルト値なしのバインド変数

- 14-13 flight-list.xsl

- 14-14 flight-list.xsl

- 14-15 flight-display.xsl

- 14-16 XSQLRequestSampleクラス

- 14-17 XSQLページの条件文

- 14-18 SQL問合せ間で値を渡す方法

- 14-19 複数値のパラメータの処理

- 14-20 複数値のページ・パラメータをSQL文に使用する方法

- 14-21 addmult PL/SQLプロシージャ

- 14-22 addmultwrapper PL/SQLプロシージャ

- 14-23 addmult.xsql

- 14-24 現行のXSQLページから名前を取得する方法

- 15-1 empToExcel.xsl

- 15-2 emp_test.xsql

- 15-3 emp_test_dynamic.xsql

- 15-4 複数の<?xml-stylesheet?>処理命令

- 15-5 XSQLページでの配列値パラメータの使用

- 15-6 testTableFunction

- 15-7 配列値パラメータを使用したXSQLページ

- 15-8 配列値パラメータによる行の制限

- 15-9 エラー・パラメータの設定

- 15-10 エラー・パラメータでの条件付き動作の実行

- 15-11 XSLTStylesheet

- 15-12 動的に作成されたXML文書の集計

- 15-13 Movie XML文書

- 15-14 XPathを使用した集計リストの抽出

- 15-15 XMLTypeの問合せ結果の挿入

- 15-16 XPath式でのXSQLバインド変数の使用

- 15-17 HTMLフォームから生成されたXML文書

- 15-18 FOPシリアライザのソース・コード

- 15-19 MyIncludeXSQLHandler.java

- 15-20 サーブレット・リクエストのテスト

- 15-21 カスタム・シリアライザ

- 15-22 カスタム・シリアライザへの短縮名の割当て

- 15-23 動的GIFイメージの出力

- 15-24 myErrorHandlerクラス

- 15-25 SampleCustomLoggerクラス

- 15-26 SampleCustomLoggerFactoryクラス

- 15-27 カスタム・ログ出力ファクトリの登録

- 16-1 C XDKのライブラリ、ヘッダー・ファイル、ユーティリティおよびデモ

- 16-2 C XDKのMake.batファイルの編集(Windows)

- 18-1 NSExample.xml

- 18-2 xml.out

- 18-3 orastream関数の使用

- 18-4 XMLイベント・コンテキスト

- 18-5 サンプルPull Parserアプリケーションの例

- 18-6 解析するサンプル文書

- 18-7 サンプル文書の解析により生成されたイベント

- 18-8 DOM APIを使用したスキーマベース文書の構築

- 18-9 DOM APIを使用したデータベース文書の変更

- 20-1 ストリーミング・バリデータの透明モード

- 20-2 ストリーミング・バリデータの不透明モードの例

- 20-3 XmlSchemaLoad()の例

- 20-4 新しいオプションを使用するストリーミング・バリデータの例

- 21-1 book1.xml

- 21-2 Xdiffインスタンス・ドキュメントのサンプル

- 21-3 Xdiffスキーマ: xdiff.xsd

- 21-4 XMLDiffアプリケーション

- 21-5 カスタマイズ済XMLDiff出力

- 21-6 XmlPatchのサンプル・アプリケーション

- 21-7 XmlHashプログラム

- 22-1 SOAPリクエスト・メッセージ

- 22-2 SOAPレスポンス・メッセージ

- 22-3 xmlsoap.hに定義されたSOAP C関数

- 22-4 例1 SOAPメッセージ

- 22-5 例1 SOAP Cクライアント

- 22-6 例2 SOAPメッセージ

- 22-7 例2 SOAP Cクライアント

- 22-8 例3 SOAPメッセージ

- 22-9 例3 SOAP Cクライアント

- 30-1 株価情報の取得

- 30-2 行の削除

- 30-3 表へのユーザー名の挿入

- 30-4 条件のテスト

- 30-5 ストアド・プロシージャで作成したXMLコンテンツの挿入

- 30-6 パラメータ値のXML表示の挿入

- 30-7 ポストされたXMLの挿入

- 30-8 リクエスト・パラメータの挿入

- 30-9 リクエスト・パラメータの挿入

- 30-10 リクエスト・パラメータの挿入

- 30-11 スタイルシートの条件のテスト

- 30-12 XML文書の挿入

- 30-13 Categories.xsql

- 30-14 TopTenTopics.xsql

- 30-15 HTMLCategories.xsql

- 30-16 WMLCategories.xsql

- 30-17 HTMLフォーム・パラメータに含まれるXMLの挿入

- 30-18 パラメータに受信したXMLの挿入

- 30-19 Hello World

- 30-20 ネストした構造の例

- 30-21 エラーが発生する問合せ

- 30-22 列別名を使用した問合せ

- 30-23 DynCursor PL/SQLパッケージ

- 30-24 REF CURSOR関数の実行

- 30-25 Cookieへのパラメータ値の設定

- 30-26 Cookieへのデータベースで生成した値の設定

- 30-27 3つのCookieの設定

- 30-28 複数のページ・パラメータの設定

- 30-29 データベースで生成した値のパラメータへの設定

- 30-30 セッション・パラメータの設定

- 30-31 スタイルシート・パラメータの設定

- 30-32 パラメータに受信したXMLの更新

図一覧

- 1-1 サンプルXMLプロセッサ

- 1-2 XML Parser for Java、XML Parser for CおよびXML Parser for C++

- 1-3 Oracle JAXB Class Generator

- 1-4 XSUによるSQL問合せの処理と、結果として戻るXML文書

- 1-5 XSQLページ・パブリッシング・フレームワーク

- 1-6 XSLT Virtual Machine

- 1-7 Java XDKコンポーネントを使用して構築したXMLプロセッサの例

- 1-8 XDK CコンポーネントによるXML文書の生成

- 1-9 XDK C++コンポーネントを使用したXML文書の生成

- 1-10 XDKのツールとフレームワーク

- 3-1 JDK 5のJava XDKコンポーネントの依存性

- 4-1 XML Parserのプロセス

- 4-2 DOM(ツリーベース)APIとSAX(イベントベース)APIの比較

- 4-3 XML Parser for Java

- 4-4 DOMパーサーの基本アーキテクチャ

- 4-5 SAXParserクラスの使用

- 4-6 JAXPを使用したSAX解析

- 4-6 JAXPを使用したDOM解析

- 5-1 バイナリXMLエンコーディング

- 5-2 バイナリXMLデコーダ

- 6-1 XSLT Processor for Javaの使用

- 7-1 XML Schema Processor

- 8-1 JAXB Class Generator for Java

- 9-1 パイプライン処理

- 9-2 Pipeline Processor for Javaの使用

- 10-1 DOMBuilder JavaBeanの使用方法

- 10-2 XSLTransformer JavaBeanの使用方法

- 10-3 XMLDBAccess JavaBeanの使用方法

- 10-4 XMLDiff JavaBeanの使用方法

- 11-1 XSUを使用したXMLの生成

- 11-2 XSUを使用したデータベースへのXMLの格納

- 11-3 データベース内でのXSUの実行

- 11-4 中間層でのXSUの実行

- 11-5 Webサーバー内でのXSUの実行

- 12-1 TransXアプリケーションの基本プロセス

- 14-1 XSQLページ・フレームワークのアーキテクチャ

- 14-2 XSQLページへのWebアクセス

- 14-3 XSQLホームページ

- 14-4 XSQLページ(AvailableFlightsToday.xsql)問合せのXML結果

- 14-5 XML Authorityを使用したflight-list.dtdの表示

- 14-6 XML形式のXSQLページ

- 14-7 XSLTスタイルシートを使用したHTMLのレンダリング

- 16-1 Visual C/C++でのインクルード・パスの設定

- 16-2 Visual C/C++での静的ライブラリ・パスの設定

- 16-3 Visual C/C++プロジェクトでのライブラリ名の設定

- 18-1 XML Parser for Cのコール順序

- 20-1 XML Schema Processor for Cの使用方法

表一覧

- 1-1 XDKコンポーネントの概要

- 1-2 XDK JavaBeansの概要

- 1-3 JavaでのXMLの生成

- 1-4 Java XDKによる追加の文書処理

- 2-1 非推奨になったXDBパッケージ・クラスと、それと同等の統合Java API

- 2-2 非推奨になったXMLTypeメソッド

- 2-3 XMLDocument.KINDおよびXMLDocument.CONNECTIONに基づくXMLDocument出力

- 3-1 XDKコンポーネントのJavaライブラリ

- 3-2 Java XDKコンポーネントのUNIXでの環境設定

- 3-3 Java XDKユーティリティ

- 3-4 Java XDKコンポーネントのWindowsでの環境設定

- 3-5 Java XDKユーティリティ

- 4-1 XML Parser for Javaの検証モード

- 4-2 DOMおよびSAXを使用したXML圧縮

- 4-3 Javaパーサーのデモ

- 4-4 oraxmlコマンドライン・オプション

- 4-5 DOMParser構成メソッド

- 4-6 XMLDocumentにより実装されるいくつかのインタフェース

- 4-7 有用なXMLDocumentのメソッド

- 4-8 Rangeクラスの有用なメソッド

- 4-9 NodeFilterインタフェースの静的フィールド

- 4-10 TreeWalkerインタフェースの有用なメソッド

- 4-11 SAX2ハンドラ・インタフェース

- 4-12 イベント・ハンドラを登録するためのSAXParserのメソッド

- 4-13 XMLTokenizerのメソッド

- 4-14 JAXPパッケージ

- 4-15 JAXPを使用したクラスの変換

- 6-1 XSLT Processorのサンプル・ファイル

- 6-2 oraxslのコマンドライン・オプション

- 6-3 XSLProcessorのメソッド

- 6-4 XMLDocumentFragmentのメソッド

- 7-1 XMLスキーマとDTDの機能の比較

- 7-2 oracle.xml.parser.schemaクラス

- 7-3 XML Schemaのサンプル・ファイル

- 8-1 javax.xml.bindのクラスおよびインタフェース

- 8-2 JAXB Class Generatorのデモ

- 8-3 orajaxbのコマンドライン・オプション

- 9-1 oracle.xml.pipeline.controller.Processクラスのメソッド

- 9-2 oracle.xml.pipeline.processesのクラス

- 9-3 PipelineProcessorメソッド

- 9-4 Pipeline Processorのサンプル・ファイル

- 9-5 orapipeコマンドライン・オプション

- 9-6 PipelineErrorHandlerメソッド

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

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

- 10-3 XMLDBAccessメソッド

- 10-4 XMLDiffメソッド

- 10-5 JavaBeanのサンプルJavaソース・ファイル

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

- 11-1 XSUサンプル・ファイル

- 11-2 getXMLオプション

- 11-3 putXMLオプション

- 12-1 TransX Utilityの機能

- 12-2 TransXの構成メソッド

- 12-3 TransX Utilityのサンプル・ファイル

- 12-4 TransX Utilityのコマンドライン・オプション

- 12-5 TransX Utilityコマンドライン・パラメータ

- 12-6 <column>の属性

- 12-7 dateおよびdate Timeの形式

- 13-1 属性および要素の出現回数の表記法

- 13-2 実体参照

- 13-3 DLF要素

- 13-4 最上位の表要素

- 13-5 変換の要素

- 13-6 検索キーの要素

- 13-7 メタデータ要素

- 13-8 データ要素

- 13-9 属性

- 13-10 DLF属性

- 13-11 XML名前空間の属性

- 14-1 XSQLサーブレットのデモ

- 15-1 <?xml-stylesheet?>の擬似属性

- 15-2 XSQLActionHandlerImplクラスの有用なメソッド

- 16-1 XDK Cコンポーネントの依存ライブラリ(UNIX)

- 16-2 XDK CコンポーネントのUNIXでの環境設定

- 16-3 C/C++ XDKユーティリティ(UNIX)

- 16-4 C XDKのコンパイル時環境のヘッダー・ファイル

- 16-5 XDK Cコンポーネントの依存ライブラリ(Windows)

- 16-6 C XDKコンポーネントのWindowsでの環境設定

- 16-7 C/C++ XDKユーティリティ(Windows)

- 16-8 XDK C APIの概要

- 17-1 XSLT Processor for C: コマンドライン・オプション

- 17-2 XSLT for Cのデモ・ファイル

- 18-1 XML、DOM、SAXの各APIのインタフェース

- 18-2 XML Parser for Cで使用するデータ型

- 18-3 Cパーサーのデモ

- 18-4 C XML Parserのコマンドライン・オプション

- 18-5 NULL文字終了および長さエンコードのC API関数

- 18-6 XMLType関数

- 20-1 XML Schema Processor for C: $ORACLE_HOMEで提供されるファイル

- 20-2 XML Schema Processor for C: 提供されるライブラリ

- 20-3 XML Schema for Cのサンプル

- 21-1 C言語に関するXmlDiffコマンドライン・オプション

- 21-2 Cコマンドライン・オプションに関するXmlPatch

- 23-1 C++ XDKのコンパイル時環境のヘッダー・ファイル

- 25-1 XML Parser for C++のサンプル・ファイル

- 26-1 XSLT for C++のサンプル・ファイル

- 27-1 XML Schema Processor for C++のコマンドライン・オプション

- 27-2 XML Schema Processor for C++のサンプル・ファイル

- 29-1 C++ Class Generatorのオプション

- 29-2 XML C++ Class Generatorファイル

- 30-1 組込みXSQLアクション・ハンドラ要素およびアクション・ハンドラ・クラス

- 30-2 XSQL構成ファイルの設定

- 30-3 <xsql:delete-request>の属性

- 30-4 <xsql:dml>の属性

- 30-5 <xsql:if-param>の属性

- 30-6 <xsql:include-owa>の属性

- 30-7 <xsql:include-xml>の属性

- 30-8 <xsql:include-xsql>の属性

- 30-9 <xsql:insert-param>の属性

- 30-10 <xsql:insert-request>の属性

- 30-11 <xsql:query>の属性

- 30-12 <xsql:set-cookie>の属性

- 30-13 <xsql:set-page-param>の属性

- 30-14 <xsql:set-session-param>の属性

- 30-15 <xsql:set-stylesheet-param>の属性

- 30-16 <xsql:update-request>の属性

- 31-1 XDKがサポートするXML標準の概要

はじめに

ここでは、次の項目について説明します。

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

対象読者

『Oracle XML Developer's Kitプログラマーズ・ガイド』は、Oracle XML Developer's Kit(XDK)の様々な言語コンポーネントを組み合せて、データベース内またはデータベース外の文書でXMLデータを生成および格納する方法を学習するアプリケーション開発者を対象としています。必要に応じて、例およびサンプル・アプリケーションを示します。

このドキュメントを使用するには、XMLおよびJava、C、C++などの第3世代プログラミング言語についての知識が必要です。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWeb サイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートをご購入のOracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info) か、聴覚に障害のあるお客様は (http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

関連ドキュメント

詳細は、次のOracle資料を参照してください。

- 『Oracle XML DB開発者ガイド』

- 『Oracle Database XML C APIリファレンス』

- 『Oracle Database XML C++ APIリファレンス』

- 『Oracle Database XML Java APIリファレンス』

- 『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

- Oracle Technology NetworkのOracle XDKホームページ
http://www.oracle.com/technetwork/database-features/xdk/overview/index.html

このマニュアルで使用する多くの例は、ソフトウェアの次のディレクトリにあります。

- $ORACLE_HOME/xdk/demo/java/

- $ORACLE_HOME/xdk/demo/c/

- $ORACLE_HOME/xdk/java/sample/

- $ORACLE_HOME/rdbms/demo/

このマニュアルの例の多くはサンプル・スキーマを使用していますが、これはOracle Databaseのインストール時に「基本インストール」を選択するとデフォルトでインストールされます。これらのスキーマの作成方法および使用方法の詳細は、『Oracle Databaseサンプル・スキーマ』を参照してください。

XMLに関するその他の情報は、次の資料を参照してください。

- 『Oracle Database 10g XML & SQL: Design, Build, & Manage XML Applications in Java, C, C++, & PL/SQL』(Mark Scardina、Ben Chang、Jinyu Wang著、Oracle Press出版) http://www.osborne.com/oracle/

- WROXシリーズ: 特にXML、XSLおよび開発について書かれた『XML Design and Implementation』(Paul Spencer著)

- 『Building Oracle XML Applications』(Steve Muench著、O'Reilly出版)http://www.oreilly.com/catalog/orxmlapp/

- 『The XML Bible』http://www.ibiblio.org/xml/books/biblegold/

- 『XML, Java, and the Future of the Web』(Jon Bosak著、Sun Microsystems出版) http://www.ibiblio.org/bosak/xml/why/xmlapps.htm

- 『XML for the Absolute Beginner』(Mark Johnson著、JavaWorld出版) http://www.javaworld.com/jw-04-1999/jw-04-xml_p.html

- 『XML And Databases』(Ronald Bourret著) http://www.rpbourret.com/xml/XMLAndDatabases.htm

- XML仕様(World Wide Web Consortium: W3C)http://www.w3.org/XML/

- XML.com(XMLリソースおよびコメントの広範囲なコレクション)http://www.xml.com/

- 『Annotated XML Specification』(Tim Bray著、XML.com) http://www.xml.com/axml/testaxml.htm

- XML.org(OASISが運営するXML言語専用の開発者向けリソース)http://xml.org/

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

XDKの新機能

次の項では、このマニュアルで導入または変更された機能について説明します。

- Oracle XML Developer's Kit 11gリリース1(11.1)で導入された機能

- Oracle XDK 11gリリース2(11.2)で導入された機能

- Oracle XDK 11gリリース2 (11.2)で変更された機能

Oracle XML Developer's Kit 11gリリース1(11.1)で導入された機能

- XMLノードへのDOMストリーム・アクセスは、PL/SQLおよびJavaのAPIによって実行されます。XML文書内のノードは64Kバイトを大幅に超えます。

関連項目:
「巨大ノードの処理」

- 新しくXDKにコンパクトなバイナリXMLプロセッサが追加されたことにより、エンコーダ、デコーダおよびトークン・マネージャが提供され、スキーマ・ベースまたはスキーマ・ベースでないストリームをXML1.0テキストおよびSAXイベントに、およびXML1.0テキストおよびSAXイベントから変換できます。形式は『Oracle XML DB開発者ガイド』で使用されているものと同一です。

関連項目:
第5章「バイナリXML for Javaの使用」

- バイナリXMLは、データベースの永続XMLに関する3番目の格納モデルであるバイナリXMLを追加します。JavaおよびCのAPIおよびPL/SQLパッケージに影響します。C APIでのバイナリXMLサポートは、XML Developer's KitとXML DBの両方で使用されます。

関連項目:
第19章「バイナリXML for Cの使用」

Javaでのプラガブルな拡張性のあるDOMにもサポートが提供されます。

- 拡張性のあるDOMのJavaサポートには、DOMノードの遅延ロード、DOMによるバイナリXMLの更新、同一のDOMソースを共有する複数のアプリケーション、出力としてのバイナリXML、およびDOMにおけるシャドウ・コピーが含まれます。

- プラガブルなDOMは、DOM実装を2つのレイヤー(DOM APIレイヤーおよびデータ・レイヤー)に分割します。データは内部またはプラグインのいずれかで、InfosetReaderインタフェースの実装によりアクセスされます。

- Java DOMに対して構成可能なサポートも提供されます。

関連項目:
「拡張性のあるDOM」

- 統合Java API for XMLにより、接続管理のセッション・プール・モデルを使用して、中間層のJavaプログラムがすべてのXMLTypeのメリットを利用できます。これにより、XMLTypeオブジェクトは、作成に使用されるデータベース・セッションから切断可能になります。

関連項目:
第2章「統合Java API for XML」

- JAXP 1.3の拡張XPathへのサポートにより、JavaのXSLTのパフォーマンスも向上します。サポートは静的および動的コンテキストに関するもので、ユーザーは実行時のコンテキストを登録できます。

- HTTP server for SOAが有効です。データベースは、PL/SQLパッケージ、プロシージャおよび機能をWebサービスとしてエクスポーズできます。データベースは、XQueryおよびSQL問合せを実行できます。

関連項目:
第22章「C XDKでのSOAPの使用」

- SOAP for Java and C++の各章は削除されました。

- XmlDiff for Cは、2つのXML文書間の差分を検出し、XMLに差分を表示します。XmlPatchは差分を出力し、ターゲットXML文書に変更を適用します。

関連項目:
第21章「Cを使用したXML差分の検出」

- JSR 170標準がサポートされています。

関連項目:
「標準と仕様」

- C Pull Parserは、SAXモデルと比較してメモリーのオーバーヘッドを削減します。

関連項目:
「XML Pull Parser for Cの使用」

- ストリーミング・バリデータによるCのサポートでXML処理が改善されます。

関連項目:
「ストリーミング・バリデータの概要」

- Document Updates For DLF/TransXが拡張されました。

関連項目:

- 第12章「TransX Utilityの使用」

- 第13章「データ・ローディング・フォーマット(DLF)仕様」

Oracle XDK 11gリリース2(11.2)で導入された機能

- XDK for Cのorastream関数を使用すると、巨大ノードにアクセスできます。

関連項目:
「orastream関数の使用」

Oracle XDK 11gリリース2 (11.2)で変更された機能

新規のアプリケーションでは次の機能を使用しないようにすることをお薦めします。これらの機能は現行リリースではサポートされていますが、将来のリリースでは非推奨となる可能性があります。特に、次の点に注意してください。

- XML DBアプリケーションでXSQL機能を使用しないでください。

- 第5章「バイナリXML for Javaの使用」の次の項で指定されているエンコーディング・タイプを使用しないでください。

- バイナリXMLボキャブラリ管理

- JavaバイナリXMLパッケージの使用

パフォーマンス向上のため、第11章「XSUの使用: 基本プロセス」で指定されているDBMS_XMLQueryおよびDBMS_XMLSaveパッケージはなく、Cで記述されデータベースに構築されているPL/SQLパッケージのDBMS_XMLGenおよびDBMS_XMLStoreを使用することを検討してください。

関連項目:
非推奨となったOracle XML DB構造体の詳細は、『Oracle XML DB開発者ガイド』を参照してください。

1 Oracle XML Developer's Kitの概要

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

- Oracle XML Developer's Kit(XDK)の概要

- XDKコンポーネント

- XDKコンポーネントによるXML文書の生成

- XDK用の開発ツールと開発フレームワーク

- XDKのインストール

Oracle XML Developer's Kit(XDK)の概要

オラクル社のOracle XML Developer's Kit (XDK)は様々な用途に使用できるコンポーネントのセットです。これらのコンポーネントを使用して、XMLを処理するC、C++およびJavaのソフトウェア・プログラムを構築およびデプロイできます。ビジネスのニーズに応じて、これらのコンポーネントをXMLアプリケーションに組み込むことができます。

注意:
Oracle Databaseリリース8.1または9.2から移行した場合、Oracle XDKとPL/SQLを併用するには、データベース・キャラクタ・セットにAL32UTF8を使用することを強くお薦めします。他のキャラクタ・セットを使用すると、エスケープされたエンティティを含むXMLデータをPL/SQLで処理するときに問題が発生する可能性があります。

Oracle XDKは、Oracle XMLソリューションの基盤を提供します。XDKはOracle XML DBをサポートしています。これは、データベースにXMLを格納して処理するために使用する一連のテクノロジです。XDKをOracle XML DBとともに使用して、Oracle Databaseで実行するアプリケーションを構築できます。XDKは、XML DBとは関係なく使用することもできます。

XML Dateのフォーマット

生成されたXML内の日付およびタイムスタンプは、現在XMLスキーマによって指定された形式になっています。『Oracle XML DB開発者ガイド』の「データベースからのXMLデータの生成」の「XMLELEMENTおよびXMLATTRIBUTES SQL関数」の「XMLの日付とタイムスタンプのフォーマット」を参照してください。

オラクル社ではOracle XDKをフル・サポートしており、商用再配布ライセンスを受けています。Oracle Databaseの標準インストールにXDKが含まれています。

表1-1に、XDKコンポーネントとその説明、サポートされているプログラミング言語、およびコンポーネントの使用方法が記載されている参照先を示します。

表1-1 XDKコンポーネントの概要

コンポーネント

説明

言語

参照先

XMLパーサー

業界標準のDOMインタフェースおよびSAXインタフェースを使用してXMLを作成および解析します。

Java、C、C++

- 第4章「XML Parsing for Java」

- 第18章「XML Parser for Cの使用」

- 第25章「XML Parser for C++の使用」

XML Compressor

XML文書をバイナリで圧縮および解凍できるようにします。この圧縮プログラムはXML Parser for Javaに組み込まれます。

Java

「XMLの圧縮」

Java API for XML Processing(JAXP)

作成したJavaプログラムから、SAX、DOM、XML Schema Processor、XSLTプロセッサまたは別のプロセッサを使用できるようにします。

Java

「JAXPを使用したXMLの解析」

XSLT Processor

XMLを、HTMLなどの他のテキストベースの形式に変換します。

Java、C、C++

- 第6章「XSLT Processor for Javaの使用」

- 第17章「XSLT Processor for CおよびXVM Processor for Cの使用」

- 第26章「XSLT Processor for C++の使用」

XML Schema Processor

スキーマを検証し、単純および複雑なXMLデータ型を使用可能にします。

Java、C、C++

- 第7章「Schema Processor for Javaの使用」

- 第20章「XML Schema Processor for Cの使用」

- 第27章「XML Schema Processor for C++の使用」

XML Class Generator

DTDまたはXMLスキーマからJavaクラスまたはC++クラスを生成して、WebフォームまたはアプリケーションからXMLデータを送信できるようにします。Java実装では、Java Architecture for XML Binding(JAXB)がサポートされます。

Java、C++

第8章「JAXB Class Generatorの使用」および第29章「XML Class Generator for C++の使用」

XML Pipeline Processor

XML Pipeline宣言文書に指定されたXMLプロセスを適用します。

Java

第9章「XML Pipeline Processor for Javaの使用」

XML JavaBeans

統合開発環境(IDE)、Java Server Pages(JSP)およびアプレットの使用を簡単にする、XDKコンポーネントをBeanでカプセル化したもののセットです。

Java

第10章「XDK JavaBeansの使用」

XML SQL Utility(XSU)

SQL問合せからXML文書、DTDおよびXMLスキーマを生成します。SQL問合せの結果をXMLに(またはその逆に)マップします。XSUのJavaクラスは、PL/SQLパッケージでミラー化されます。

Java、PL/SQL

第11章「XML SQL Utility(XSU)の使用」

TransX Utility

XMLを使用して、変換されたシード・データおよびメッセージをデータベースにロードします。

Java

第12章「TransX Utilityの使用」

XSQLサーブレット

サーバー内のXML、SQLおよびXSLTを組み合せて、動的Webコンテンツを配信します。

Java

第14章「XSQLページ・パブリッシング・フレームワークの使用」

Oracle SOAPサーバー

リクエストおよびレスポンスをインターネット経由で送受信するための軽量のSOAPメッセージング・プロトコルを提供します。

C

第22章「C XDKでのSOAPの使用」

XSLT Virtual Machine(XVM)

コンパイルされたスタイルシートをサポートする、高パフォーマンスのXSLT変換エンジンを提供します。

C、C++

「XVMプロセッサ」

関連項目:

- 第31章「XDK標準」のXDKによるXML関連の標準のサポートに関する項

- 「XDKコンポーネント」の、表1-1に示した各コンポーネントに関する詳細な説明

XDKコンポーネント

XDKコンポーネントを使用して、様々なXML処理を実行できます。たとえば、次のタスクを実行するプログラムを開発できます。

- XMLを解析します。

- XMLをDTDまたはXMLスキーマと照合して検証します。

- XSLTスタイルシートを適用してXML文書を別のXML文書に変換します。

- 入力XMLスキーマおよびDTDからJavaクラスおよびC++クラスを生成します。

図1-1に、前述のタスクを実行するXMLプロセッサの例を示します。

図1-1 サンプルXMLプロセッサ

XDKには、プログラム内で使用できるコンポーネントが含まれています。この項では、図1-1で示されている次のXDKコンポーネントについて説明します。

- XMLパーサー

- XSLTプロセッサ

- XML Schema Processor

- XML Class Generator

- XSQLページ・パブリッシング・フレームワーク

- XML Pipeline Processor

- XDK JavaBeans

- Oracle XML SQL Utility(XSU)

- TransX Utility

- SOAPサービス

- XSLT Virtual Machine(XVM)

XMLパーサー

XMLパーサーは、XML文書を読み取り、データの構造とプロパティを決定するプロセッサです。データを複数の部分に分割し、他のコンポーネントに提供します。

XMLプロセッサは、次のAPIを使用して解析されたXMLデータにプログラムでアクセスできます。

- データ要素ごとに順次アクセスする場合は、SAXインタフェースを使用します。SAXパーサーにイベント・ハンドラを登録して、特定のイベントが発生したときにコールバック・メソッドを起動できます。XML文書をインメモリー・ツリーとして表して操作またはナビゲートする場合は、DOM APIを使用します。

XDKには、XML Parser for Java、XML Parser for CおよびXML Parser for C++が含まれています。どのパーサーもDOM APIとSAX APIの両方をサポートしています。

XML Parser for JavaはJAXPバージョン1.2をサポートしています。これは、プロセッサの実装に関係なくDOM、SAX、XML SchemaおよびXSLTを使用可能にする標準APIです。これによって、プログラムに影響を与えることなくXMLプロセッサの実装を変更できます。

XML CompressorはXML Parser for Javaに統合されています。DOMインタフェースおよびSAXインタフェースでの要素レベルのXML圧縮および解凍が提供されます。この圧縮プログラムは、DOMツリーの構造情報と階層情報を失うことなく、XML文書を圧縮します。XML文書の解析後に、DOMまたはSAXでバイナリ・ストリームにシリアライズし、後で再構築できます。

この圧縮プログラムではXMLメッセージ・ペイロードのサイズを小さくすることができ、スループットが向上します。アプリケーション内部でのXML文書へのアクセスに使用すると、高速アクセスを維持しながらメモリー使用量が大幅に減少します。

図1-2に、XDK Parser for Java、XDK Parser for CおよびXDK Parser for C++の機能を示します。

図1-2 XML Parser for Java、XML Parser for CおよびXML Parser for C++

関連項目:

- 第4章「XML Parsing for Java」

- 第18章「XML Parser for Cの使用」

- 第25章「XML Parser for C++の使用」

XSLTプロセッサ

eXtensible Stylesheet Language Transformation(XSLT)は、プロセッサがXML文書を別のXML文書に変換するためのスタイルシート言語です。XSLTドキュメントは、変換を制御するテンプレート・ルールを含むスタイルシートです。

Oracle XSLT Processorは、W3C勧告のXSL Transformations 1.0を完全にサポートしています。また、このプロセッサはXSLTおよびXPath 2.0標準の現在の作業草案も実装しています。すべてのオペレーティング・システム上で、データベース内外のXML情報に対して、業界標準に準拠した変換を行うことができます。

Oracle XML Parserには、XSLTスタイルシートを使用してXMLデータを変換するためのXSLTプロセッサが統合されています。XSLTプロセッサを使用すると、XML文書をXMLからXMLやXHTMLなど、ほぼすべてのテキスト形式の文書に変換できます。

関連項目:

- 「XSLT Processor for Javaの使用: 概要」。

- 仕様およびその他の情報は、W3Cのサイト(http://www.w3.org/Style/XSL)にあります。

XML Schema Processor

XML Schema言語は、XML文書のコンテンツおよび構造をXMLで記述するためにW3Cで作成された言語で、DTDが改善されたものです。XMLスキーマには、XMLアプリケーションの妥当性を定義するルールが含まれます。DTDとは異なり、XMLスキーマはそれ自体がXMLで記述されています。XMLスキーマがDTDより優れている点の1つは、要素と属性のコンテンツのルールを指定できることです。XMLスキーマは、string、float、dateなどの組込みデータ型のセットを指定します。ユーザーは、組込みデータ型から独自のデータ型を導出できます。たとえば、スキーマで、日付を2000年以降の日付に制限したり、有効な値のリストを指定できます。

Oracle XDKには、XML Schema Processor for Java、XML Schema Processor for CおよびXML Schema Processor for C++が含まれています。

関連項目:

- 第7章「Schema Processor for Javaの使用」

- 第20章「XML Schema Processor for Cの使用」

- 第27章「XML Schema Processor for C++の使用」

XML Class Generator

XML Class Generatorは、解析済のXMLスキーマまたはDTDを入力として受け入れ、JavaまたはC++ソース・クラス・ファイルを出力として生成するソフトウェア・プログラムです。XDKには、JAXB Class GeneratorとC++ Class Generatorの両方が含まれています。JAXBは、XMLデータおよびJavaオブジェクト間でマップするJava APIおよびツールのセットです。JAXBは、XML文書をJava形式でJavaプログラムに提供するため、SAXパーサーを使用したりコールバック・メソッドを記述することなく、XMLデータを処理するプログラムを作成できます。各オブジェクトは、入力文書内のスキーマ・コンポーネントのインスタンスから導出されます。JAXBはDTDを直接サポートしていませんが、DTDをJAXBで使用可能なXMLスキーマに変換できます。XML Class Generator for C++は、DTDとXML Schemaの両方をサポートしています。

JAXBの使用方法の例としては、生成されたJavaクラスを使用してXML文書を段階的に構築するJavaプログラムを作成できます。人事部で使用するXMLスキーマを記述し、自分の個人データを変更するユーザーに応答するJavaプログラムを作成するとします。このプログラムは、JAXBを使用して確認用のXML文書を断片的に構築し、この文書をXSLTプロセッサでXHTMLに変換してブラウザに配信できます。

図1-3 Oracle JAXB Class Generator

関連項目:

- 第8章「JAXB Class Generatorの使用」

- 第29章「XML Class Generator for C++の使用」

XML Pipeline Processor

XML Pipeline Definition Languageは、XMLリソース間の処理関係を記述するためのXMLボキャブラリです。このパイプライン言語のインスタンス(プロセス間の関係を定義する文書)が、パイプライン文書です。たとえば、このプログラムで入力XML文書を検証して、文書が有効である場合に変換するように、パイプライン文書で指定できます。

Oracle XML Pipeline Processorは、XML Pipeline Definition Language 1.0標準に準拠しています。このプロセッサは入力XMLパイプライン文書を受け入れ、派生した依存性に応じてパイプライン・プロセスを実行できます。このパイプライン・プロセッサは、カスタムJavaコードのかわりに簡単なXML宣言構文を使用するので、XMLを処理するアプリケーションを構築するJava開発者にとって有効なツールです。

関連項目:
第9章「XML Pipeline Processor for Javaの使用」

XDK JavaBeans

JavaBeansは、ビルダー・ツールでビジュアルに操作できる再利用可能なソフトウェア・コンポーネントを開発するためのJava APIです。JavaBeanは、このAPIに準拠したJavaオブジェクトです。Oracle XDK JavaBeansはビジュアルなBeanと非ビジュアルなBeanのコレクションであり、XML対応の様々なJavaプログラムまたはアプレットで役立ちます。表1-2に、XDK JavaBeansの概要を示します。

表1-2 XDK JavaBeansの概要

JavaBean

説明

DOMBuilder

XML文書からDOMツリーを構築します。このBeanは非ビジュアルです。

XSLTransformer

XMLファイルを受け入れ、入力のXSLTスタイルシートによって指定された変換を適用し、結果の出力ファイルを作成します。このBeanは非ビジュアルです。

DBAccess

複数のXML文書およびテキスト・ドキュメントを含むCLOB表をメンテナンスします。

XMLDBAccess

DBAccess Beanを拡張し、Oracleデータベース表でXML文書が格納されるXMLType列をサポートします。

XMLDiff

2つのXML DOMツリーを比較します。

XMLCompress

XML圧縮機能をカプセル化します。

XSDValidator

oracle.xml.parser.schema.XSDValidatorクラスをカプセル化し、DOMツリーの検証機能を追加します。

関連項目:
第10章「XDK JavaBeansの使用」

Oracle XML SQL Utility(XSU)

XSUは、一連のJavaクラス・ライブラリです。XSUを使用して実行できるタスクは次のとおりです。

- 任意のSQL問合せの結果を自動的かつ動的に正規のXMLにレンダリングします。XSUは、XMLTypeを含む豊富な構造のユーザー定義オブジェクト型およびオブジェクト・ビューでの問合せをサポートします。XSUでリレーショナル・データをXMLに変換すると、結果のXML文書は次の構造になります。

- 列は、最上位の要素にマップします。

- スカラー値は、内容がテキストのみの要素にマップします。

- オブジェクト型は要素にマップされ、オブジェクト型の属性はサブ要素を構成します。

- コレクション型は、要素のリストにマップします。

- XML文書のデータを既存のデータベース・スキーマまたはビューにロードします。

注意:
XSUにはPL/SQLでの実装もあります。PL/SQLパッケージDBMS_XMLQueryおよびDBMS_XMLSaveは、JavaクラスOracleXMLQueryおよびOracleXMLSaveの機能を反映します。

図1-4に、XSUでSQL問合せがどのように処理されて結果がXML文書として戻されるかを示します。

図1-4 XSUによるSQL問合せの処理と、結果として戻るXML文書

XML文書の処理または表現

XSUは、次のいずれかの方法で、XML文書を生成できます。

- XML文書の文字列表現。XML文書をリクエスタに戻す場合、この表現を使用してください。インメモリーDOMツリー。プログラムでXMLを操作する場合、この表現を使用してください。たとえば、DOMメソッドでXMLを検索または変更するXSLTプロセッサを使用してXMLを変換する場合などです。一連のSAXイベント。XMLを取得する場合(特に大規模な文書や結果セットを取得する場合)、この機能を使用できます。

XML Class GeneratorでのXSUの使用

XSUを使用すると、問合せ対象である基礎となる表またはビューのリレーショナル・スキーマに基づいて、XMLスキーマを生成できます。生成されたXMLスキーマをJAXB Class GeneratorまたはC++ Class Generatorへの入力として使用します。その後、生成されたクラスを使用するコードを作成し、Webベースのフォームのインフラストラクチャを生成します。このインフラストラクチャに基づいて、フォームではユーザー・データが取得され、データベース・スキーマと互換性のあるXML文書が作成されます。プログラムでは、追加の処理を行わずに、対応する表またはオブジェクト・ビューにXMLを直接書き込むことができます。

関連項目:
第11章「XML SQL Utility(XSU)の使用」

TransX Utility

Oracle TransX Utilityは、多言語のXMLデータのデータベースへの移入を可能にする、データ転送ユーティリティの1つです。開発者と翻訳者の両方が直感的に使用できる単純なデータ形式、および以前の方法よりエラーの発生が軽減される検証機能が使用されます。TransX UtilityはXSUと次の点で異なります。TransX Utilityは、翻訳されたシード・データおよびメッセージをデータベース・スキーマにロードするXSUのアプリケーションです。1つのデータベースに複数言語のデータを移入する場合、TransX Utilityを使用すると、通常はXSUを使用して開発する必要がある機能を利用できます。

関連項目:
第12章「TransX Utilityの使用」

XSQLページ・パブリッシング・フレームワーク

XSQLページ・パブリッシング・フレームワーク(XSQLサーブレット)はサーバー・コンポーネントであり、特定の構造と文法を持つXMLファイルであるXSQLファイルを処理して、データ・オブジェクトに対する1つ以上のSQL問合せから動的XML文書を生成します。図1-5に、XSQLサーブレットの起動方法を示します。

図1-5 XSQLページ・パブリッシング・フレームワーク

XSQLサーブレットはOracle XML Parserを使用してXSQLファイルを処理し、XSLT処理文を内部プロセッサに渡す一方で、タグ間のパラメータおよびSQL文をXSUに渡します。この問合せの結果を、XML形式のテキスト、またはJDBC ResultSetオブジェクトとして受け取ります。必要に応じて、組込みのXSLTプロセッサを使用して、問合せの結果をさらに変換することもできます。

XSQLサーブレットの1つの例として、空港名のバインド変数を使用した航空会社のフライト・スケジュールの問合せを含むページがあります。ユーザーはWebフォームで空港名をパラメータとして渡すことができます。サーブレットはデータベースへの問合せ内のパラメータ値をバインドし、出力XMLをブラウザで表示できるようにHTMLに変換します。

関連項目:
第14章「XSQLページ・パブリッシング・フレームワークの使用」

SOAPサービス

Simple Object Access Protocol (SOAP)は、プラットフォームに依存しないメッセージング・プロトコルです。SOAPを使用してプログラムでサービス、オブジェクトおよびサーバーにアクセスできます。Oracle SOAPサービスはWebを介して公開および実行され、すべてのプログラムに対して標準のXMLメッセージ形式を提供します。SOAPサービスでは、XML標準を使用するメッセージング、RPCおよびWebサービス・プログラムをXDKで開発できます。

関連項目:
第22章「C XDKでのSOAPの使用」

XSLT Virtual Machine (XVM)

XVM for C/C++は、コンパイル済のXSLTコードの実行用に設計された、CPUのソフトウェア実装です。このコードを実行するには、XSLTスタイルシートを、XVMエンジンが理解するバイト・コードにコンパイルする必要があります。図1-6に、XVMによるXMLおよびXSLの処理方法を示します。

1-6 XSLT Virtual Machine

XDKには、XSLT 1.0標準に準拠したXSLTコンパイラが含まれています。コンパイルは実行時に行うことも、格納して実行時に取得することもできます。アプリケーションでは、スタイルシートを解析する必要がなく、XML操作ではなく索引検索に基づいてテンプレートが適用されるため、変換をより迅速に実行でき、スループットが上がります。

関連項目:
「XVMプロセッサ」

XDKコンポーネントによるXML文書の生成

XDKを使用すると、XML文書の構造をリレーショナル・スキーマにマップできます。XDKを使用してOracleデータベースとの双方向のパスを確立し、そのパスを通してプログラムで表からXML文書を作成し、XMLタグ付きのデータを表に挿入します。各XDKプログラミング言語は、リレーショナル・データからXML文書を生成するプログラムの開発をサポートしています。

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

- JavaによるXML文書の生成

- CによるXML文書の生成

- C++によるXML文書の生成

JavaによるXML文書の生成

図1-7に示すように、データベースに対するSQL問合せを3つの異なる方法で実行できます。表1-3に、別方法を示します。

表1-3 JavaでのXMLの生成

テクノロジ

図1-7のラベル

説明

XSQLサーブレット

A

XSUとXMLパーサーを含みます。

XSU

B

XMLパーサーを含みます。

JDBC

C

出力データをXMLパーサーに送信します。

図1-7 Java XDKコンポーネントを使用して構築したXMLプロセッサの例

図1-7では、ソフトウェア・プログラムでどのような方法によってデータベースからXMLを生成するかにかかわらず、プログラムでXML文書に対して実行可能なさらなる処理を示しています。表1-4に、この追加処理を実行するために使用できるコンポーネントの一部を示します。

表1-4 Java XDKによる追加の文書処理

テクノロジ

図1-7のラベル

説明

JAXB

D

入力XMLスキーマに対応したJavaクラス・ファイルを生成します。

JavaBeans

E

XML文書を別のXML文書と比較できます。

XSLT

F

XSLTスタイルシートを使用してXML文書をXHTMLに変換します。

CによるXML文書の生成

図1-8に、リレーショナル・データからXML文書を生成するために使用できるOracle XDK C言語コンポーネントを示します。表1-1に、XDK Cコンポーネントを示します。

図1-8 XDK CコンポーネントによるXML文書の生成

図1-8に示すとおり、XDKを使用して、XML文書を処理するCプログラムを次のように作成できます。

1. Oracle Call Interface(OCI)またはPro*C/C++プリコンパイラを介して、SQL問合せをデータベースに送信します。プログラムではXML DBのXMLビュー機能を利用する必要があります。

2. 結果のXMLデータをXMLパーサーで処理するか、CLOBからXML文書として処理します。

3. XSLTプロセッサで文書を変換してXML対応ブラウザに送信するか、ソフトウェア・プログラムに送信してさらなる処理を行います。

C++によるXML文書の生成

図1-9に、XML文書を生成するために使用できるOracle XDK C++コンポーネントを示します。表1-1に、XDK C++コンポーネントを示しています。

図1-9 XDK C++コンポーネントを使用したXML文書の生成

図1-9に示すとおり、XDKを使用して、XML文書を処理するC++プログラムを次のように作成できます。

1. Oracle C++ Call Interface(OCCI)Pro*C/C++コンパイラを介して、SQL問合せをデータベースに喪心します。

2. 結果のXMLデータをXMLパーサーで処理するか、CLOBからXML文書として処理します。

3. XSLTプロセッサで文書を変換してXML対応ブラウザに送信するか、ソフトウェア・プログラムに送信してさらなる処理を行います。

XDK用の開発ツールと開発フレームワーク

図1-10に、XDKコンポーネントを使用するソフトウェア・プログラムを開発するために使用できるツールとフレームワークの一部を示します。たとえば、Oracle JDeveloperを使用すると、データベースに問合せを実行し、XMLを生成して追加の処理を実行するJavaクライアントを作成できます。従業員がこのプログラムを使用してOracleデータベースに問合せを送信できます。プログラムでXML文書をXMLベースのビジネス・ソリューションに転送し、他のユーザーとのデータ交換、コンテンツやデータの管理などを実行できます。

図1-10 XDKのツールとフレームワーク

この項では、E-Business開発に使用できるツールとフレームワークの一部について説明します。

- Oracle JDeveloper

- User Interface XML(UIX)

- Oracle Reports

- Oracle XML Gateway

- Oracle Data Provider for .NET

Oracle JDeveloper

Oracle JDeveloperは、E-Businessアプリケーションの開発、デバッグおよびデプロイをエンドツーエンドでサポートするJ2EE開発環境です。JDeveloperでは、ソース・コードの制御、モデリングおよびコーディングからデバッグ、テスト、プロファイリングおよびデプロイまでの一連の開発ライフ・サイクルをサポートする統合ツールを提供します。JDeveloperを使用すると、次のようなJ2EEコンポーネントを作成する開発ツールが提供されるため、開発が簡単になります。

- アプレット

- JavaBeans

- Java Server Pages(JSP)

- サーブレット

- Enterprise JavaBeans(EJB)

JDeveloperは、開発環境を拡張およびカスタマイズし、外部製品と統合するためのパブリックなAPIも提供します。

JDeveloperに統合されたOracle XDKは、XMLを作管理する多くの方法を提供します。たとえば、XSQLサーブレットを使用して次のタスクを実行できます。

- データベース情報の問合せと操作

- XML文書の生成

- XSLTスタイルシートを使用したXMLの変換

- Web上へのXMLの配信

JDeveloperには、XMLスキーマやXSLTスタイルシートなどのXML Schemaに基づく文書に使用できる、統合されたXMLスキーマ駆動のコード・エディタが搭載されています。エディタでは、特定の言語に対してスキーマを指定するのみで、指定したマークアップ言語のドキュメントを効率的に作成できます。Code Insight機能を使用すると、XML文書内の要素や属性に対する有効な代替の要素や属性のリストを取得できます。

Oracle JDeveloperによって、Javaアプリケーション・コードと、XMLデータおよびXML文書の同時使用が簡単になります。Oracle JDeveloperでは、次のようなXML開発モジュールをドラッグ・アンド・ドロップで使用できます。

- XMLのカラー化された構文ハイライト表示

- XMLおよびXSL用の組込み構文確認

- XMLスキーマ文書の編集サポート

- XSQLページおよびサーブレットのサポート

- Oracle XML Parser for Java

- XSLTプロセッサ

- XDK for JavaBeansのコンポーネント

- XSQL Page Wizard

- XSQLアクション・ハンドラ

- スキーマ駆動XMLエディタ

関連項目:
JDeveloperの詳細は、http://www.oracle.com/technetwork/developer-tools/jdev/overview/index.htmlを参照してください。

User Interface XML(UIX)

UIX(User Interface XML)は、XML対応Webアプリケーションを開発するためのフレームワークです。UIXは、主に、プログラムのユーザー・プレゼンテーション・レイヤーを対象としたテクノロジですが、イベントおよびアプリケーション・フローを管理するための追加機能もあります。UIXは、統合開発環境(IDE)などの高度な対話を必要とするフル機能のプログラムではなく、ページ・ベースのナビゲーションが行われるオンライン人事管理プログラムなどを作成するために使用できます。

関連項目:

- JDeveloperデモンストレーション・コードのサンプルは、http://www.oracle.com/technetwork/developer-tools/jdev/viewlet-097827.htmlにあります。

- JDeveloperオンライン・ヘルプには、『UIX開発者ガイド』の全文が含まれています。

Oracle Reports

Oracle Reports DeveloperおよびOracle Reports Serverは、動的に生成されたWebレポートを作成および公開できる開発ツールです。ウィザードに従って主要なタスクを簡単に使用できます。レポート・テンプレートおよびライブ・データ・プレビューを使用して、レポートの構造をカスタマイズできます。標準のWebブラウザを使用して、企業内で次のような形式のレポートを公開できます。

- XML

- CSSを使用した、または使用しないHTML

- PDF

- テキスト

- RTF

- PostScript

- PCL

関連項目:
Oracle Reportsのドキュメントへのリンクは、http://www.oracle.com/technetwork/middleware/reports/overview/index.htmlにあります。

Oracle XML Gateway

Oracle XML Gatewayの一連のサービスによって、Oracle E-Business Suiteと統合し、ビジネス・イベントがトリガーするXMLメッセージを作成および使用できます。XML Gatewayは、Oracle Streams Advanced Queuingと統合し、メッセージをエンキューおよびデキューします。これらのメッセージは、任意のメッセージ転送エージェントを介して、ビジネス・パートナとの間で送受信されます。

関連項目:

- 『Oracle Streamsアドバンスト・キューイング・ユーザーズ・ガイド』

- 『Oracle XML DB開発者ガイド』

Oracle Data Provider for .NET

Oracle Data Provider for .NET (ODP.NET)は、Oracle Database用のデータ・プロバイダの実装です。ODP.NETはOracleにネイティブのAPIを使用して、すべての.NETアプリケーションからOracleのデータと機能に高速かつ確実にアクセスできるようにします。また、Microsoft .NET Frameworkクラス・ライブラリで使用できるクラスとインタフェースも使用および継承します。

ODP.NETとXDKを使用すると、リレーショナル表およびオブジェクト・リレーショナル表からデータを抽出し、XML文書として表示できます。データベース・サーバーへの挿入、更新および削除操作にXML文書を使用することもできます。ODP.NETは、XML DBを介してデータベース内にネイティブのXMLをサポートします。

ODP.NETは、次の機能を使用してXMLをサポートします。

- OracleにネイティブのタイプXMLTypeとして、データベース・サーバーにネイティブのXMLデータを格納します。

- Oracleデータベース・インスタンスからMicrosoft .NET環境へのXMLデータとして、リレーショナル・データおよびオブジェクト・リレーショナル・データにアクセスし、Microsoft .NETフレームワークを使用してXMLを処理します。

- XMLデータを使用して、変更をデータベース・サーバーに保存します。

.NETアプリケーション開発者の場合、次の機能が含まれます。

- OracleCommand、OracleConnectionおよびOracleDataReaderクラスへの拡張機能

- XML固有のクラス:

- OracleXmlType

- OracleXmlStream

- OracleXmlQueryProperties

- OracleXmlSaveProperties

関連項目:
『Oracle Data Provider for .NET開発者ガイド』

XDKのインストール

この項では、CD-ROMから、またはOracle Technology Network(OTN)よりダウンロードしたアーカイブからOracle Databaseをインストールしたと想定します。Oracle Database CDを使用すると、Oracle XDKがデフォルトでインストールされます。XDKのデモを入手するには、Oracle Database Examplesメディアからデモ・プログラムをインストールする必要があることに注意してください。このマニュアルでは、XDKのデモ・プログラムにアクセスできると想定しています。

Oracle DatabaseとデモをOracle Database Examplesメディアからインストールした後、Oracle Databaseホームを次のように設定する必要があります。

- Oracle_home_directory
| - bin: includes XDK executables
| - lib: includes XDK libraries
| - jlib: includes Globalization Support libraries for the XDK
| - nls: includes binary files used as part of globalization support
| - xdk: XDK scripts, message files, documentation, and demos
readme.html
| - admin: SQL scripts and XSL Servlet Configuration
file (XSQLConfig.xml)
| - demo: sample programs (installed from Oracle Database Examples media)
| - c
| - cpp
| - java
| - jsp
| - doc: release notes and readme
content.html
index.html
license.html
title.html
| - cpp
| - images
| - java
| - include: header files
| - mesg: error message files

XDKをインストールしたディレクトリをXDKホームといいます。$XDK_HOME環境変数(UNIX)または%XDK_HOME%(Windows)にOracleホームのXDKディレクトリを設定します。たとえば、UNIXではcshを使用して次のようにXDKホームを設定できます。

setenv XDK_HOME $ORACLE_HOME/xdk

関連項目:

- 第3章「Java XDKコンポーネントを使用する前に」

- 第16章「C XDKコンポーネントを使用する前に」

- 第23章「C++ XDKコンポーネントを使用する前に」

第I部

XDK for Java

第I部の各章では、Java開発におけるOracle XDKの使用方法を説明します。

章構成は次のとおりです。

- 第3章「Java XDKコンポーネントを使用する前に」

- 第2章「統合Java API for XML」

- 第4章「XML Parsing for Java」

- 第5章「バイナリXML for Javaの使用」

- 第6章「XSLT Processor for Javaの使用」

- 第7章「Schema Processor for Javaの使用」

- 第8章「JAXB Class Generatorの使用」

- 第9章「XML Pipeline Processor for Javaの使用」

- 第10章「XDK JavaBeansの使用」

- 第11章「XML SQL Utility(XSU)の使用」

- 第12章「TransX Utilityの使用」

- 第13章「データ・ローディング・フォーマット(DLF)仕様」

- 第14章「XSQLページ・パブリッシング・フレームワークの使用」

- 第15章「XSQLページ・パブリッシング・フレームワークの使用: 高度なトピック」

2 統合Java API for XML

この章では、統合Java API for XMLTypeの概要を紹介し、Oracle XML DB用とOracle XML Developer's Kit用に統合されたAPIについて説明します。

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

- 統合Java APIの概要

- コンポーネントの統合

- 統合Java APIモデルへの移行

統合Java APIの概要

統合Java APIは、Oracle XDKおよびOracle XML DBの両方で必要とされる機能を組み合せたプログラム・インタフェースです。Oracle XML DBは、Javaパッケージoracle.xdb.domを使用してJava DOM APIを実装しており、Oracle XML Developer's Kitはoracle.xml.parser.v2パッケージを使用して実装しています。統合Java APIを使用すると、Oracle XDKとOracle XML DBの両方で必要とされる中核的なDOM APIの統合セットを使用し、また、そのDOM APIに加えて構築されている、新しい機能拡張Javaクラスを活用することができます。

統合Java APIは、XMLデータがどのように格納されているか、つまり、データベース内にあるかデータベース外にあるかに関係なく使用できます。これは、統合Java APIが接続管理のセッション・プール・モデルを使用するためです。接続タイプにthick(OCI APIを使用するCベースの接続)またはthin(JDBC APIを使用するピュアJavaベースの接続)を指定しない場合、データベースの中に格納されていないローカル文書オブジェクトに接続するためにはJava Document Object Model(DOM)APIが使用されます。

関連項目:
oracle.xml.parser.v2パッケージの詳細は、『Oracle Database XML Java API Reference』を参照してください。

コンポーネントの統合

thick接続またはthin接続のいずれかのみによってサポートされている一部のコンポーネントは、統合Java APIモデルに統合されました。以前のthin接続によってサポートされていたが、統合されているコンポーネントには、次のものがあります。

- DOMパーサー

- JAXPトランスフォーマ

- XSU

- XSLT

統合Java APIモデルへの移行

統合Java APIは、古いoracle.xdb.dom Javaクラスにかわる新しいJavaクラスを提供します。oracle.xdb.domパッケージのすべてのクラスは非推奨になりました。古いクラスのいずれかを使用している場合、新しい統合Java APIに移行して、oracle.xml.parser.v2クラスをかわりに使用する必要があります。

XMLTypeクラスのJava DOM API

表2-1に、Oracle Database 11gリリース1で非推奨となったoracle.xdb.domパッケージ・クラスを示します。

表2-1 非推奨になったXDBパッケージ・クラスと、それと同等の統合Java API

oracle.xdb.dom.*クラス

oracle.xml.parser.v2(統合Java API)クラス

XDBAttribute

XMLAttr

XDBBinaryDocument

これは非推奨になり、その代替となるクラスはJava DOM API XMLTypeクラスにありません。

XDBCData

XMLCDATA

XDBCharData

CharData

XDBComment

XMLComment

XDBDocFragment

XMLDocumentFragment

XDBDocument

XMLDocument

XDBDocumentType

DTD

XDBDOMException

XMLDomException

XDBDomImplementation

XMLDomImplementation

XDBDOMNotFoundErrException

これは非推奨になり、その代替となるクラスはJava DOM API XMLTypeクラスにありません。

XDBElement

XMLElement

XDBEntity

XMLEntity

XDBEntityReference

XMLEntityReference

XDBNamedNodeMap

XMLAttrList

XDBNode

XMLNode

XDBNotation

XMLNotation

XDBNotImplementedException

これは非推奨になり、その代替となるクラスはJava DOM API XMLTypeクラスにありません。

XDBProcInst

XMLPI

XDBText

XMLText

Java DOM APIを使用してXMLデータを取得する場合、接続がthinの場合にXMLDocumentインスタンスを取得するか、getDOM()メソッドを使用してXDBDocumentインスタンスを、getDocument()メソッドを使用してXMLDocumentを取得するかのどちらかです。XMLDocumentとXDBDocumentは、どちらもW3C DOMインタフェースのインスタンスです。getDOM()メソッドとXDBDocumentクラスは、統合Java APIでは非推奨になりました。表2-2に、現在のリリースでサポートされている新しいメソッドとクラスを示します。

表2-2 非推奨になったXMLTypeメソッド

oracle.xdb.XMLTypeの古いAPI

oracle.xdb.XMLTypeの新しいAPI

getDOM()

getDocument()

public XMLType createXML(...)

public XMLType createXML(..., int kind)ここでkindはXMLDocument.THICKまたはXMLDocument.THIN

拡張API

W3C勧告に加え、統合Java API実装はW3C DOM APIを様々に拡張するいくつかの拡張APIを提供します。データベースへの接続のような基本的な機能や性能の強化を実行する場合は、Oracle固有の拡張APIを使用することができます。

XMLDocumentは、インスタンス化されたXML文書用にDOMを表すクラスです。Document引数を取るXMLTypeコンストラクタを使用して、XML文書からXMLType値を取得できます。

XMLType createXML(Connection conn, Document domdoc)

ノードの手動参照解除のためには、oracle.xml.parser.v2パッケージにあるfreeNode()拡張API(XMLNodeクラス)を使用します。freeNode()を使用する場合、文書フラグメントを明示的にDOMツリーから参照解除します。

文書作成Java API

XMLDocumentを作成する統合Java APIは、thin文書またはthick文書のいずれかを作成する必要があります。thick文書がデータベースとの通信を確立するには、Connectionオブジェクトが必要です。このため作成APIは、Connectionオブジェクトを受け入れるように拡張されます。

注意:
Connectionタイプを指定する必要があります。古い文書作成APIは、下位互換性を考慮してまだサポートされています。

XMLType.createXML APIの場合、Connectionがオブジェクトおよび他のAPIの型を決定し、明示的に指定されない場合、thin(ピュアJava)オブジェクトが、作成されます。

表2-3に、KINDおよびConnectionプロパティに基づくXMLDocument出力を示します。

表2-3 XMLDocument.KINDおよびXMLDocument.CONNECTIONに基づくXMLDocument出力

XMLDocument.KIND

XMLDocument.CONNECTION

XMLDocument

XMLDocument.THICK

thickまたはKPRB接続

thick DOM

XMLDocument.THICK

thinまたは接続なし

例外

XMLDocument.THIN

任意の接続タイプ

thin DOM

未指定

任意の接続タイプ

XMLType以外のAPI。thin DOM

XMLType.createXML API: 接続タイプにより異なります。つまり、OCIまたはKPRB接続ではthick DOM、thin接続ではthin DOM。

統合Java APIモデルでの文書作成用に、次のオブジェクトとメソッドが提供されています。

- DOMParserオブジェクトおよびparse()メソッド: DOMParserオブジェクトおよびparse()メソッドを使用してXML文書を解析します。オブジェクトの型(thickまたはthin)を指定する必要があります。thickオブジェクトでは、DOMParser.setAttribute() APIを使用してConnectionプロパティを指定する必要もあります。次に例を示します。

DOMParser parser = new oracle.xml.parser.v2.DOMParser();
parser.setAttribute(XMLDocument.KIND, XMLDocument.THICK);
parser.setAttribute(XMLDocument.CONNECTION, conn);

- DocumentBuilderオブジェクト: Java固有のAPIであるJAXPを使用してXML文書を解析するにはDocumentBuilderオブジェクトを使用します。DocumentBuilderFactoryクラスでDOMパーサー・ファクトリを作成する必要があります。DocumentBuilderFactoryクラスは使用されるDOMParserへの接続を渡し、DOMParserがこれらのAPIから文書を作成します。

- DocumentBuilderは入力SAXイベントからDOMを構築します。この場合、DocumentBuilderFactory上に設定されたプロパティからConnectionが取得されます。次に例を示します。

DocumentBuilderFactory.setAttribute(XMLDocument.CONNECTION, conn);
DocumentBuilderFactory.setAttribute(XMLDocument.KIND,XMLDocument.THICK);

DocumentBuilderFactoryクラスは、次のAPIから文書を作成するために使用されるDOMParserへの接続を渡します。

DocumentBuilder.newDocument()
DocumentBuilder parse(InputStream)
DocumentBuilder parse(InputStream, int)
DocumentBuilder.parse(InputSource)

- XSU: このメソッドはXMLDocumentをユーザーに戻します。必要なオブジェクトがthickかthinかを指定できます。

OracleXMLUtil util = new OracleXMLUtil(...);
util.setAttribute(XMLDocument.KIND, XMLDocument.THICK);
util.setAttribute(XMLDocument.CONNECTION, conn);
Document doc = util.getXMLDOMFromStruct(struct, enc);

OracleXMLQuery query = new OracleXMLQuery(...);
query.setAttribute(XMLDocument.KIND, XMLDocument.THICK);
query.setAttribute(XMLDocument.CONNECTION, conn);
Document doc = query.getXMLDOM (root, meta);

OracleXMLDocGenDOM dgd = new OracleXMLDocGenDOM(...);
dgd.setAttribute(XMLDocument.KIND, XMLDocument.THICK);
dgd.setAttribute(XMLDocument.CONNECTION, conn);
Document doc = dgd.getXMLDocumentDOM(struct, enc);

- XMLType: getDocument()メソッドを使用すると、必要なオブジェクトがthickかthinかを指定できます。既存のXMLTypeメソッドはすべて、まだ使用可能です。この例では、接続はOPAQUEから推定されます。

XMLType xt = XMLType.createXML(orset.getOPAQUE(1), XMLDocument.THICK);
Document doc = xt.getDocument();

ユーザーが型を指定できなくなる既知の事例の1つは、ResultSet.getObject() APIを使用して作成されるXMLTypeの場合です。XMLType列がある表をユーザーが持っていて、ユーザーがその列から選択を行う場合、ユーザーはResultSetに対してgetObject()をコールすることができます。これによりXMLTypeオブジェクトが戻されます。型は列をフェッチするJDBCコールで使用するConnectionによって決定されます。

3 Java XDKコンポーネントを使用する前に

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

- Java XDKコンポーネントのインストール

- Java XDKコンポーネントの依存性

- UNIXでのJava XDK環境変数の設定

- WindowsでのJava XDK環境変数の設定

- Java XDKコンポーネントのバージョンの確認

Java XDKコンポーネントのインストール

Java XDKコンポーネントは、Oracle Databaseに付属しています。この章では、Oracle DatabaseとともにXDKをインストールし、Oracle Database Examplesメディアのデモ・プログラムもインストールしたと想定します。インストールの手順およびXDKディレクトリ構造の説明は、「XDKのインストール」を参照してください。

例3-1に、XDKデモとXDKコンポーネントで使用されるライブラリのUNIXディレクトリ構造を示します。$ORACLE_HOME/xdk/demo/javaのサブディレクトリには、XDK for Javaコンポーネントのサンプル・プログラムとデータ・ファイルが入っています。第I部「XDK for Java」では、これらのプログラムを理解および使用する方法について説明します。

例3-1 Java XDKのライブラリ、ユーティリティおよびデモ

- Oracle_home_directory
| - bin/
orajaxb
orapipe
oraxml
oraxsl
transx
| - lib/
classgen.jar
jdev-rt.zip
oraclexsql.jar
transx.zip
xml.jar
xml2.jar
xmlcomp.jar
xmlcomp2.jar
xmldemo.jar
xmlmesg.jar
xmlparserv2.jar
xschema.jar
xsqlserializers.jar
xsu12.jar
| - jlib/
orai18n.jar
orai18n-collation.jar
orai18n-mapping.jar
orai18n-utility.jar
| - jdbc/
| - lib/
ojdbc5.jar
| - rdbms/
| - jlib/
xdb.jar

| - xdk/
| demo/
| - java/
| - classgen/
| - jaxb/
| - parser/
| - pipeline/
| - schema/
| - transviewer/
| - tranxs/
| - xsql/
| - xsu/

サブディレクトリには、Java XDKコンポーネントのサンプル・プログラムとデータ・ファイルが入っています。第I部「XDK for Java」では、これらのプログラムを使用して最も重要なJava言語の機能を理解する方法について説明します。

Java XDKコンポーネントの依存性

Java XDKコンポーネントは、JDKバージョン5および6でサポートされ、動作が保証されています。それより前のJavaはサポートが終了しました。図3-1に、JDK 5を使用する場合のJava XDKコンポーネントの依存性を示します。

図3-1 JDK 5のJava XDKコンポーネントの依存性

Java XDKコンポーネントには、表3-1にアルファベット順に示されているライブラリが必要です。一部のライブラリはXDKに固有ではなく、他のOracle Databaseコンポーネント間で共有されます。

表3-1 XDKコンポーネントのJavaライブラリ

ライブラリ

ディレクトリ

内容 . .

classgen.jar

$ORACLE_HOME/lib

Java Runtimeクラス用のXML Class Generator。

注意: このライブラリは、下位互換性のみを目的として保持されています。xml.jarではJAXB Class Generatorを使用する必要があります。

jdev-rt.zip

$ORACLE_HOME/lib

JDeveloper IDEでデモを操作する際に使用するJava GUIライブラリ。

ojdbc5.jar、ojdbc6.jar

$ORACLE_HOME/jdbc/lib

Java 5、6用のOracle JDBCドライバ。UTF-8、ISO8859-1またはJA16SJIS以外のマルチバイト・キャラクタ・セットを使用する場合、このJARはキャラクタ・セットをサポートするためのorai18n.jarに依存します。

oraclexsql.jar

$ORACLE_HOME/lib

XSQLページの作成に必要なXSQLサーブレット・クラスの大部分。

注意: このアーカイブはxml.jarに置き換えられており、下位互換性のみを目的として保持されています。

orai18n.jar

$ORACLE_HOME/jlib

JDK 1.2以上に対するグローバリゼーション・サポート。これは、他のすべてのグローバリゼーションjarのラッパーであり、キャラクタ・セット・コンバータを含みます。UTF-8、ISO8859-1またはJA16SJIS以外のマルチバイト・キャラクタ・セットを使用する場合は、XSU、TransX Utility、XSQLサーブレットのいずれかを使用したXMLファイルのロード中にJDBCが入力ファイルのキャラクタ・セットをデータベースキャラクタ・セットに変換できるように、このアーカイブをCLASSPATHに置きます。

orai18n-collation.jar

$ORACLE_HOME/jlib

グローバリゼーション照合機能: OraCollatorクラス、lx3*.glbファイルおよびlx4001[0-9].glbファイル。

orai18n-mapping.jar

$ORACLE_HOME/jlib

グローバリゼーション・ロケールとキャラクタ・セット名のマッピング: OraResourceBundleクラスとlx4000[0-9].glbファイル。このアーカイブは、ロケール名のマッピング表のみを必要とする製品で主に使用されます。

orai18n-utility.jar

$ORACLE_HOME/jlib

グローバリゼーション・ロケール・オブジェクト: OraLocaleInfoクラス、OraNumberFormatクラス、OraDateFormatクラスおよびlx[01]*.glbファイル。

transx.zip

$ORACLE_HOME/lib

TransX Utilityクラス。

注意: このアーカイブはxml.jarに置き換えられており、下位互換性のみを目的として保持されています。

xdb.jar

$ORACLE_HOME/rdbms/jlib

xml.jarおよびxmlcomp2.jarがXMLTypeにアクセスするために必要なクラス。XML DBリポジトリへのアクセスに必要なクラスと、DOMツリーの操作に使用するXMLType DOMクラスも含まれています。

xml.jar

$ORACLE_HOME/lib

次のライブラリ内のクラス。

- oraclexsql.jar

- xsqlserializers.jar

- xmlcomp.jar

- xmlcomp2.jar

- transx.jar

アーカイブには、JAXBおよびPipeline Processorのクラスも含まれています。

xmlcomp.jar

$ORACLE_HOME/lib

データベースに依存しないXML JavaBeans: DOMBuilder、XSLTransformer、DBAccess、XSDValidatorおよびXMLDiffer。

注意: このアーカイブは下位互換性のみを目的として含められています。このアーカイブ内のクラスはxml.jarに含まれています。以前のリリースにあったビジュアルなBeanは含まれていません。

xmlcomp2.jar

$ORACLE_HOME/lib

データベースに依存するXML JavaBeans: XMLDBAccessおよびXMLCompress。したがって、XML DBをサポートするクラスを含むxdb.jarに依存します。

注意: このJARは下位互換性のみを目的として含められています。このアーカイブ内のクラスはxml.jarに含まれています。以前のリリースにあったビジュアルなBeanは含まれていません。

xmldemo.jar

$ORACLE_HOME/lib

ビジュアルなJavaBeans: XMLTreeView、XMLTransformPanel、XMLSourceViewおよびDBViewer。

xmlmesg.jar

$ORACLE_HOME/lib

XMLパーサーを英語以外の言語で使用する場合に必要です。

xmlparserv2.jar

$ORACLE_HOME/lib

次のものに対するAPI。

- DOMパーサーとSAXパーサー

- XML Schema Processor

- XSLTプロセッサ

- XMLの圧縮

- JAXP

- XMLSAXSerializerや非同期DOMビルダーなどのユーティリティ機能

このライブラリにはxschema.jarが含まれています。

xschema.jar

$ORACLE_HOME/lib

xmlparserv2.jarに含まれるXML Schemaクラスを含みます。

注意: このJARファイルは、下位互換性のみを目的として保持されています。

xsqlserializers.jar

$ORACLE_HOME/lib

PDFなどのシリアライズされた出力に必要な、XSQLサーブレットのシリアライザ・クラス。

注意: このアーカイブはxml.jarに置き換えられており、下位互換性のみを目的として保持されています。

xsu12.jar

$ORACLE_HOME/lib

XSUを実装するクラス。これらのクラスは、XMLTypeアクセスをxdb.jarに依存します。

関連項目:

- Globalization Supportライブラリの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

- JDBCライブラリの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

- XML DBの詳細は、『Oracle XML DB開発者ガイド』を参照してください。

Java XDK環境の設定

XDKのOracle Databaseインストールでは、環境変数$CLASSPATH(UNIX)または%CLASSPATH%(Windows)を手動で設定する必要があります。または、コマンドラインでJavaプログラムをコンパイルおよび実行する際に-classpathオプションを設定します。

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

- UNIXでのJava XDK環境変数の設定

- WindowsでのJava XDK環境変数の設定

UNIXでのJava XDK環境変数の設定

表3-2に、Java XDKコンポーネントを使用するときに必要なUNIX環境変数を示します。

表3-2Java XDKコンポーネントのUNIXでの環境設定

変数

説明

$CLASSPATH

次の内容を含めます(現在のディレクトリを表すシングル・ピリオド"."は必須ではありませんが、役に立つ場合があります)。

.:${CLASSPATHJ}:${ORACLE_HOME}/lib/xmlparserv2.jar:
${ORACLE_HOME}/lib/xsu12.jar:${ORACLE_HOME}/lib/xml.jar

$CLASSPATHJ

JDK 5の場合は、次のように設定します。

CLASSPATHJ=${ORACLE_HOME}/jdbc/lib/ojdbc5.jar:${ORACLE_HOME}/jlib/orai18n.jar

特定のキャラクタ・セットをサポートするには、orai18n.jarが必要です。

$JAVA_HOME

Java JDK, Standard Editionのインストール・ディレクトリ。Java SDKにリンクするパスを変更します。

$LD_LIBRARY_PATH

OCI/JDBC接続用:

${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}

$PATH

${JAVA_HOME}/bin

UNIXでのJava XDK環境のテスト

表3-3に、Java XDKに含まれているコマンドライン・ユーティリティ(UNIX)を示します。これらのユーティリティを使用する前に、環境を設定する必要があります。

表3-3 Java XDKユーティリティ

実行可能ファイル/クラス

ディレクトリ/JAR

説明

xsql

$ORACLE_HOME/bin

XSQLコマンドライン・ユーティリティ。このスクリプトは、oracle.xml.xsql.XSQLCommandLineクラスを実行します。このシェル・スクリプトは、使用する前に環境に合せて編集します。

関連項目: 「XSQLページ・コマンドライン・ユーティリティの使用」

OracleXML

$ORACLE_HOME/lib/xsu12.jar

XSUコマンドライン・ユーティリティ

関連項目:「XSUコマンドライン・ユーティリティの使用」

orajaxb

$ORACLE_HOME/bin

JAXBコマンドライン・ユーティリティ

関連項目: 「JAXB Class Generatorコマンドライン・ユーティリティの使用」

orapipe

$ORACLE_HOME/bin

Pipelineコマンドライン・ユーティリティ

関連項目: 「XML Pipeline Processorコマンドライン・ユーティリティの使用」

oraxml

$ORACLE_HOME/bin

XML Parserコマンドライン・ユーティリティ

関連項目: 「XML Parserコマンドライン・ユーティリティの使用」

oraxsl

$ORACLE_HOME/bin

XSLT Processorコマンドライン・ユーティリティ

関連項目: 「XSLT Processorコマンドライン・ユーティリティの使用」

transx

$ORACLE_HOME/bin

TransXコマンドライン・ユーティリティ

関連項目: 「TransXコマンドライン・ユーティリティの使用」

環境が正しく設定されている場合は、例3-2に示すUNIXシェル・スクリプトによって、ユーティリティのバージョンと使用方法に関する情報が生成されます。

例3-2 UNIXでのJava XDK環境のテスト

#!/usr/bin/tcsh
echo;echo "BEGIN TESTING";echo
echo;echo "now testing the XSQL utility...";echo
xsql
echo; echo "now testing the XSU utility...";echo
java OracleXML
echo;echo "now testing the JAXB utility...";echo
orajaxb -version
echo;echo "now testing the Pipeline utility...";echo
orapipe -version
echo;echo "now testing the XSLT Processor utility...";echo
oraxsl
echo;echo "now testing the TransX utility...";echo
transx
echo;echo "END TESTING"

WindowsでのJava XDK環境変数の設定

表3-4に、Java XDKコンポーネントを使用するときに必要なWindows環境変数を示します。

表3-4 Java XDKコンポーネントのWindowsでの環境設定

変数

注意

%CLASSPATH%

次の内容を含めます(現在のディレクトリを表すシングル・ピリオド"."は必須ではありませんが、役に立つ場合があります)。

.;%CLASSPATHJ%;%ORACLE_HOME%\lib\xmlparserv2.jar;
%ORACLE_HOME%\lib\xsu12.jar;%ORACLE_HOME%\lib\xml.jar;
%ORACLE_HOME%\lib\xmlmesg.jar;%ORACLE_HOME%\lib\oraclexsql.jar

%CLASSPATHJ%

JDK 5の場合は、次のように設定します。

CLASSPATHJ=%ORACLE_HOME%\jdbc\lib\ojdbc5.jar:%ORACLE_HOME%\lib\orai18n.jar

特定のキャラクタ・セットをサポートするには、orai18n.jarが必要です。

%JAVA_HOME%

Java SDK, Standard Editionのインストール・ディレクトリ。Java SDKにリンクするパスを変更します。

%PATH%

%JAVA_HOME%\bin

WindowsでのJava XDK環境のテスト

表3-5に、Java XDKに含まれているコマンドライン・ユーティリティ(Windows)を示します。これらのユーティリティを使用する前に、環境を設定する必要があります。

表3-5 Java XDKユーティリティ

バッチ・ファイル/クラス

ディレクトリ/JAR

説明

xsql.bat

%ORACLE_HOME%\bin

XSQLコマンドライン・ユーティリティ。このバッチ・ファイルは、oracle.xml.xsql.XSQLCommandLineクラスを実行します。このバッチ・ファイルは、使用する前に環境に合せて編集します。

関連項目: 「XSQLページ・コマンドライン・ユーティリティの使用」

OracleXML

%ORACLE_HOME%\lib\xsu12.jar

XSUコマンドライン・ユーティリティ

関連項目:「XSUコマンドライン・ユーティリティの使用」

orajaxb.bat

%ORACLE_HOME%\bin

JAXBコマンドライン・ユーティリティ

関連項目: 「JAXB Class Generatorコマンドライン・ユーティリティの使用」

orapipe.bat

%ORACLE_HOME%\bin

Pipelineコマンドライン・ユーティリティ

関連項目: 「XML Pipeline Processorコマンドライン・ユーティリティの使用」

oraxml.bat

%ORACLE_HOME%\bin

XML Parserコマンドライン・ユーティリティ

関連項目: 「XML Parserコマンドライン・ユーティリティの使用」

oraxsl.bat

%ORACLE_HOME%\bin

XSLT Processorコマンドライン・ユーティリティ

関連項目: 「XSLT Processorコマンドライン・ユーティリティの使用」

transx.bat

%ORACLE_HOME%\bin

TransXコマンドライン・ユーティリティ

関連項目: 「TransXコマンドライン・ユーティリティの使用」

環境が正しく設定されている場合は、例3-3のコマンドをシステム・プロンプトで実行して、ユーティリティのバージョンと使用方法に関する情報を生成できます。

例3-3 WindowsでのJava XDK環境のテスト

xsql.bat
java OracleXML
orajaxb.bat -version
orapipe.bat -version
oraxsl.bat
transx.bat

Java XDKコンポーネントのバージョンの確認

使用しているXDKのバージョンを取得するには、javacを使用して、例3-4に示すJavaコードをコンパイルします。

例3-4 XDKVersion.java

//
// XDKVersion.java
//
import java.net.URL;
import oracle.xml.parser.v2.XMLParser;
public class XDKVersion
{
static public void main(String[] argv)
{
System.out.println("You are using version: ");
System.out.println(XMLParser.getReleaseVersion());
}
}

javacを使用してソース・ファイルをコンパイルした後、オペレーティング・システムのコマンドラインで次のようにプログラムを実行します。

java XDKVersion
You are using version:
Oracle XML Developers Kit 11.1.0.6.0 - Production

4 XML Parsing for Java

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

- XML Parsing for Javaの概要

- XML Parsing for Javaの使用: 概要

- DOMを使用したXMLの解析

- SAXを使用したXMLの解析

- JAXPを使用したXMLの解析

- XMLの圧縮

- XML解析のヒントと方法

XML Parsing for Javaの概要

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

- 前提条件

- 標準と仕様

- JavaでのXML解析

- XML解析でのDOM

- 拡張性のあるDOM

- XML ParserでのSAX

- XML ParserでのJAXP

- XML Parserでの名前空間のサポート

- XML Parserでの検証

- XML Parserでの圧縮

前提条件

Oracle XML Parsingは、XML文書を読み取り、DOMまたはSAX APIを使用して、そのコンテンツと構造へのプログラム・アクセスを可能にします。この解析は検証モードまたは非検証モードで使用できます。

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

- Document Object Model (DOM): DOMは、XML文書の構造を示すインメモリー・ツリー表現です。

- Simple API for XML (SAX): SAXは、イベントベースのXML解析の標準です。

- Java API for XML Processing(JAXP): JAXPは、JavaアプリケーションでXMLを処理するための標準インタフェースです。DOM標準とSAX標準をサポートします。

- Document Type Definition (DTD): XML DTDは、XML文書の有効な構造を定義します。

- XMLスキーマ: DTDと同様にXMLスキーマはXML文書の有効な構造を定義します。

- XML名前空間: 名前空間は、要素名や属性名を区別するためのメカニズムです。

- バイナリXML: 拡張性のあるDOMも拡張性のないDOMも、この形式でXML文書を保存できます。

前述のテクノロジの概要説明が必要な場合は、「はじめに」の「関連ドキュメント」にあるXMLの資料を参照してください。

標準と仕様

DOMレベル1、レベル2およびレベル3の仕様はW3C勧告です。次のURLに、3つのレベルすべての仕様へのリンクがあります。

http://www.w3.org/DOM/DOMTR

SAXにはバージョン1.0と2.0があり、バージョン1.0は非推奨です。これはW3C仕様ではありません。次のURLに、SAXのドキュメントがあります。

http://www.saxproject.org/

XML名前空間はW3C勧告です。仕様は次のURLにあります。

http://www.w3.org/TR/REC-xml-names

JCR 1.0(JSR 170とも呼ばれます)は、アプリケーションがコンテンツ・リポジトリと対話するための標準Java APIを定義しています。

関連項目:
『Oracle XML DB開発者ガイド』

JAXPバージョン1.2には、XSLTフレームワークに加えて、DOMレベル2およびSAXバージョン2.0をサポートするための解析APIに対する更新と、プラガブルな実装を特定するための改良されたスキームが含まれています。JAXPでは、XMLスキーマとXSLTコンパイラがサポートされています。JAXP仕様には、次のURLからアクセスできます。

http://www.oracle.com/technetwork/java/index.html

関連項目:
XDKがサポートする標準の説明は、第31章「XDK標準」を参照してください。

巨大ノードの処理

XMLノードへのDOMストリーム・アクセスは、PL/SQLおよびJavaのAPIによって実行されます。XML文書内のノードは64Kバイトを大幅に超えます。このため、JPEG、Word、PDF、RTFおよびHTML文書を容易に格納できます。

関連項目:
Javaの巨大ノードに関する機能の詳細は、『Oracle XML DB Developer's Guide』を参照してください。

JavaでのXML解析

XMLParserは、XML Parser for Javaの抽象ベース・クラスです。インスタンス化されたパーサーは、parse()メソッドを起動してXML文書を読み取ります。

XMLDOMImplementationファクトリ・メソッドは、別のメソッドを提供してバイナリXMLを解析し、拡張性のあるDOMを作成します。

図4-1に、XMLParserを使用した解析の基本プロセスを示します。この図はXMLDOMImplementation()には適用されません。

図4-1 XML Parserのプロセス

Javaアプリケーションでは、次のAPIを使用して、解析済XML文書にアクセスできます。

- DOM APIは、XML文書を解析し、インメモリーに文書のツリー表現を構築します。DOMParserオブジェクトを使用してDOM解析をするか、XMLDOMImplementationインタフェース・ファクトリ・メソッドを使用してプラガブルな拡張性のあるDOMを作成するかのいずれかをします。

- SAX APIは、XML文書をイベントのストリームとして処理します。したがって、プログラムから文書内のランダムな位置へのアクセスはできません。SAXを使用した解析にはSAXParserオブジェクトを使用します。

- JAXPは、DOM、SAXおよびXSLをサポートするJava固有のAPIです。JAXPを使用した解析にはDocumentBuilderまたはSAXParserオブジェクトを使用します。

例4-1に、DOM、SAX、JAXPの違いを明示するサンプルXML文書を示します。

例4-1 サンプルXML文書

<?xml version="1.0"?>
<EMPLIST>
<EMP>
<ENAME>MARY</ENAME>
</EMP>
<EMP>
<ENAME>SCOTT</ENAME>
</EMP>
</EMPLIST>

XML解析でのDOM

DOMは、インメモリーにXML文書のツリー表現を構築します。たとえば、DOM APIでは例4-1に示した文書を受け取り、図4-2に示すインメモリー・ツリーを作成します。DOMは、ツリーをナビゲートおよび処理するためのクラスおよびメソッドを提供します。

一般的に、DOM APIには次の利点があります。

- オブジェクトのツリー構造が提供されるため、DOM APIはSAXよりも簡単に使用できます。

- 要素の並替え、要素や属性の追加と削除、要素名の変更など、XMLツリーの構造的な操作を実行できます。

- 対話型アプリケーションでインメモリーにオブジェクト・モデルを格納できるため、ユーザーがオブジェクト・モデルにアクセスして操作できます。

- 標準としてのDOMはXPathをサポートしません。ただし、ほとんどのXPath実装ではDOMが使用されています。Oracle XDKには、XPathをサポートするためのDOM API拡張が含まれています。

- プラガブルな拡張性のあるDOMは、スケーラビリティと能率性を大幅に改善するように作成されます。

DOM作成

Java XDKでは、DOMを作成するのに3つの方法があります。

- DOMParserを使用して文書を解析します。これは従来どおりのXDKの方法です。

- XMLDOMImplementationファクトリ・メソッドを使用して拡張性のあるDOMを作成します。

- XMLDocumentコンストラクタを使用します。これはXDKの一般的なソリューションではありません。

拡張性のあるDOM

Oracle 11gリリース1(11.1)では、XDKはプラガブルな拡張性のあるDOMをサポートしています。これにより、メモリーの非効率、限定的なスケーラビリティ、DOM構成の制御不足という問題が緩和されます。

拡張性のあるDOMに関しては、構成および作成は主にXMLDOMImplementationクラスを使用してサポートされます。

これらは拡張性のあるDOMの重要な側面です。

- プラグイン・データにより、外部XML表現は内部表現の複製XMLを使用せずに、直接、拡張性のあるDOMによって使用が可能になります。
拡張性のあるDOMは、ReaderおよびInfosetWriter抽象インタフェースを介してプラグインXMLデータの上位で作成されます。XMLデータは、バイナリXML、XMLTypeおよびサード・パーティ製のDOMなどとは形式が異なる可能性もあります。

- 一時ノード。DOMノードは容易に作成でき、使用中でない場合は解放できます。

- バイナリXML
拡張性のあるDOMは、入力および出力形式ともにバイナリXMLを使用できます。拡張性のあるDOMは、次の2つの方法でデータと対話します。

- 抽象InfosetReaderおよびInfosetWriterインタフェースを介して対話。ユーザーは、(1)InfosetReaderおよびInfosetWriterのBinXML実装を使用して、BinXMLデータの読取りおよび書込みを実行でき、(2)ユーザーが提供する他の実装を使用して、XML Information Setの他の形式に読取りおよび書込みを実行できます。

- BinXMLStreamに対するInfosetReaderおよびInfosetWriterアダプタの実装を介して対話。

関連項目:
第5章「バイナリXML for Javaの使用」

拡張性のあるDOMのサポートは次のもので構成されています。

- プラガブルなDOMサポート

- 遅延マテリアライズ

- 構成可能なDOM設定

プラガブルなDOMサポート

プラガブルなDOMは、データ・レイヤーからDOM APIを分割可能にするXDKメカニズムです。DOM APIは、InfosetReaderおよびInfosetWriterインタフェースによってデータから分離されます。

プラガブルなDOMを使用すると、1つのプロセッサから別のプロセッサへのXMLデータの移動が容易になります。

DOM APIには、データの上位に統合された標準APIが含まれており、ノード・アクセス、ナビゲーション、更新プロセスおよび検索機能がサポートされています。

関連項目:
「プラガブルなDOMの使用」

遅延マテリアライズ

遅延マテリアライズ・メカニズムを使用すると、XDKはアクセスするノードのみを作成し、使用しないノードをメモリーから解放します。スケーラビリティが向上するため、非常に大きなXML文書も処理可能です。

関連項目:
「遅延マテリアライズの使用」

構成可能なDOM設定

DOM構成は他のアプリケーションに適合するように構成されています。DOMの構成には、読取り専用、ストリーム、一時更新およびシャドウ・コピーなど様々なアクセス・パターンを使用して、最大限のメモリーを使用および実行可能にできます。

関連項目:
「構成可能なDOM設定の使用」

XML ParserでのSAX

DOMとは異なりSAXはイベントベースであるため、入力文書のインメモリー・ツリー表現を構築しません。SAXは、要素単位で入力文書を処理し、イベントと重要なデータをアプリケーションのコールバック・メソッドに報告できます。例4-1に示すXML文書は、図4-2に示す一連の線形イベントとして解析されます。

一般的に、SAX APIには次の利点があります。

- XMLツリーの操作が必要でない検索操作やその他のプログラムに有用です。

- メモリー・リソースを大量に消費しません。

- データベースからXML文書を取得する場合は、DOMよりも高速です。

図4-2 DOM(ツリーベース)APIとSAX(イベントベース)APIの比較

XML ParserでのJAXP

JAXP APIを使用すると、SAXまたはDOMパーサーの実装をプラグインできます。Oracle XDKで提供されているSAX APIとDOM APIは、JAXPがサポートするベンダー固有実装の例です。

一般的にJAXPの利点は、相互運用可能なアプリケーションを作成できることです。アプリケーションでは、JAXPを介して使用可能な機能を使用する場合、非常に簡単に実装を切り替えることができます。

JAXPの主な短所は、ベンダー固有のAPIよりも実行速度が遅いことです。また、JAXP APIでは使用できず、Oracle固有のAPIを介して使用できる機能もあります。Oracle固有の機能は、その一部のみが、JAXPに用意されている拡張メカニズムを介して使用できます。ただし、アプリケーションでこれらの拡張を使用する場合は、実装を柔軟に切り替えることはできません。

XML Parserでの名前空間のサポート

XML Parser for Javaは、非修飾の要素タイプおよび属性名と、名前空間内の要素タイプおよび属性名を解析できます。名前空間は、汎用の名前を提供することにより、XML文書内にある要素タイプ間または属性間の名前の競合を解決または回避するメカニズムです。例4-2に示すXML文書について考えてみます。

例4-2 名前空間を使用しないサンプルXML文書

<?xml version='1.0'?>
<addresslist>
<company>
<address>500 Oracle Parkway,
Redwood Shores, CA 94065
</address>
</company>
<!-- ... -->
<employee>
<lastname>King</lastname>
<address>3290 W Big Beaver
Troy, MI 48084
</address>
</employee>
<!-- ... -->
</addresslist>

名前空間を使用しない場合、例4-2のXML文書を処理するアプリケーションでは、<address>タグが会社の住所と従業員の住所のどちらを参照しているかを判断できません。例4-3に示すように、名前空間を使用して<address>タグを区別できます。例では、次のXML名前空間を宣言します。

http://www.oracle.com/employee
http://www.oracle.com/company

例4-3では、com接頭辞を最初の名前空間に関連付け、emp接頭辞を2番目の名前空間に関連付けています。したがって、アプリケーションは<com:address>と<emp:address>を区別できます。

例4-3 名前空間を使用したサンプルXML文書

<?xml version='1.0'?>
<addresslist>
<!-- ... -->
<com:company
xmlns:com="http://www.oracle.com/company">
<com:address>500 Oracle Parkway,
Redwood Shores, CA 94065
</com:address>
</com:company>
<!-- ... -->
<emp:employee
xmlns:emp="http://www.oracle.com/employee">
<emp:lastname>King</emp:lastname>
<emp:address>3290 W Big Beaver
Troy, MI 48084
</emp:address>
</emp:employee>

名前空間を使用する文書を解析する際に、次の用語を覚えておくと役に立ちます。

- 名前空間の接頭辞は、xmlnsで宣言された名前空間接頭辞です。例4-3では、empおよびcomが名前空間の接頭辞です。

- ローカル名は、名前空間の接頭辞が付いていない要素または属性の名前です。例4-3では、employeeおよびcompanyがローカル名です。

- 修飾名は、ローカル名に接頭辞を加えたものです。例4-3では、emp:employeeおよびcom:companyが修飾名です。

- 名前空間URIは、xmlnsに割り当てられているURIです。例4-3では、http://www.oracle.com/employeeおよびhttp://www.oracle.com/companyが名前空間URIです。

- 拡張名は、名前空間の接頭辞を名前空間URIで置換することで取得されます。例4-3では、http://www.oracle.com/employee:employeeおよびhttp://www.oracle.com/company:companyが拡張要素名です。

XML Parserでの検証

アプリケーションは、parse()メソッドを起動してXML文書を解析します。通常、アプリケーションはparse()メソッドに関連して初期化メソッドおよび終了メソッドを起動します。oracle.xml.parser.v2.XMLParserに定義されているsetValidationMode()メソッドを使用して、パーサーのモードを検証または非検証に設定できます。

検証モードのXMLパーサー(検証XMLパーサー)は、DTDまたはXMLスキーマで指定されたルールに従ってXML文書を解析し、文書が指定したDTDまたはXMLスキーマに準拠しているかどうかを判断します。XML文書が準拠しない場合は文書が有効であり、文書の構造はDTDまたはスキーマのルールに準拠しています。非検証モードのパーサー(非検証パーサー)では、整形式であるかどうかのみが確認されます。

表4-1に、Oracle XDK Parserの検証モードを設定するためにsetValidationMode()で使用できるフラグを示します。

表4-1 XML Parser for Javaの検証モード

名前

値

XML Parserによる処理 . .

非検証モード

NONVALIDATING

XMLが整形式であることを確認し、データを解析します。

DTD検証モード

DTD_VALIDATION

XMLが整形式であることを確認し、XMLデータがDTDに対して妥当であるかどうかを検証します。<!DOCTYPE>宣言で定義されたDTDは、入力XML文書の位置に相対的である必要があります。

スキーマ検証モード

SCHEMA_VALIDATION

XML文書を、その文書に対して指定されたXMLスキーマに従って検証します。

LAX検証モード

SCHEMA_LAX_VALIDATION

スキーマ定義が検出されなくなるまで、インスタンス・ドキュメントの一部またはすべての検証を試行します。定義が検出されない場合も、エラーは発生しません。schemaディレクトリのサンプル・プログラムXSDLax.javaを参照してください。

厳密な検証モード

SCHEMA_STRICT_VALIDATION

インスタンス・ドキュメント全体の検証を試行します。スキーマ定義が検出されない場合またはインスタンスが定義に準拠しない場合は、エラーが発生します。

部分検証モード

PARTIAL_VALIDATION

DTD(存在する場合)に従って、入力XML文書のすべてまたは一部を検証します。DTDが存在しない場合、パーサーは非検証モードに設定されます。

自動検証モード

AUTO_VALIDATION

DTDまたはXMLスキーマ(存在する場合)に従って、入力XML文書のすべてまたは一部を検証します。DTDとXMLスキーマのいずれも存在しない場合、パーサーは非検証モードに設定されます。

setValidationMode()での検証モードの設定に加えて、oracle.xml.parser.schema.XSDBuilderクラスを使用してXMLスキーマを構築し、XMLParser.setXMLSchema()メソッドを起動することにより、このXMLスキーマを使用するようにパーサーを構成できます。この場合、XMLパーサーは検証モードを自動的にSCHEMA_STRICT_VALIDATIONに設定し、schemaLocationおよびnoNamespaceSchemaLocation属性を無視します。検証モードをSCHEMA_LAX_VALIDATIONに変更することもできます。XMLParser.setDoctype()メソッドは、DTDのパラレル・メソッドですが、setXMLSchema()とは異なり、検証モードを変更しません。

関連項目:

- 検証の詳細は、第7章「Schema Processor for Javaの使用」を参照してください。

- XMLParserクラスおよびXSDBuilderクラスの詳細は、Oracle Database XML Java APIリファレンスを参照してください

XML Parserでの圧縮

XML Parserに実装されているXML Compressorを使用して、XML文書を圧縮および解凍できます。圧縮アルゴリズムは、XMLタグのトークン化に基づいています。これは、すべてのXML文書にはタグの繰返しがあるため、それらのタグをトークン化すると、データが大幅に圧縮されることを前提としています。圧縮の程度は、文書のタイプに依存します。タグの数が多く、テキスト・コンテンツが少ないほど、圧縮率が向上します。

Oracle XML Parserは、インメモリーのDOMツリー、またはXML文書から生成されたSAXイベントから、圧縮したバイナリ出力を生成します。表4-2に、2種類の圧縮を示します。

表4-2 DOMとSAXでのXML圧縮

タイプ

説明

圧縮API

DOMベース

目的は、DOMツリーの構造情報および階層情報を失うことなく、XML文書のサイズを小さくすることです。パーサーでは、解析済XML文書に対応するインメモリーDOMツリーがシリアライズされ、圧縮したXML出力ストリームが生成されます。シリアライズされたストリームは、再度読み取られると、DOMツリーを再生成します。

writeExternal()メソッドを使用して、圧縮したXMLを生成し、readExternal()メソッドを使用して、そのXMLを再構築します。これらのメソッドはoracle.xml.parser.v2.XMLDocumentクラス内にあります。

SAXベース

SAXパーサーでは、XMLファイルを解析する際に圧縮したストリームが生成されます。SAXパーサーによって生成されたSAXイベントは、SAX圧縮ユーティリティによって処理されます。SAX圧縮ユーティリティは、圧縮したバイナリ・ストリームを生成します。

圧縮したXMLを生成するには、出力ストリームをコンストラクタに渡すことにより、oracle.xml.comp.CXMLHandlerBaseをインスタンス化します。オブジェクトをSAXParser.setContentHandler()に渡してから、parse()メソッドを実行します。XMLを解凍するにはoracle.xml.comp.CXMLParserクラスを使用します。

注意: CXMLHandlerBaseは、SAX 1.0と2.0の両方を実装していますが、1.0は非推奨です。2.0 APIを使用することをお薦めします。

DOMおよびSAXから生成された圧縮ストリームには互換性があるため、SAXから生成された圧縮ストリームを使用してDOMツリーを生成したり、DOMから生成された圧縮ストリームを使用してSAXイベントを生成したりできます。通常、XML文書と同様に、圧縮したXMLデータ出力はデータベースにBLOBとして格納できます。

プログラムで大きなXML文書を解析し、インメモリーにDOMツリーを作成すると、パフォーマンスに影響する場合があります。DOMツリーをシリアライズすることにより、XML文書をバイナリ・ストリームに圧縮できます。圧縮したストリーム内のXMLデータを検証せずに、DOMツリーを再生成できます。圧縮したストリームはシリアライズされたストリームとして処理できますが、ストリーム内のデータは、Javaのデフォルトのシリアライズによって実装される圧縮よりも厳密に制御および管理されます。

注意:
Oracle Textは、圧縮されたXML文書を検索できません。解凍によりパフォーマンスが低下します。クライアントとサーバー間でファイルを転送している場合は、HTTP圧縮の方が簡単です。

XML Parsing for Javaの使用: 概要

XML開発の基本コンポーネントはXML Parsingです。XML Parsing for JavaはスタンドアロンのXMLコンポーネントであり、プログラムで処理できるように、XML文書(あるいはスタンドアロンのDTDまたはXMLスキーマ)を解析します。この項の内容は次のとおりです。

- XML Parser for Javaの使用: 基本プロセス

- XML Parserのデモ・プログラムの実行

- XML Parserコマンドライン・ユーティリティの使用

注意:
パーサーは、サポートされている任意のJavaVMとともに使用できます。Oracle9i以上では、パーサーをデータベースにロードし、内部Oracle9i JVMを使用できます。その他のデータベース・バージョンでは、外部JVM内でパーサーを実行し、JDBCを介してデータベースに接続します。

XML Parser for Javaの使用: 基本プロセス

図4-3に、標準的なXML処理アプリケーションでXMLパーサーを使用する方法を示します。

図4-3 XML Parser for Java

図4-3に示したアプリケーションの基本プロセスは次のとおりです。

1. DOMまたはSAXパーサーにより、入力XML文書が解析されます。たとえば、プログラムはXMLデータ文書、DTD、XMLスキーマおよびXSLスタイルシートを解析できます。

2. 検証パーサーを実装すると、プロセッサは、提供されているDTDまたはXMLスキーマに対してXMLデータ文書が妥当であるかどうかの検証を試行します。

関連項目:

- 第6章「XSLT Processor for Javaの使用」

- 検証の詳細は、第7章「Schema Processor for Javaの使用」を参照してください。

- XMLパーサーのクラスとメソッドについては、Oracle Database XML Java APIリファレンスを参照してください

XML Parserのデモ・プログラムの実行

XML Parser for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/parserにあります。表4-3に、デモ・プログラムが格納されているサブディレクトリを示します。

表4-3 Javaパーサーのデモ

ディレクトリ

内容

プログラムの説明

common

class.xml
DemoUtil.java
empl.xml
family.dtd
family.xml
iden.xsl
NSExample.xml
traversal.xml

XMLパーサーで一般的に使用するXMLファイルおよびJavaプログラムです。たとえば、XSLTスタイルシートiden.xslを使用して、XMLファイルの識別情報変換を実行できます。DemoUtil.javaでは、ファイル名からURLを作成するためのヘルパー・メソッドが実装されます。このメソッドは、他の多数のデモ・プログラムで使用されます。

comp

DOMCompression.java
DOMDeCompression.java
SAXCompression.java
SAXDeCompression.java
SampleSAXHandler.java
sample.xml
xml.ser

DOMおよびSAX圧縮を示します。

- DOMCompression.javaでは、DOMツリーが圧縮されます。

- DOMDeCompression.javaでは、圧縮したストリームからDOMが再度読み取られます。

- SAXCompression.javaでは、SAXパーサーからの出力が圧縮されます。

- SAXDeCompression.javaでは、圧縮したストリームからSAXイベントが再生成されます。

- SampleSAXHandler.javaでは、SAX DeCompressorからスローされたイベントを処理するハンドラの使用方法が示されます。

dom

AutoDetectEncoding.java
DOM2Namespace.java
DOMNamespace.java
DOMRangeSample.java
DOMSample.java
EventSample.java
I18nSafeXMLFileWritingSample.java
NodeIteratorSample.java
ParseXMLFromString.java
TreeWalkerSample.java

DOM APIの使用方法を示します。

- DOM2Namespace.javaでは、DOMレベル2.0 APIの使用方法が示されます。

- DOMNamespace.javaでは、DOM APIへの名前空間による拡張の使用方法が示されます。

- DOMRangeSample.javaでは、DOM範囲APIの使用方法が示されます。

- DOMSample.javaでは、DOM APIの基本的な使用方法が示されます。

- EventSample.javaでは、DOM Event APIの使用方法が示されます。

- NodeIteratorSample.javaでは、DOM Iterator APIの使用方法が示されます。

- TreeWalkerSample.javaでは、DOM TreeWalker APIの使用方法が示されます。

jaxp

JAXPExamples.java
age.xsl
general.xml
jaxpone.xml
jaxpone.xsl
jaxpthree.xsl
jaxptwo.xsl
oraContentHandler.java

JAXP APIの様々な使用方法を示します。

- JAXPExamples.javaでは、JAXP 1.1 APIを使用してOracleエンジンを実行する方法の例がいくつか示されます。

- oraContentHandler.javaでは、SAXコンテンツ・ハンドラが実装されます。このプログラムは、XMLタグを認識する際に、startDocument()、endDocument()、startElement()、endElement()などのメソッドを起動します。

sax

SAX2Namespace.java
SAXNamespace.java
SAXSample.java
Tokenizer.java

SAX APIの様々な使用方法を示します。

- SAX2Namespace.javaでは、SAX 2.0の使用方法が示されます。

- SAXNamespace.javaでは、SAX APIへの名前空間による拡張の使用方法が示されます。

- SAXSample.javaでは、SAX APIの基本的な使用方法が示されます。

- Tokenizer.javaでは、XMLTokenインタフェースAPIの使用方法が示されます。このプログラムは、XMLTokenインタフェースを実装します。このインタフェースは、setTokenHandler()メソッドを使用して登録する必要があります。XMLTokenのリクエストは、setToken()メソッドを使用して登録します。トークン化実行中、パーサーは、ドキュメントを検証せず、内部および外部のユーティリティの追加または読取りも行いません。

xslt

XSLSample.java
XSLSample2.java
match.xml
match.xsl
math.xml
math.xsl
number.xml
number.xsl
position.xml
position.xsl
reverse.xml
reverse.xsl
string.xml
string.xsl
style.txt
variable.xml
variable.xsl

XSLTを使用した文書の変換を示します。

- XSLSample.javaでは、Oracle XML ParserのXSL処理機能の使用方法が示されます。指定された入力スタイルシートを使用して入力XML文書が変換されます。このデモは、XSL変換の結果をDocumentFragmentとして構築するため、xsl:output機能をサポートしません。

- XSLSample2.javaでは、与えられた入力スタイルシートを使用して入力XML文書が変換されます。このデモは、XSL変換の結果をストリーム化するため、xsl:output機能をサポートします。

関連項目: 「XSLTプロセッサのデモ・プログラムの実行」

サンプル・プログラムのコンパイルおよび実行方法に関するドキュメントは、READMEにあります。基本手順は次のとおりです。

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

2. 「Java XDK環境の設定」の説明に従って、環境を設定します。

3. 次の各サブディレクトリに変更し、コマンドラインでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。次に例を示します。

cd comp;make;cd ..
cd jaxp;make;cd ..
cd sax;make;cd ..
cd dom;make;cd ..
cd xslt;make;cd ..

makeファイルでは、各ディレクトリ内のソース・コードがコンパイルされ、プログラムが実行され、各プログラムの出力が*.outという拡張子の付いたファイルに書き込まれます。

4. *.outファイルを表示して、プログラムの出力を参照できます。

XML Parserコマンドライン・ユーティリティの使用

$ORACLE_HOME/bin (UNIXの場合)または%ORACLE_HOME%\bin (Windowsの場合) にあるoraxmlユーティリティは、XML文書を解析するコマンドライン・インタフェースです。XML文書が整形式であるか、および妥当であるかを確認します。

oraxmlを使用するには、次の条件に該当することを確認する必要があります。

- 「Java XDK環境の設定」の説明に従ってCLASSPATHが設定されていること。特に、環境変数CLASSPATHがxmlparserv2.jarファイルを指していることを確認してください。

- 環境変数PATHが、使用しているJDKのバージョンに付属するJavaインタプリタを検索できること。

表4-4に、oraxmlのコマンドライン・オプションを示します。

表4-4oraxmlのコマンドライン・オプション

オプション

用途

-help

ヘルプ・メッセージを出力します。

-version

バージョン番号の出力

-novalidate fileName

入力ファイルが整形式かどうかの確認

-dtd fileName

DTD検証を使用した入力ファイルの検証

-schema fileName

スキーマ検証を使用した入力ファイルの検証

-log logfile

出力ログ・ファイルへのエラーの書込み

-comp fileName

入力XMLファイルの圧縮

-decomp fileName

入力圧縮ファイルの解凍

-enc fileName

入力ファイルのエンコーディングの出力

-warning

警告の表示

たとえば、$ORACLE_HOME/xdk/demo/java/parser/commonディレクトリに変更します。コマンドラインで次のコマンドを実行することにより、文書family.xmlがfamily.dtdに対して妥当であるかどうかを検証できます。

oraxml -dtd -enc family.xml

出力は次のようになります。

The encoding of the input file: UTF-8The input XML file is parsed without errors using DTD validation mode.

DOMを使用したXMLの解析

W3C標準ライブラリorg.w3c.domでは、Documentクラスと、DOMのコンポーネント用のクラスが定義されています。Oracle XML Parserには、標準のDOM APIが組み込まれており、W3C DOMの勧告に準拠しています。org.w3c.domとともに、Oracle XML Parsingには、DOM APIを実装するクラスが組み込まれており、これらを拡張して文書フラグメントの出力や名前空間情報の取得などの機能を提供しています。

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

- DOM APIの使用

- DOMパーサーのアーキテクチャ

- 基本的なDOM解析の実行

- 拡張性のあるDOMの作成

- 名前空間を使用したDOM操作の実行

- イベントを使用したDOM操作の実行

- 範囲を使用したDOM操作の実行

- TreeWalkerを使用したDOM操作の実行

DOM APIの使用

XMLアプリケーションにDOMベースのコンポーネントを実装するには、次のXDKクラスを使用します。

- oracle.xml.parser.v2.DOMParser。このクラスは、W3C勧告に準拠したXML 1.0のパーサーを実装します。DOMParserはXMLParserを拡張するため、XMLParserのすべてのメソッドはDOMParserで使用できます。

関連項目:
「DOMパーサーのアーキテクチャ」

- oracle.xml.parser.v2.XMLDOMImplementation。このクラスにはプラガブルな拡張性のあるDOMを作成するファクトリ・メソッドが含まれます。
つまり、XMLDOMImplementationクラスで作成されたDOMがプラガブルな拡張性のあるDOMです。

関連項目:
「拡張性のあるDOMの作成」

DOMNamespaceおよびDOM2Namespaceクラスも利用できます。これらのクラスは、$ORACLE_HOME/xdk/demo/java/parser/domに含まれているサンプル・プログラムです。

DOMパーサーのアーキテクチャ

例4-4に、DOMパーサーのアーキテクチャを示します。

図4-4 DOMパーサーの基本アーキテクチャ

基本的なDOM解析の実行

プログラムDOMSample.javaに、入力XML文書の解析およびDOMを介してのアクセスへの基本手順の説明があります。

プログラムは、入力としてXMLファイルを受け取って解析し、DOMツリー内の要素と属性を出力します。

これらの手順により、使用可能なメソッドおよびインタフェースを提供する表への参照できます。

1. DOMParser()コンストラクタをコールすることにより、DOMParserオブジェクトを作成します。このパーサーを使用して、入力XMLデータ文書とDTDを解析できます。DOMSample.javaの次のコード部分は、この方法を示します。

DOMParser parser = new DOMParser();

2. パーサーのプロパティを構成します。表4-5を参照してください。
DOMSample.javaの次のコード部分は、エラー出力ストリームを指定し、検証モードをDTD検証に設定して、警告メッセージを有効にします。

parser.setErrorStream(System.err);
parser.setValidationMode(DOMParser.DTD_VALIDATION);
parser.showWarnings(true);

3. parse()メソッドを起動することにより、入力XML文書を解析します。このプログラムでは、Nodeオブジェクトのツリーをメモリーに構築します。
DOMSample.javaのこのコード部分は、java.net.URLクラスのインスタンスを解析する方法を示します。

parser.parse(url);

XML入力は、ファイル、文字列バッファまたはURLのいずれかになることに注意してください。次のコード部分に示すとおり、DOMSample.javaはファイル名をパラメータとして受け入れ、createURLヘルパー・メソッドをコールして、パーサーに渡すことのできるURLオブジェクトを作成します。

public class DOMSample
{
static public void main(String[] argv)
{
try
{
if (argv.length != 1)
{
// Must pass in the name of the XML file.
System.err.println("Usage: java DOMSample filename");
System.exit(1);
}
...
// Generate a URL from the filename.
URL url = DemoUtil.createURL(argv[0]);
...

4. getDocument()を起動して、パーサーがインメモリーDOMツリーのルートへのハンドルを取得します。このハンドルはXMLDocumentオブジェクトです。このハンドルを使用して、解析されたXML文書のすべての部分にアクセスできます。表4-6に、XMLDocumentクラスが実装するインタフェースを示します。
DOMSample.javaのこのコード部分は、この方法を示します。

XMLDocument doc = parser.getDocument();

5. 様々なXMLDocumentメソッドをコールすることにより、取得した文書のDOMノードを取得および操作します。表4-7を参照してください。

DOMSample.javaの次のコード部分は、DOMParser.print()メソッドを使用して、DOMツリーの要素および属性を出力します。

System.out.print("The elements are: ");
printElements(doc);

System.out.println("The attributes of each element are: ");
printElementAttributes(doc);

プログラムは、printElements()メソッドを実装します。このメソッドは、getElementsByTagName()をコールして、DOMツリー内のすべての要素のリストを取得します。次に、リスト内の各アイテムをループし、getNodeName()をコールして各要素の名前を出力します。

static void printElements(Document doc)
{
NodeList nl = doc.getElementsByTagName("*");
Node n;

for (int i=0; i<nl.getLength(); i++)
{
n = nl.item(i);
System.out.print(n.getNodeName() + " ");
}

System.out.println();
}

プログラムは、printElementAttributes()メソッドを実装します。このメソッドは、Document.getElementsByTagName()をコールして、DOMツリー内のすべての要素のリストを取得します。次に、リスト内の各要素をループし、Element.getAttributes()をコールして要素の属性のリストを取得します。次に、Node.getNodeName()をコールして属性名を取得し、Node.getNodeValue()をコールして属性値を取得します。

static void printElementAttributes(Document doc)
{
NodeList nl = doc.getElementsByTagName("*");
Element e;
Node n;
NamedNodeMap nnm;

String attrname;
String attrval;
int i, len;

len = nl.getLength();

for (int j=0; j < len; j++)
{
e = (Element)nl.item(j);
System.out.println(e.getTagName() + ":");
nnm = e.getAttributes();

if (nnm != null)
{
for (i=0; i<nnm.getLength(); i++)
{
n = nnm.item(i);
attrname = n.getNodeName();
attrval = n.getNodeValue();
System.out.print(" " + attrname + " = " + attrval);
}
}
System.out.println();
}
}

6. reset()メソッドを起動することにより、パーサーの状態をリセットします。これで、パーサーが新規文書を解析する準備ができます。

有用なメソッドおよびインタフェース

次の表に、「基本的なDOM解析の実行」で作成したようなアプリケーションの作成に使用する有用なメソッドおよびインタフェースを示します。

表4-5に、有用な構成メソッドを示します。

表4-5 DOMParser構成メソッド

メソッド

メソッドの用途 . .

setBaseURL()

外部エンティティとDTDをロードするためのベースURLを設定します。このメソッドは、XML文書がInputStreamである場合にコールします。

setDoctype()

解析時に使用するDTDを指定します。

setErrorStream()

エラーと警告の出力の出力ストリームを作成します。

setPreserveWhitespace()

入力XML文書に空白を保持するようにパーサーに指示します。

setValidationMode()

パーサーの検証モードを設定します。表4-1に、このメソッドで使用できるフラグを示します。

showWarnings()

パーサーが警告を出力する必要があるかどうかを指定します。

表4-6に、XMLDocumentクラスが実装するインタフェースを示します。

表4-6 XMLDocumentにより実装されるいくつかのインタフェース

インタフェース

定義内容 . .

org.w3c.dom.Node

文書ツリー内の単一ノードと、ノードをアクセスおよび処理するためのメソッド。

org.w3c.dom.Document

XML文書全体を表すNode

org.w3c.dom.Element

XML要素を表すNode

表4-7に、ノードを取得するときに役立つメソッドをいくつか示します。

表4-7 有用なXMLDocumentのメソッド

メソッド

メソッドの用途 . .

getAttributes()

このノードが要素である場合はその属性を含むNamedNodeMapを生成し、要素でない場合はnullを生成します。

getElementsbyTagName()

特定のレベルの特定のタグ名と一致するすべての要素を再帰的に取得します。このメソッドでは、任意のタグと一致する*タグがサポートされます。文書のルートへのハンドルを通じてgetElementsByTagName("*")をコールして、文書内のすべての要素のリストを生成します。

getExpandedName()

要素の拡張名を取得します。このメソッドは、NSNameインタフェースで指定されます。

getLocalName()

この要素のローカル名を取得します。要素名が<E1:locn xmlns:E1="http://www.oracle.com/"/>の場合は、locnがローカル名です。

getNamespaceURI()

このノードの名前空間URIを取得するか、名前空間URIが指定されていない場合はnullを戻します。要素名が<E1:locn xmlns:E1="http://www.oracle.com/"/>の場合は、http://www.oracle.comが名前空間URIです。

getNodeName()

DOMツリー内のノードの名前を取得します。

getNodeValue()

タイプに応じて、このノードの値を取得します。このモードは、Nodeインタフェースにあります。

getPrefix()

要素の名前空間の接頭辞を取得します。

getQualifiedName()

要素の修飾名を取得します。要素名が<E1:locn xmlns:E1="http://www.oracle.com/"/>の場合は、E1:locnが修飾名です。

getTagName()

DOMツリー内の要素の名前を取得します。

拡張性のあるDOMの作成

この項では、拡張性のあるDOMの作成および使用方法について説明します。

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

- プラガブルなDOMの使用

- 遅延マテリアライズの使用

- 構成可能なDOM設定の使用

- 拡張性のあるDOMアプリケーション

プラガブルなDOMの使用

プラガブルなDOMはデータからDOM APIを分割します。基礎となるデータは、内部またはプラグインのいずれかで、いずれの場合もバイナリXMLです。

- 内部データ
XMLテキストが解析されていない内部データをプラグインするには、XMLテキストはバイナリXMLとして保存され、DOMParserによって解析される必要があります。解析済バイナリXMLは、DOM APIレイヤーのInfoSetReaderにプラグインされます。

InfosetReader引数は、基礎となるXMLデータへのインタフェースです。

- プラグイン・データ
プラグイン・データはすでに解析済のデータなので、プロセッサ間の転送で解析は不要です。

プラガブルなDOMを作成するには、XMLデータは、たとえばXMLDOMImplementationオブジェクト上のInfosetReaderインタフェースを介してプラグインされます。

public Document createDocument(InfosetReader reader) throws DOMException

InfosetReaderAPIはXDKBinXMLStreamの上位に実装されます。DOM4J、JDOMまたはJDBCなどのXMLデータの他の形式のオプションのアダプタも、サポートされます。ユーザーは独自の実装にもプラグインできます。

InfosetReaderは、拡張性のあるDOM APIレイヤーおよび基礎となるデータ間のインタフェースとして機能します。XMLデータにアクセスするのは、一般的なストリームベースのPull APIです。InfosetReaderは、XMLストリームからシーケンシャルなイベントを取得し、これらのイベントから状態およびデータの問合せを実行します。次の例では、XMLデータがスキャンされ、QNameおよびすべての要素の属性が取得されています。

InfosetReader reader;
While (reader.hasNext())
{
reader.next();
if (reader.getEventType() == START_ELEMENT)
{
QName name = reader.getQName();
TypedAttributeList attrList = reader.getAttributeList();
}
}

InfosetReaderオプション

InfosetReaderインタフェースは次の機能をサポートしています。

コピー: 文書間のDOMのシャドウ・コピーをサポートするには、InfosetReaderの新規コピーを作成して、Cloneメソッドを使用して、スレッドを安全にします。BinXMLStreamから取得されたInfosetReaderは、常にこれをサポートします(オプション)。

関連項目:
「シャドウ・コピーの使用」

フォーカスの移動: 遅延マテリアライズをサポートするには、InfosetReaderは、Offsetによって指定されたどの場所にもフォーカスを移動できます(オプション)。

If (reader.hasSeekSupport())
reader.seek(offset);

関連項目:
「遅延マテリアライズの使用」

InfosetWriter

InfosetWriterは、データ書込みをサポートするInfosetReaderインタフェースの拡張機能です。XDKでは、バイナリXMLの上位で実装されます。ユーザーはこの実装を変更できません。

XMLテキストのバイナリXMLとしての保存

XMLテキストから拡張性のあるDOMを作成するには、DOMParser実行前に、XMLテキストをバイナリXMLとして保存する必要があります。次のいずれかでもXMLテキストを保存できます。

- バイナリXML

- バイナリXMLへの参照: データ・ソースがデシリアライズに使用可能と判明している場合は、現在のデータのかわりにバイナリXMLの参照項目を保存できます。

次の例に、バイナリXMLとしての保存方法を示します。

XMLDocument doc;
InfosetWriter writer;
doc.save(writer, false);
writer.close();

バイナリXMLへの参照として保存するには、saveコマンドに対する引数としてtrueを使用します。

関連項目:
第5章「バイナリXML for Javaの使用」

遅延マテリアライズの使用

遅延マテリアライズを使用して、空のDOMをプラグインできます。それにより、必要な場合はより多くのデータを取り出せ、不要になったらノードを解放できます。

オンデマンドでのデータの取出し

プラグインDOMアーキテクチャは、ツリーのルートとして単一のDocumentノードを含む空のDOMを作成します。残りのDOMツリーは、後でアクセスして拡張できます。ノードには拡張されない子や兄弟関係のノードがある場合もありますが、親および祖先は常に拡張されます。DOMはデータを取り出して次のノードを作成できるように、各ノードは次のノードのInfoSetReader.Offsetプロパティを保持します。

アクセス・メソッド・タイプによっては、DOMノードは戻されたノードのセット以上に拡張する場合もあります。

- DOMナビゲーション
DOMナビゲーション・インタフェースは、最初の子や、最後の子、親、兄弟関係などの近隣のノードへのアクセスを可能にします。ノード作成が必要な場合は、ドキュメント内の順に行われます。

- IDの索引付け
DTDまたはXMLスキーマは、型IDでノードを指定できます。DOMがIDの索引付けをサポートする場合、それらのノードは、索引を使用して直接取出し可能になります。拡張性のあるDOMの場合、索引による取得で、前のすべてのノードが拡張されるわけではありませんが、祖先のノードは生成されます。

- Xpath式
XPath評価により、インメモリーのすべての中間ノードが生成されます。たとえば、子孫の軸「//」により全体のサブツリーが拡張されますが、評価後に解放されるものもあります。

不要の際のノードの解放

拡張性のあるDOMは、ノードの手動参照解除または自動参照解除のいずれかをサポートします。

- 弱参照を使用した自動参照解除
自動参照解除を有効化するには、PARTIAL_DOM属性をBoolean.TRUEに設定します。

DOMナビゲーションをサポートしている場合は、ノード間のクロス参照を追加する必要があります。自動参照解除モードでは、リンクのいくつかは弱参照で、不要データ収集時に解放されます。

リンクの重要性に基づいてノードが解放されます。親ノードへのリンクは削除されません。有効範囲内の名前空間に祖先がコンテキストを提供し、InfosetReaderなどのストリームAPIを使用して削除済の親ノードを取得するのは難しいためです。

拡張性のあるDOMは、親および兄弟関係を強く保持しますが、子や次のような兄弟関係の保持は弱いです。Java仮想マシンがノードを解放されても、それらへの参照は基礎となるデータで使用可能であるため、必要な場合は再作成できます。

- 手動参照解除
手動参照解除を有効化するには、属性PARTIAL_DOMをBoolean.FALSEに設定して、プラグインXMLデータを使用してDOMを作成します。

このモードでは、DOMはアプリケーションに依存し、ツリー全体からドキュメント・フラグメントを明示的に参照解除します。弱参照はありません。アプリケーションに決定的なデータ処理の順序がある場合、ノードの解放と再作成の繰り返し行う余分なオーバーヘッドは回避することをお薦めします。

すべての他のノードから参照解除を実行するには、freeNode()をコールします。次に例を示します。

Element root = doc.getDocumentElement();
Node item = root.getFirstChild();
While (item != null)
{
processItem(item);
Node tmp = item;
item = item.getNextSibling();
((XMLNode)tmp).freeNode();
}

拡張性のないDOMではfreeNodeコールは適用されません。

参照解除するノードはDOMツリーから削除されたノードとは異なることに注意してください。DOMツリーは、freeNodeがDOMノード上でコールされても変更しません。ノードは、その親や兄弟関係からアクセスおよび再作成可能です。ただし、ノード解放後にノードにアクセスする場合は、ノードを保持する変数によってエラーがスローされます。

シャドウ・コピーの使用

シャドウ・コピーを使用して、下部のデータはデータ複製を避けるために共有できます。

XML処理の共通操作であるクローン作成は、プラガブルなDOMで簡単に実行できます。

copyメソッドが使用されると、コピーされたフラグメントのルート・ノードが作成され、サブツリーはオンデマンドで拡張されます。

データ共有は基礎となるデータに対するもので、DOMノード自体に対してではありません。DOM仕様では、クローンとそのオリジナルではノード識別および親ノードを別のものにする必要があります。

DOM更新の合体

DOM APIは、追加、削除ノード、設定、削除、変更および挿入値などの更新操作をサポートします。DOMがプラグインXMLデータで作成されると、基礎となるデータはDOMの外部とみなされます。DOM更新は、DOM APIから表示可能ですがデータ・ソースは同一のままです。通常の更新操作は使用可能ですが、相互に妨害はしません。

変更済のDOMを永続にするには、DOMを明示的に保存する必要があります。これによりすべての変更はオリジナル・データとともにマージされ、永続格納にデータがシリアライズされます。変更したDOMを明示的に保存しない場合は、トランザクションを終了すると変更が失われます。

PageManagerインタフェースを使用した内部データのサポート

XMLテキストは、DOMParserで解析および構成されて拡張性のあるDOMが作成されると、内部データはバイナリXMLの形式でキャッシュされ、DOM APIレイヤーは内部データの上位で構築されます。バイナリXMLはDOMノードよりさらにコンパクトであるため、これによりスケーラビリティが増大されます。

追加のスケーラビリティに関しては、拡張性のあるDOMはPageManagerインタフェースを介してバイナリ・データのバックエンド格納を使用できます。バイナリ・データは、使用していないメモリーと交換可能です。

このコードの例に、PageManagerインタフェースの使用方法を示します。

DOMParser parser = new DOMParser();
parser.setAttribute(PARTIAL_DOM, Boolean.TRUE); //enable scalable DOM
parser.setAttribute(PAGE_MANAGER, new FilePageManager("pageFile"));
...
// DOMParser other configuration
parser.parse(fileURL);
XMLDocument doc = parser.getDocument();

PageManagerインタフェースが使用されていない場合、パーサーはバイナリXMLとして文書全体をキャッシュします。

構成可能なDOM設定の使用

XMLDOMImplementationクラスを使用してDOMを作成する場合、XMLDOMImplementationクラスのsetAttributeメソッドを使用して、DOMを構成して異なるアプリケーションに適合でき、効率を最大にできます。

public void setAttribute(String name, Object value) throws IllegalArgumentException

拡張性のあるDOMに関しては、PARTIAL_DOMおよびACCESS_MODE属性に対してsetAttributeをコールします。

注意:
新規の属性値が影響するのは次のDOMであり、現在のものではありません。そのため、XMLDOMImplementationのインスタンスは、別の構成でDOMを作成するのに使用されます。

- PARTIAL_DOM
この属性は、DOMに拡張性があるかどうか(部分的)、ブール値を取るかどうかを示します。DOM作成は、属性がTRUEに設定されている場合は拡張性があります。必要な場合は、使用されていないノードが解放され、再作成されます。属性がFALSEに設定されている、または設定がない場合はDOM作成に拡張性はありません。

- ACCESS_MODE
この属性は、DOMのアクセスを制御し、拡張性のあるDOMおよび拡張性のないDOMの両方に適用されます。次の値があります。

- UPDATEABLE
DOMはすべてのDOM更新操作をサポートします。

UPDATEABLEはACCESS_MODE属性のデフォルト値で、XDK DOM実装との下位互換性を保持します。

- READ_ONLY
DOMはこの読取りのみできます。

DOMツリーを変更しようとするとエラーが出ますが、新規ノードがDOMツリーに追加されないかぎりクローン作成などのノード作成は可能です。

- FORWARD_READ
この値は、getFirstChild().getNextSibling()やgetLastChild()などのナビゲーションを有効にしますが、getPreviousSibling()などの下位アクセスはできません。

FORWARD_READは親ノードや祖先ノードにアクセス可能です。

- STREAMING
DOMアクセスは、SAXイベント・アクセスに類似したドキュメント内の順での、ノードのストリームに限定されます。

ストリーム・モードでの現在のノードの概念に従って、現在のノードは、ドキュメント内の順にアクセスした最後のノードです。アプリケーションは変数内にノードを保持し、再度アクセスしますが、DOMメソッドを使用して現在のノードの前に他のノードにアクセスすると、DOMエラーを引き起こします。ただし、祖先のノードおよび属性ノードへのアクセスは常に可能です。

次に、ストリーム・モードでのDOMの動作を示します。

Node parent = currentNode.getParentNode(); // OK although parent is before current node

Node child = parent.getFirstChild(); // Error if the current node is not the first child of parent!

Attribute attr = parent.getFirstAttribute();// OK accessing attributes from Element is always //allowed

次に、アクセス・モードを制限の低いものから高いものの順に示します。

UPDATEABLE > READ_ONLY > FORWARD_READ > STREAM_READ

構成可能なDOM設定へのパフォーマンス上の利点

DOMはREAD_ONLYモードで変更できません。そのため書込みバッファ全体は必要ありません。

DOMはFORWARD_READモードで祖先のノード以外の下位を読み取りません。したがって、兄弟関係のリンクは作成されません。

DOMは親リンクのみ保持し、STREAM_READモードでノードのデータの場所を記憶する必要はありません。したがって、解放されたノードは再作成される必要はありません。

拡張性のあるDOMアプリケーション

ここでは、プラガブルな拡張性のあるDOMを作成および使用するアプリケーションを示します。

XMLDOMImplementation domimpl = new XMLDOMImplementation();
domimpl.setAttribute(XMLDocument.SCALABLE_DOM, Boolean.TRUE);
domimpl.setAttribute(XMLDocument.ACCESS_MODE,XMLDocument.UPDATEABLE);
XMLDocument scalableDoc = (XMLDocument) domimpl.createDocument(reader);

プラガブルで、拡張性のある、バイナリXMLに基づくDOMを作成および使用するアプリケーションを次に示します。詳細は第5章「バイナリXML for Javaの使用」を参照してください。

BinXMLProcessor proc = BinXMLProcessorFactory.createProcessor();
BinXMLStream bstr = proc.createBinXMLStream();
BinXMLEncoder enc = bstr.getEncoder();
enc.setProperty(BinXMLEncoder.ENC_SCHEMA_AWARE, false);

SAXParser parser = new SAXParser();
parser.setContentHandler(enc.getContentHandler());
parser.setErrorHandler(enc.getErrorHandler());
parser.parse(BinXMLUtil.createURL(xmlfile));

BinXMLDecoder dec = bstr.getDecoder();
InfosetReader reader = dec.getReader();
XMLDOMImplementation domimpl = new XMLDOMImplementation();
domimpl.setAttribute(XMLDocument.SCALABLE_DOM, Boolean.TRUE);
XMLDocument currentDoc = (XMLDocument) domimpl.createDocument(reader);

名前空間を使用したDOM操作の実行

DOM2Namespace.javaプログラムは、パーサーの単純な使用方法とDOM APIへの名前空間による拡張を示します。プログラムは、XML文書を受け取って解析し、文書内の要素と属性を出力します。

「基本的なDOM解析の実行」の最初の4つの手順(パーサー作成からgetDocument()コールまで)は、基本的にDOM2Namespace.javaの場合と同じです。主な違いは、DOMツリーの出力の手順です(手順5)。DOM2Namespace.javaプログラムでは、かわりに次の処理を行います。

// Print document elements
printElements(doc);

// Print document element attributes
System.out.println("The attributes of each element are: ");
printElementAttributes(doc);

DOM2Namespace.javaにより実装されるprintElements()メソッドは、getElementsByTagName()をコールして、DOMツリー内のすべての要素のリストを取得します。次に、リスト内の各アイテムをループし、各ElementをnsElementにキャストします。各nsElementについて、nsElement.getPrefix()をコールして名前空間の接頭辞を取得し、nsElement.getLocalName()をコールしてローカル名を取得し、nsElement.getNamespaceURI()をコールして名前空間URIを取得します。

static void printElements(Document doc)
{
NodeList nl = doc.getElementsByTagName("*");
Element nsElement;
String prefix;
String localName;
String nsName;

System.out.println("The elements are: ");
for (int i=0; i < nl.getLength(); i++)
{
nsElement = (Element)nl.item(i);

prefix = nsElement.getPrefix();
System.out.println("  ELEMENT Prefix Name :" + prefix);

localName = nsElement.getLocalName();
System.out.println("  ELEMENT Local Name    :" + localName);

nsName = nsElement.getNamespaceURI();
System.out.println("  ELEMENT Namespace     :" + nsName);
}
System.out.println();
}

printElementAttributes()メソッドは、Document.getElementsByTagName()をコールして、DOMツリー内の要素のNodeListを取得します。次に、各要素をループし、Element.getAttributes()をコールして要素の属性のリストをNamedNodeMapという特殊なリストとして取得します。属性リストの各アイテムについて、nsAttr.getPrefix()をコールして名前空間の接頭辞を取得し、nsAttr.getLocalName()をコールしてローカル名を取得し、nsAttr.getValue()をコールして値を取得します。

static void printElementAttributes(Document doc)
{
NodeList nl = doc.getElementsByTagName("*");
Element e;
Attr nsAttr;
String attrpfx;
String attrname;
String attrval;
NamedNodeMap nnm;
int i, len;

len = nl.getLength();

for (int j=0; j < len; j++)
{
e = (Element) nl.item(j);
System.out.println(e.getTagName() + ":");

nnm = e.getAttributes();

if (nnm != null)
{
for (i=0; i < nnm.getLength(); i++)
{
nsAttr = (Attr) nnm.item(i);

attrpfx = nsAttr.getPrefix();
attrname = nsAttr.getLocalName();
attrval = nsAttr.getNodeValue();

System.out.println(" " + attrpfx + ":" + attrname + " = "
+ attrval);
}
}
System.out.println();
}
}

イベントを使用したDOM操作の実行

EventSample.javaプログラムは、イベント・リスナーを使用して様々なイベントを登録する方法を示します。たとえば、指定されたDOM要素にノードが追加された場合は、イベントがトリガーされます。これにより、リスナーがイベントに関する情報を出力します。

プログラムは次の手順を実行します。

1. イベント・リスナーをインスタンス化します。登録された変更によりイベントがトリガーされると、このイベントがイベント・リスナーに渡されて処理されます。EventSample.javaの次のコード部分は、リスナーの実装を示します。

eventlistener evtlist = new eventlistener();
...
class eventlistener implements EventListener
{
public eventlistener(){}
public void handleEvent(Event e)
{
String s = " Event "+e.getType()+" received " + "\n";
s += " Event is cancelable :"+e.getCancelable()+"\n";
s += " Event is bubbling event :"+e.getBubbles()+"\n";
s += " The Target is " + ((Node)(e.getTarget())).getNodeName() + "\n\n";
System.out.println(s);
}
}

2. 新規XMLDocumentをインスタンス化し、getImplementation()をコールしてDOMImplementationオブジェクトを取得します。hasFeature()メソッドをコールして、この実装でサポートされる機能を判断できます。EventSample.javaの次のコード部分は、この方法を示します。

XMLDocument doc1 = new XMLDocument();
DOMImplementation impl = doc1.getImplementation();

System.out.println("The impl supports Events "+
impl.hasFeature("Events", "2.0"));
System.out.println("The impl supports Mutation Events "+
impl.hasFeature("MutationEvents", "2.0"));

3. 目的のイベントをリスナーに登録します。EventSample.javaの次のコード部分は、文書ノードの3つのイベントを登録します。

doc1.addEventListener("DOMNodeRemoved", evtlist, false);
doc1.addEventListener("DOMNodeInserted", evtlist, false);
doc1.addEventListener("DOMCharacterDataModified", evtlist, false);

EventSample.javaの次のコード部分は、タイプXMLElementのノードを作成し、このノードの3つのイベントを登録します。

XMLElement el = (XMLElement)doc1.createElement("element");
...
el.addEventListener("DOMNodeRemoved", evtlist, false);
el.addEventListener("DOMNodeRemovedFromDocument", evtlist, false);
el.addEventListener("DOMCharacterDataModified", evtlist, false);
...

4. イベントをトリガーするアクションを実行します。これらのイベントは、リスナーに渡されて処理されます。EventSample.javaの次のコード部分は、この方法を示します。

att.setNodeValue("abc");
el.appendChild(el1);
el.appendChild(text);
text.setNodeValue("xyz");
doc1.removeChild(el);

範囲を使用したDOM操作の実行

W3C DOM仕様によると、範囲はDocument、DocumentFragmentまたはAttrのコンテンツの範囲を識別します。範囲の開始と終了に対応する1組の境界点の間にあるコンテンツを選択します。表4-8に、XMLDocumentを介してアクセスできる有用な範囲メソッドを示します。

表4-8 Rangeクラスの有用なメソッド

メソッド

説明

cloneContents()

範囲のコンテンツを複製します。

deleteContents()

範囲のコンテンツを削除します。

getCollapsed()

範囲が閉じている場合にTRUEを戻します。

getEndContainer()

範囲が終了するノードを取得します。

getStartContainer()

範囲が開始するノードを取得します。

selectNode()

ノードとそのコンテンツを選択します。

selectNodeContents()

ノード内のコンテンツを選択します。

setEnd()

範囲の終了を示す属性を設定します。

setStart()

範囲の開始を示す属性を設定します。

DOMRangeSample.javaプログラムは、範囲に対して行える操作をいくつか示します。

「基本的なDOM解析の実行」の最初の4つの手順(パーサー作成からgetDocument()コールまで)は、DOMRangeSample.javaの場合と同じです。DOMRangeSample.javaプログラムは、次の手順に従って進みます。

1. getDocument()をコールしてXMLDocumentを作成した後で、createRange()で範囲オブジェクトを作成し、setStart()およびsetEnd()をコールしてその境界を設定します。DOMRangeSample.javaの次のコード部分は、この方法を示します。

XMLDocument doc = parser.getDocument();
...
Range r = (Range) doc.createRange();
XMLNode c = (XMLNode) doc.getDocumentElement();

// set the boundaries
r.setStart(c,0);
r.setEnd(c,1);

2. XMLDocumentメソッドをコールして範囲に関する情報を取得し、そのコンテンツを操作します。表4-8に、有用なメソッドを示します。DOMRangeSample.javaの次のコード部分は、現在のノードのコンテンツを選択して出力します。

r.selectNodeContents(c);
System.out.println(r.toString());

次のコード部分は、範囲のコンテンツのクローンを作成して出力します。

XMLDocumentFragment df =(XMLDocumentFragment) r.cloneContents();
df.print(System.out);

次のコード部分は、範囲の開始コンテナと終了コンテナを取得して出力します。

c = (XMLNode) r.getStartContainer();
System.out.println(c.getText());
c = (XMLNode) r.getEndContainer();
System.out.println(c.getText());

この項では、デモ・プログラムの一部の機能のみを説明しています。詳細は、デモ・プログラム自体を参照してください。

TreeWalkerを使用したDOM操作の実行

W3C DOMレベル2 Traversal and Range仕様は、NodeFilterおよびTreeWalkerインタフェースを定義しています。XDKには次に示すインタフェースの実装が含まれます。

ノード・フィルタは、特定のタイプのNodeオブジェクトをフィルタ処理するオブジェクトです。たとえば、エンティティ参照ノードをフィルタ処理によって除外し、要素ノードと属性ノードを受け入れることができます。NodeFilterインタフェースを実装し、次にNodeオブジェクトをacceptNode()メソッドに渡すことにより、ノード・フィルタを作成します。通常、acceptNode()メソッド実装はgetNodeType()をコールしてノードのタイプを取得し、それをELEMENT_TYPEやATTRIBUTE_TYPEなどの静的変数と比較してから、結果に基づいて表4-9の静的フィールドの1つを戻します。

表4-9 NodeFilterインタフェースの静的フィールド

メソッド

説明

FILTER_ACCEPT

ノードを受け入れます。NodeIteratorまたはTreeWalkerで定義されているナビゲーション・メソッドは、このノードを戻します。

FILTER_REJECT

ノードを拒否します。NodeIteratorまたはTreeWalkerに定義されたナビゲーション・メソッドはこのノードを戻しません。TreeWalkerの場合は、このノードの子も拒否されます。NodeIteratorsは、これをFILTER_SKIPのシノニムとして扱います。

FILTER_SKIP

この単一ノードをスキップします。NodeIteratorまたはTreeWalkerに定義されたナビゲーション・メソッドはこのノードを戻しません。NodeIteratorとTreeWalkerの両方で、このノードの子が考慮されます。

TreeWalkerオブジェクトを使用し、whatToShowフラグおよびフィルタ(存在する場合)で定義されている文書のビューを使用して文書ツリーまたはサブツリーを検索できます。XMLDocument.createTreeWalker()メソッドを使用して、次の項目を指定することによりTreeWalkerオブジェクトを作成できます。

- ツリーのルート・ノード

- 論理ビューに含める必要のあるノードのタイプを管理するフラグ

- ノードをフィルタ処理するためのフィルタ

- エンティティ参照とその子孫を含める必要があるかどうかを決定するフラグ

表4-10に、org.w3c.dom.traversal.TreeWalkerインタフェースの有用なメソッドを示します。

表4-10 TreeWalkerインタフェースの有用なメソッド

メソッド

説明

firstChild()

ツリー・ウォーカーを現在のノードの最初に表示可能な子に移動し、新規ノードを戻します。現在のノードに表示可能な子がない場合は、nullを戻し、現在のノードを保持します。

getRoot()

作成時の指定に従って、ツリー・ウォーカーのルート・ノードを取得します。

lastChild()

ツリー・ウォーカーを現在のノードの最後に表示可能な子に移動し、新規ノードを戻します。現在のノードに表示可能な子がない場合は、nullを戻し、現在のノードを保持します。

nextNode()

ツリー・ウォーカーを文書内の現在のノードとの相対順序で次に表示可能な子に移動し、新規ノードを戻します。

TreeWalkerSample.javaプログラムは、ノード・フィルタとツリー検索で行える操作をいくつか示します。

「基本的なDOM解析の実行」の最初の4つの手順(パーサー作成からgetDocument()コールまで)は、TreeWalkerSample.javaの場合と同じです。TreeWalkerSample.javaプログラムは、次の手順に従って進みます。

1. ノード・フィルタ・オブジェクトを作成します。NodeFilterインタフェースを実装するnfクラスのacceptNode()メソッドは、getNodeType()を起動してノードのタイプを取得します。TreeWalkerSample.javaの次のコード部分は、この方法を示します。

NodeFilter n2 = new nf();
...
class nf implements NodeFilter
{
public short acceptNode(Node node)
{
short type = node.getNodeType();

if ((type == Node.ELEMENT_NODE) || (type == Node.ATTRIBUTE_NODE))
return FILTER_ACCEPT;
if ((type == Node.ENTITY_REFERENCE_NODE))
return FILTER_REJECT;
return FILTER_SKIP;
}
}

2. XMLDocument.createTreeWalker()メソッドを起動してツリー・ウォーカーを作成します。TreeWalkerSample.javaの次のコード部分は、XMLDocumentのルート・ノードをツリー・ウォーカーのルート・ノードとして使用し、ツリー内のすべてのノードを含めます。

XMLDocument doc = parser.getDocument();
...
TreeWalker tw = doc.createTreeWalker(doc.getDocumentElement(),NodeFilter.SHOW_ALL,n2,true);

3. TreeWalkerオブジェクトのルート要素を取得します。次のコード部分は、この方法を示します。

XMLNode nn = (XMLNode)tw.getRoot();

4. ツリーを検索します。次のコード部分は、TreeWalker.nextNode()メソッドをコールすることで文書内の順序に従ってツリーを移動する方法を示します。

while (nn != null)
{
System.out.println(nn.getNodeName() + " " + nn.getNodeValue());
nn = (XMLNode)tw.nextNode();
}

次のコード部分は、firstChild()メソッドをコールすることでツリーの左側を検索する方法を示します(lastChild()メソッドをコールすることで、ツリーの右側を検索できます)。

while (nn != null)
{
System.out.println(nn.getNodeName() + " " + nn.getNodeValue());
nn = (XMLNode)tw.firstChild();
}

この項では、デモ・プログラムの一部の機能のみを説明しています。詳細は、デモ・プログラム自体を参照してください。

SAXを使用したXMLの解析

SAXは、イベントベースのXML解析用の標準インタフェースです。この項の内容は次のとおりです。

- SAX APIの使用

- 基本的なSAX解析の実行

- 名前空間を使用した基本的なSAX解析の実行

- XMLTokenizerを使用したSAX解析の実行

SAX APIの使用

レベル1およびレベル2のバージョンでリリースされたSAX APIは、インタフェースとクラスの集合です。APIは次のカテゴリに分類できます。

- Oracle XML Parserで実装されているインタフェース。

- アプリケーションに実装する必要のあるインタフェース。表4-11に、SAX 2.0のインタフェースを示します。

表4-11 SAX2ハンドラ・インタフェース

インタフェース

説明

ContentHandler

XMLパーサーから通知を受信します。XMLタグを認識する際の主要なイベント処理メソッドは、startDocument()、endDocument()、startElement()およびendElement()です。このインタフェースは、メソッドcharacters()およびprocessingInstruction()も定義します。これらのメソッドは、パーサーがXML要素またはインライン処理命令内でテキストを検出した場合に起動されます。

DeclHandler

XML文書内のDTD宣言に関する通知を受信します。

DTDHandler

通知および未解析(バイナリ)エンティティを処理します。

EntityResolver

文書内のURIのリダイレクションの実行に必要です。resolveEntity()メソッドは、パーサーがURIで示されたデータを識別する必要がある場合に起動されます。

ErrorHandler

パーサー・エラーを処理します。プログラムは、様々な解析エラーに対してメソッドerror()、fatalError()およびwarning()を起動します。

LexicalHandler

コメントやCDATAセクション境界などの字句情報に関する通知を受信します。

- 標準SAXクラス。

- org.xml.sax.helper内のその他のJavaクラス。SAX 2.0ヘルパー・クラスは次のとおりです。

- AttributeImplは、AttributeListの永続コピーを作成します。

- DefaultHandlerは、表4-11に示したSAX2ハンドラ・インタフェースをデフォルトで実装したベース・クラスです。

- LocatorImplは、解析中の指定されたポイントでロケータの値の永続スナップショットを作成します。

- NamespaceSupportは、XML名前空間のサポートを追加します。

- XMLFilterImplは、イベントのストリームを変更する必要のあるアプリケーションで使用されるベース・クラスです。

- XMLReaderFactoryは、SAXパーサーの動的なロードをサポートします。

- nulパッケージ内のデモンストレーション・クラス。

図4-5に、SAXパーサーの作成方法と、そのパーサーを使用して入力文書を解析する方法を示します。

図4-5 SAXParserクラスの使用

SAXを使用した入力XML文書の解析の基本ステージは次のとおりです。

1. SAXParserオブジェクトを作成し、そのプロパティを構成します(有用なプロパティ・メソッドは、表4-5を参照)。たとえば、パーサーの検証モードを設定します。

2. イベント・ハンドラをインスタンス化します。プログラムでは、表4-11のハンドラ・インタフェースの実装を提供する必要があります。

3. イベント・ハンドラをパーサーに登録します。イベント・ハンドラをパーサーに登録し、特定のイベントの発生時に起動するメソッドをパーサーが認識できるようにする必要があります。表4-12に、SAXParserで使用できる登録メソッドを示します。

表4-12 イベント・ハンドラを登録するためのSAXParserのメソッド

メソッド

メソッドの用途 . .

setContentHandler()

コンテンツ・イベント・ハンドラをアプリケーションに登録します。org.xml.sax.DefaultHandlerクラスはorg.xml.sax.ContentHandlerインタフェースを実装します。アプリケーションでは、解析の途中で新規または別のハンドラを登録できます。SAXパーサーはただちに新規ハンドラの使用を開始します。

setDTDHandler()

DTDイベント・ハンドラを登録します。アプリケーションでDTDハンドラを登録しない場合、SAXパーサーにより報告されるすべてのDTDイベントは無視され、警告は出力されません。アプリケーションでは、解析の途中で新規または別のハンドラを登録できます。SAXパーサーはただちに新規ハンドラの使用を開始します。

setErrorHandler()

エラー・イベント・ハンドラをアプリケーションに登録します。アプリケーションでエラー・ハンドラを登録しない場合、SAXパーサーにより報告されるすべてのエラー・イベントは無視され、警告は出力されません。予期しない不具合を回避するために、すべてのSAXアプリケーションでエラー・ハンドラを実装することを強くお薦めします。アプリケーションでは、解析の途中で新規または別のハンドラを登録できます。SAXパーサーはただちに新規ハンドラの使用を開始します。

setEntityResolver()

エンティティ・リゾルバをアプリケーションに登録します。アプリケーションでエンティティ・リゾルバを登録しない場合、XMLReaderは独自のデフォルトの解決を実行します。アプリケーションでは、解析の途中で新規または別のリゾルバを登録できます。SAXパーサーはただちに新規リゾルバの使用を開始します。

4. SAXParser.parse()メソッドを使用して入力ドキュメントを解析します。すべてのSAXインタフェースは、同期操作を前提としています。そのため、解析メソッドは解析が完了するまで結果を戻しません。リーダーは、次のイベントを通知する前にイベント・ハンドラのコールバックが結果を戻すまで待機する必要があります。

5. SAXParser.parse()メソッドがコールされた場合、プログラムでは、アプリケーションで実装された複数のコールバック・メソッドの1つを起動します。メソッドは、イベント・ハンドラで実装されたContentHandler、ErrorHandler、DTDHandlerおよびEntityResolverインタフェースにより定義されます。たとえば、アプリケーションは、開始要素を検出した際にstartElement()メソッドをコールできます。

基本的なSAX解析の実行

SAXSample.javaプログラムは、SAX解析の基本手順を示します。SAXSampleクラスはHandlerBaseを拡張します。プログラムは、入力としてXMLファイルを受け取って解析し、ファイルのコンテンツに関する情報を出力します。

プログラムは次の手順を実行します。

1. Locatorを格納します。Locatorは、SAXイベントを文書の場所に関連付けます。SAXパーサーは、Locatorインスタンスをコンテンツ・ハンドラのsetDocumentLocator()メソッドに渡すことにより、アプリケーションに場所情報を提供します。アプリケーションでは、オブジェクトを使用して、XMLソース文書内の他の任意のコンテンツ・ハンドラ・イベントの場所を取得できます。SAXSample.javaの次のコード部分は、この方法を示します。

Locator locator;

2. 新規イベント・ハンドラをインスタンス化します。SAXSample.javaの次のコード部分は、この方法を示します。

SAXSample sample = new SAXSample();

3. SAXパーサーをインスタンス化し、構成します。SAXSample.javaの次のコード部分は、モードをDTD検証に設定します。

Parser parser = new SAXParser();
((SAXParser)parser).setValidationMode(SAXParser.DTD_VALIDATION);

4. SAXパーサーにイベント・ハンドラを登録します。SAXParserクラスの登録メソッドを使用できますが、ハンドラ・インタフェースはユーザーが実装する必要があります。次のコード部分は、ハンドラを登録します。

parser.setDocumentHandler(sample);
parser.setEntityResolver(sample);
parser.setDTDHandler(sample);
parser.setErrorHandler(sample);

次のコードは、DocumentHandlerインタフェースの実装をいくつか示します。

public void setDocumentLocator (Locator locator)
{
System.out.println("SetDocumentLocator:");
this.locator = locator;
}
public void startDocument()
{
System.out.println("StartDocument");
}
public void endDocument() throws SAXException
{
System.out.println("EndDocument");
}
public void startElement(String name, AttributeList atts)
throws SAXException
{
System.out.println("StartElement:"+name);
for (int i=0;i<atts.getLength();i++)
{
String aname = atts.getName(i);
String type = atts.getType(i);
String value = atts.getValue(i);
System.out.println("   "+aname+"("+type+")"+"="+value);
}
}
...

次のコードは、EntityResolverインタフェースの実装を示します。

public InputSource resolveEntity (String publicId, String systemId)
throws SAXException
{
System.out.println("ResolveEntity:"+publicId+" "+systemId);
System.out.println("Locator:"+locator.getPublicId()+" locator.getSystemId()+
" "+locator.getLineNumber()+" "+locator.getColumnNumber());
return null;
}

次のコードは、DTDHandlerインタフェースの実装を示します。

public void notationDecl (String name, String publicId, String systemId)
{
System.out.println("NotationDecl:"+name+" "+publicId+" "+systemId);
}
public void unparsedEntityDecl (String name, String publicId,
String systemId, String notationName)
{
System.out.println("UnparsedEntityDecl:"+name + " "+publicId+" "+
systemId+" "+notationName);
}

次のコードは、ErrorHandlerインタフェースの実装を示します。

public void warning (SAXParseException e)
throws SAXException
{
System.out.println("Warning:"+e.getMessage());
}
public void error (SAXParseException e)
throws SAXException
{
throw new SAXException(e.getMessage());
}
public void fatalError (SAXParseException e)
throws SAXException
{
System.out.println("Fatal error");
throw new SAXException(e.getMessage());
}

5. 入力XML文書を解析します。次のコード部分は、文書をURLに変換して解析します。

parser.parse(DemoUtil.createURL(argv[0]).toString());

名前空間を使用した基本的なSAX解析の実行

この項では、SAX2Namespace.javaサンプル・プログラムについて説明します。このサンプル・プログラムは、XMLDefaultHandlerというイベント・ハンドラをorg.xml.sax.helpers.DefaultHandlerクラスのサブクラスとして実装します。ContentHandlerインタフェースを実装する最も簡単な方法は、org.xml.sax.helpers.DefaultHandlerクラスを拡張することです。DefaultHandlerクラスは、イベントを処理するためのデフォルトの動作をいくつか提供しますが、一般的な動作は何も行わないことです。

SAX2Namespace.javaプログラムは、対象のイベントに対してのみメソッドをオーバーライドします。具体的には、XMLDefaultHandlerクラスはstartElement()およびendElement()という2つのメソッドのみ実装します。startElementイベントは、SAXParserがXML文書内に新規要素を検出するたびにトリガーされます。このイベントがトリガーされると、startElement()メソッドは要素の名前空間情報を出力します。

SAX2Namespace.javaサンプル・プログラムは次の手順を実行します。

1. DefaultHandler型の新規イベント・ハンドラをインスタンス化します。次のコード部分は、この方法を示します。

DefaultHandler defHandler = new XMLDefaultHandler();

2. SAXパーサーを作成し、その検証モードを設定します。SAXSample.javaの次のコード部分は、モードをDTD検証に設定します。

Parser parser = new SAXParser();
((SAXParser)parser).setValidationMode(SAXParser.DTD_VALIDATION);

3. SAXパーサーにイベント・ハンドラを登録します。次のコード部分は、入力文書、DTD、エンティティおよびエラーのハンドラを登録します。

parser.setContentHandler(defHandler);
parser.setEntityResolver(defHandler);
parser.setDTDHandler(defHandler);
parser.setErrorHandler(defHandler);

次のコードは、XMLDefaultHandler実装を示します。startElement()およびendElement()メソッドは、各要素の修飾名、ローカル名および名前空間URIを出力します(これらの用語の説明は、表4-7を参照)。

class XMLDefaultHandler extends DefaultHandler
{
public void XMLDefaultHandler(){}
public void startElement(String uri, String localName,
String qName, Attributes atts)
throws SAXException
{
System.out.println("ELEMENT Qualified Name:" + qName);
System.out.println("ELEMENT Local Name    :" + localName);
System.out.println("ELEMENT Namespace     :" + uri);

for (int i=0; i<atts.getLength(); i++)
{
qName = atts.getQName(i);
localName = atts.getLocalName(i);
uri = atts.getURI(i);

System.out.println(" ATTRIBUTE Qualified Name   :" + qName);
System.out.println(" ATTRIBUTE Local Name       :" + localName);
System.out.println(" ATTRIBUTE Namespace        :" + uri);

// You can get the type and value of the attributes either
// by index or by the Qualified Name.

String type = atts.getType(qName);
String value = atts.getValue(qName);

System.out.println(" ATTRIBUTE Type             :" + type);
System.out.println(" ATTRIBUTE Value            :" + value);

System.out.println();

}
}
public void endElement(String uri, String localName,
String qName) throws SAXException
{
System.out.println("ELEMENT Qualified Name:" + qName);
System.out.println("ELEMENT Local Name    :" + localName);
System.out.println("ELEMENT Namespace     :" + uri);
}
}

4. 入力XML文書を解析します。次のコード部分は、文書をURLに変換して解析します。

parser.parse(DemoUtil.createURL(argv[0]).toString());

XMLTokenizerを使用したSAX解析の実行

単純なSAXパーサーをXMLTokenizerクラスのインスタンスとして作成し、パーサーを使用して入力XMLをトークン化できます。表4-13に、このクラスの有用なメソッドを示します。

表4-13 XMLTokenizerのメソッド

メソッド

説明

setToken()

XMLトークン化機能の新規トークンを登録します。

setErrorStream()

エラーの出力ストリームを登録します。

tokenize()

入力XMLをトークン化します。

Tokenizer機能のあるSAXパーサーは、XMLTokenインタフェースを実装します。XMLTokenのコールバック・メソッドはtoken()です。このメソッドは、XMLトークンおよび対応する値を受け取り、アクションを実行します。たとえば、トークン名に続いてトークンの値を出力するようにtoken()を実装できます。

Tokenizer.javaプログラムは、入力としてXML文書を受け取って解析し、XMLトークンのリストを出力します。プログラムでは、次の処理を行うdoParse()メソッドを実装します。

1. 入力XMLストリームからURLを作成します。

URL url = DemoUtil.createURL(arg);

2. 次のようにXMLTokenizerパーサーを作成します。

parser  = new XMLTokenizer ((XMLToken)new Tokenizer());

3. 次のように出力エラー・ストリームを登録します。

parser.setErrorStream  (System.out);

4. トークンをパーサーに登録します。Tokenizer.javaの次のコード部分は、登録されたトークンをいくつか示します。

parser.setToken (STagName, true);
parser.setToken (EmptyElemTag, true);
parser.setToken (STag, true);
parser.setToken (ETag, true);
parser.setToken (ETagName, true);
...

5. XML文書を次のようにトークン化します。

parser.tokenize (url);

token()コールバック・メソッドは、特定のトークンが検出されたときに実行するアクションを判断します。Tokenizer.javaの次のコード部分は、このメソッドの実装の一部を示します。

public void token (int token, String value)
{
switch (token)
{
case XMLToken.STag:
System.out.println ("STag: " + value);
break;
case XMLToken.ETag:
System.out.println ("ETag: " + value);
break;
case XMLToken.EmptyElemTag:
System.out.println ("EmptyElemTag: " + value);
break;
case XMLToken.AttValue:
System.out.println ("AttValue: " + value);
break;
...
default:
break;
}
}

JAXPを使用したXMLの解析

JAXPを使用すると、JavaプログラムでSAXおよびDOMパーサーとXSLTプロセッサを使用できます。この項の内容は次のとおりです。

- JAXP APIの使用

- JAXPを使用した解析

- JAXPを使用した基本的な変換の実行

JAXP APIの使用

表4-14に示すJAXP APIは、パーサーをプラガブルにするためのシン・レイヤーを提供する抽象クラスで構成されたAPI構造を持ちます。Oracleは、Sun社のリファレンス実装に基づいてJAXPを実装しています。

表4-14 JAXPパッケージ

パッケージ

説明

javax.xml.parsers

DOM 2.0およびSAX 1.0パーサーの標準APIを提供します。パッケージには、SAXParserおよびDocumentBuilderを提供する、ベンダーに依存しないファクトリ・クラスが含まれています。DocumentBuilderは、DOM準拠のDocumentオブジェクトを作成します。

javax.xml.transform

XML変換の処理と、ソースから結果への変換の実行のための汎用APIを定義します。

javax.xml.transform.dom

DOM固有の変換APIを提供します。

javax.xml.transform.sax

SAX2固有の変換APIを提供します。

javax.xml.transform.stream

ストリーム固有およびURI固有の変換APIを提供します。

JAXPを介したSAX APIの使用

ファクトリ設計パターンに依存して、JAXPを使用して新規SAXパーサー・エンジンを作成できます。図4-6に、基本プロセスを示します。

図4-6 JAXPを使用したSAX解析

JAXPを介したSAXでの解析の基本手順は、次のとおりです。

1. SAXParserFactoryクラスで新規SAXパーサー・ファクトリを作成します。

2. ファクトリを構成します。

3. 新規SAXパーサー(SAXParser)オブジェクトをファクトリから作成します。

4. SAXパーサーのイベント・ハンドラを設定します。

5. 入力XML文書を解析します。

JAXPを介したDOM APIの使用

ファクトリ設計パターンに基づき、JAXPを使用して新規DOM文書ビルダー・エンジンを作成できます。図4-7に、基本プロセスを示します。

図4-7 JAXPを使用したDOM解析

JAXPを介したDOMでの解析の基本手順は、次のとおりです。

1. DocumentBuilderFactoryクラスで新規DOMパーサー・ファクトリを作成します。

2. ファクトリを構成します。

3. 新規DOMビルダー(DocumentBuilder)オブジェクトをファクトリから作成します。

4. DOMビルダーのエラー・ハンドラとエンティティ・リゾルバを設定します。

5. 入力XML文書を解析します。

JAXPを介したXMLの変換

JAXPを介したXML変換の基本手順は、次のとおりです。

1. 新規トランスフォーマ・ファクトリを作成します。TransformerFactoryクラスを使用します。

2. ファクトリを構成します。

3. ファクトリから新規トランスフォーマを作成し、XSLTスタイルシートを指定します。

4. トランスフォーマを構成します。

5. 文書を変換します。

JAXPを使用した解析

JAXPExamples.javaプログラムは、JAXPを使用した解析の基本手順を示します。このプログラムは、次のメソッドを実装し、これらのメソッドを使用して/jaxpディレクトリ内のXMLファイルに対して解析および追加処理を実行します。

- basic()

- identity()

- namespaceURI()

- templatesHandler()

- contentHandler2contentHandler()

- contentHandler2DOM()

- reader()

- xmlFilter()

- xmlFilterChain()

プログラムでは、サンプルXMLファイルjaxpone.xmlおよびjaxpone.xslのURLを作成し、前述のメソッドを順番にコールします。デモの基本設計は次のとおりです(スペースを節約するために、basic()メソッドのみ示しています)。

public class JAXPExamples
{
public static void main(String argv[])
throws TransformerException, TransformerConfigurationException,
IOException, SAXException, ParserConfigurationException,
FileNotFoundException
{
try {
URL xmlURL = createURL("jaxpone.xml");
String xmlID = xmlURL.toString();
URL xslURL = createURL("jaxpone.xsl");
String xslID = xslURL.toString();
//
System.out.println("--- basic ---");
basic(xmlID, xslID);
System.out.println();
...
} catch(Exception err) {
err.printStackTrace();
}
}
//
public static void basic(String xmlID, String xslID)
throws TransformerException, TransformerConfigurationException
{
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer(new StreamSource(xslID));
StreamSource source = new StreamSource(xmlID);
transformer.transform(source, new StreamResult(System.out));
}
...
}

JAXPExamples.javaプログラムのreader()メソッドは、SAXを使用してXML文書を解析するための簡単な方法を示します。次の手順が実行されます。

1. TransformerFactoryの新規インスタンスを作成し、SAXTransformerFactoryにキャストします。アプリケーションでは、SAXファクトリを使用して、SAXパーサー・インスタンスを構成および取得できます。次に例を示します。

TransformerFactory tfactory = TransformerFactory.newInstance();
SAXTransformerFactory stfactory = (SAXTransformerFactory)tfactory;

2. スタイルシートからStreamSourceオブジェクトを作成し、それをファクトリ・メソッドnewXMLFilter()に渡すことにより、XMLリーダーを作成します。このメソッドは、指定されたSourceを変換命令として使用するXMLFilterオブジェクトを戻します。次に例を示します。

URL xslURL = createURL("jaxpone.xsl");
String xslID = xslURL.toString();
...
StreamSource streamSource = new StreamSource(xslID);
XMLReader reader = stfactory.newXMLFilter(streamSource);

3. コンテンツ・ハンドラを作成し、XMLリーダーに登録します。次の例では、クラスoraContentHandlerのインスタンスを作成します。このインスタンスは、デモ・ディレクトリ内のoraContentHandler.javaプログラムをコンパイルすることで作成されます。

ContentHandler contentHandler = new oraContentHandler();
reader.setContentHandler(contentHandler);

次のコード部分は、oraContentHandlerクラスの実装の一部を示します。

public class oraContentHandler implements ContentHandler
{
private static final String TRADE_MARK = "Oracle 9i ";

public void setDocumentLocator(Locator locator)
{
System.out.println(TRADE_MARK + "- setDocumentLocator");
}

public void startDocument()
throws SAXException
{
System.out.println(TRADE_MARK + "- startDocument");
}

public void endDocument()
throws SAXException
{
System.out.println(TRADE_MARK + "- endDocument");
}
...

4. InputSourceをXMLReader.parse()メソッドに渡すことにより、入力XML文書を解析します。次に例を示します。

InputSource is = new InputSource(xmlID);
reader.parse(is);

JAXPを使用した基本的な変換の実行

JAXPを使用して、インタフェースSourceの任意のクラスをインタフェースResultのクラスに変換できます。表4-15に、いくつかの変換例を示します。

表4-15 JAXPを使用したクラスの変換

JAXPを使用して変換するクラス . .

変換先クラス . .

DOMSource

DOMResult

StreamSource

StreamResult

SAXSource

SAXResult

これらの変換は、次のタイプの入力を受け入れます。

- XML文書

- スタイルシート

- oraContentHandler.javaで定義されたContentHandlerクラス

たとえば、identity()メソッドを使用して、出力XML文書が入力XML文書と同じになる変換を実行できます。xmlFilterChain()メソッドを使用して、連鎖内の3つのスタイルシートを適用できます。

basic()メソッドは、基本的なXSLT変換の実行方法を示します。メソッドは次の手順を実行します。

1. TransformerFactoryの新規インスタンスを作成します。次に例を示します。

TransformerFactory tfactory = TransformerFactory.newInstance();

2. ファクトリから新規XSLトランスフォーマを作成し、変換に使用するスタイルシートを指定します。次の例では、jaxpone.xslスタイルシートを指定します。

URL xslURL = createURL("jaxpone.xsl");
String xslID = xslURL.toString();
. . .
Transformer transformer = tfactory.newTransformer(new StreamSource(xslID));

3. ストリーム・ソースを入力XML文書に設定します。basic()メソッドの次の部分は、ストリーム・ソースをjaxpone.xmlに設定します。

URL xmlURL = createURL("jaxpone.xml");
String xmlID = xmlURL.toString();
. . .
StreamSource source = new StreamSource(xmlID);

4. StreamSourceの文書をStreamResultに変換します。次の例では、StreamSourceをStreamResultに変換します。

transformer.transform(source, new StreamResult(System.out));

XMLの圧縮

Oracle XDKでは、SAXまたはDOMを使用してXMLを解析し、解析したデータを圧縮バイナリ・ストリームに書き込むことができます。次に、プロセスを反転し、XMLデータを再構築できます。この項の内容は次のとおりです。

- DOMからXMLへの圧縮と解凍

- SAXからXMLへの圧縮と解凍

DOMからXMLへの圧縮と解凍

DOMCompression.javaおよびDOMDeCompression.javaプログラムは、DOMの圧縮と解凍の基本手順を示します。最も重要なDOM圧縮メソッドは次のとおりです。

- XMLDocument.writeExternal()は、オブジェクトに関する情報でバイナリ圧縮ストリームを作成することにより、オブジェクトの状態を保存します。

- XMLDocument.readExternal()は、writeExternal()メソッドにより圧縮ストリームに書き込まれた情報を読み取り、オブジェクトを復元します。

DOMオブジェクトの圧縮

シリアライズの基本的な方法は、XML文書を解析してXMLDocumentを作成し、ObjectOutputStreamを初期化し、さらにXMLDocument.writeExternal()をコールして圧縮ストリームを書き込むことです。

DOMCompression.javaプログラムは次の手順を実行します。

1. DOMパーサーを作成し、入力XML文書を解析し、DOM表現を取得します。この方法は、「基本的なDOM解析の実行」で説明しています。DOMCompression.javaの次のコード部分は、この方法を示します。

public class DOMCompression
{
static OutputStream out = System.out;
public static void main(String[] args)
{
XMLDocument doc = new XMLDocument();
DOMParser parser = new DOMParser();
try
{
parser.setValidationMode(XMLParser.SCHEMA_VALIDATION);
parser.setPreserveWhitespace(false);
parser.retainCDATASection(true);
parser.parse(createURL(args[0]));
doc = parser.getDocument();
...

2. FileOutputStreamを作成し、シリアライズのためにObjectOutputStreamにラップします。次のコード部分は、xml.ser出力ファイルを作成します。

OutputStream os = new FileOutputStream("xml.ser");
ObjectOutputStream oos = new ObjectOutputStream(os);

3. XMLDocument.writeExternal()をコールして、オブジェクトをファイルにシリアライズします。このメソッドは、このオブジェクトに関する情報でバイナリ圧縮ストリームを作成することにより、オブジェクトの状態を保存します。この方法を示す文は次のとおりです。

doc.writeExternal(oos);

DOMオブジェクトの解凍

解凍の基本的な方法は、ObjectInputStreamオブジェクトを作成し、XMLDocument.readExternal()をコールして圧縮ストリームを読み取ることです。DOMDeCompression.javaプログラムは次の手順を実行します。

1. 圧縮ファイルのファイル入力ストリームを作成し、ObjectInputStreamにラップします。DOMDeCompression.javaの次のコード部分は、前の項で作成した圧縮ファイルからFileInputStreamを作成します。

InputStream is;
ObjectInputStream ois;
...
is = new FileInputStream("xml.ser");
ois = new ObjectInputStream(is);

2. 新規XML文書オブジェクトを作成して、解凍したデータを格納します。次のコード部分は、この方法を示します。

XMLDocument serializedDoc = null;
serializedDoc = new XMLDocument();

3. XMLDocument.readExternal()をコールして、圧縮ファイルを読み取ります。次のコード部分は、データを読み取ってSystem.outに出力します。

serializedDoc.readExternal(ois);
serializedDoc.print(System.out);

SAXからXMLへの圧縮と解凍

SAXCompression.javaプログラムは、SAXを使用してファイルを解析し、圧縮ストリームをファイルに書き込み、シリアライズしたデータをファイルから読み取る基本手順を示します。重要なクラスは次のとおりです。

- CXMLHandlerBaseは、SAXイベントに基づいてXMLデータを圧縮するSAX Handlerです。SAX圧縮を使用するには、このインタフェースを実装し、Parser.setDocumentHandler()をコールしてSAXパーサーに登録します。

- CXMLParserは、圧縮ストリームからSAXイベントを再生成するXMLパーサーです。

SAXオブジェクトの圧縮

シリアライズの基本的な方法は、SAXパーサーにCXMLHandlerBaseハンドラを登録し、ObjectOutputStreamを初期化し、入力XMLを解析することです。SAXCompression.javaプログラムは次の手順を実行します。

1. FileOutputStreamを作成し、ObjectOutputStreamにラップします。SAXCompression.javaの次のコード部分は、xml.serファイルを作成します。

String compFile = "xml.ser";
FileOutputStream outStream = new FileOutputStream(compFile);
ObjectOutputStream out = new ObjectOutputStream(outStream);

2. SAXイベント・ハンドラを作成します。CXMLHandlerBaseクラスは、ContentHandler、DTDHandler、EntityResolverおよびErrorHandlerインタフェースを実装します。次のコード部分は、この方法を示します。

CXMLHandlerBase cxml = new CXMLHandlerBase(out);

3. SAXパーサーを作成します。次のコード部分は、この方法を示します。

SAXParser parser = new SAXParser();

4. SAXパーサーを構成します。次のコード部分は、コンテンツ・ハンドラとエンティティ・リゾルバを設定し、検証モードも設定します。

parser.setContentHandler(cxml);
parser.setEntityResolver(cxml);
parser.setValidationMode(XMLConstants.NONVALIDATING);

oracle.xml.comp.CXMLHandlerBaseはDocumentHandlerとContentHandlerの両方のインタフェースを実装しますが、SAX 2.0 ContentHandlerインタフェースの使用が推奨されることに注意してください。

5. XMLを解析します。プログラムは、シリアライズされたデータをObjectOutputStreamに書き込みます。次のコード部分は、この方法を示します。

parser.parse(url);

SAXオブジェクトの解凍

SAXオブジェクトの非シリアライズの基本的な方法は、CXMLParserクラスを使用してSAX圧縮パーサーを作成し、パーサーのコンテンツ・ハンドラを設定し、圧縮ストリームを解析することです。

SAXDeCompression.javaプログラムは次の手順を実行します。

1. SAXイベント・ハンドラを作成します。SampleSAXHandler.javaプログラムは、SAXDeCompression.javaで使用するハンドラを作成します。SAXDeCompression.javaの次のコード部分は、ハンドラ・オブジェクトを作成します。

SampleSAXHandler xmlHandler = new SampleSAXHandler();

2. CXMLParserクラスをインスタンス化することにより、SAXパーサーを作成します。このクラスは、圧縮ストリームからSAXイベントを生成することにより、その圧縮ストリームからのXML文書の再生成を実装します。次のコード部分は、この方法を示します。

CXMLParser parser = new CXMLParser();

3. SAXパーサーのイベント・ハンドラを設定します。次のコード部分は、この方法を示します。

parser.setContentHandler(xmlHandler);

4. 圧縮ストリームを解析し、SAXイベントを生成します。次のコードは、コマンドラインからファイル名を受け取り、XMLを解析します。

parser.parse(args[0]);

XML解析のヒントと方法

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

- DOMツリーからのノード値の抽出

- appendChild()を使用した文書のマージ

- DTDの解析

- XML Parserでのキャラクタ・セットの処理

DOMツリーからのノード値の抽出

XMLNodeクラスのselectNodes()メソッドを使用して、XSLが許可する選択パターンに基づいてDOMツリーまたはサブツリーからコンテンツを抽出できます。selectNodes()のオプションの2つ目のパラメータを使用して、名前空間の接頭辞を解決できます。つまり、接頭辞付きの展開された名前空間URLを戻します。XMLElementクラスはNSResolverを実装するため、XMLElementオブジェクトの参照は、2つ目のパラメータとして送信できます。XMLElementは、入力文書に基づいて接頭辞を解決します。名前空間の定義をオーバーライドする必要がある場合、NSResolverインタフェースを使用できます。

例4-4のサンプル・コードに、selectNodes()の使用方法を示します。

例4-4 selectNodes()を使用したDOMツリーのコンテンツの抽出

//
// selectNodesTest.java
//
import java.io.*;
import oracle.xml.parser.v2.*;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class selectNodesTest
{
public static void main(String[] args)
throws Exception
{
// supply an xpath expression
String pattern = "/family/member/text()";
// accept a filename on the command line
// run the program with $ORACLE_HOME/xdk/demo/java/parser/common/family.xml
String file    = args[0];

if (args.length == 2)
pattern = args[1];

DOMParser dp = new DOMParser();

dp.parse(DemoUtil.createURL(file));  // include createURL from DemoUtil
XMLDocument xd = dp.getDocument();
XMLElement element = (XMLElement) xd.getDocumentElement();
NodeList nl = element.selectNodes(pattern, element);
for (int i = 0; i < nl.getLength(); i++)
{
System.out.println(nl.item(i).getNodeValue());
} // end for
} // end main
} // end selectNodesTest

プログラムをテストするには、例4-4のコードを使用してファイルを作成してから、$ORACLE_HOME/xdk/demo/java/parser/commonディレクトリ内でコンパイルします。ファイル名family.xmlをパラメータとしてプログラムに渡して、<family>ツリーを検索します。出力は次のようになります。

% java selectNodesTest family.xml
Sarah
Bob
Joanne
Jim

ここで、次のコードを実行して、文書内のすべての<member>要素のmemberid属性の値を判断します。

% java selectNodesTest family.xml //member/@memberid
m1
m2
m3
m4

appendChild()を使用した文書のマージ

ユーザーがクライアント側Javaフォームに入力でき、XML文書を取得できるように、プログラムを作成する必要があると想定します。Javaプログラムには、String型の次の変数が含まれているとします。

String firstname = "Gianfranco";
String lastname = "Pietraforte";

次のいずれかの方法を使用して、この情報をXML文書に挿入できます。

- XML文書を文字列で作成し、解析します。次に例を示します。

String xml = "<person><first>"+firstname+"</first>"+
"<last>"+lastname+"</last></person>";
DOMParser d = new DOMParser();
d.parse(new StringReader(xml));
Document xmldoc = d.getDocument();

- DOM APIを使用して、要素を作成して順番に追加することによりXML文書を作成します。次に例を示します。

Document xmldoc = new XMLDocument();
Element e1 = xmldoc.createElement("person");
xmldoc.appendChild(e1);
Element e2 = xmldoc.createElement("firstname");
e1.appendChild(e2);
Text t = xmldoc.createText("Larry");
e2.appendChild(t);

単一のDOMツリーでは2番目の方法のみ使用できることに注意してください。たとえば、例4-5に抜粋したコードを記述するとします。

例4-5 appendChild()の不適切な使用方法

XMLDocument xmldoc1 = new XMLDocument();
XMLElement e1 = xmldoc1.createElement("person");
XMLDocument xmldoc2 = new XMLDocument();
XMLElement e2 = xmldoc2.createElement("firstname");
e1.appendChild(e2);

前述のコードでは、e1の所有者文書がxmldoc1で、e2の所有者がxmldoc2であるため、XMLElement.appendChild()をコールしたときにWRONG_DOCUMENT_ERRのDOM例外が発生します。appendChild()メソッドは単一ツリー内でのみ動作しますが、例4-5では2つの異なるツリーを使用しています。

異なるXML文書間におけるDOM文書のフラグメントまたはDOMノードのコピーおよび貼付けには、DOM 2で導入されたXMLDocument.importNode()メソッドおよびDOM 3で導入されたXMLDocument.adoptNode()メソッドを使用できます。例4-6のコマンドラインは、このタスクの実行方法を示しています。

例4-6 appendChild()を使用した文書のマージ

XMLDocument doc1 = new XMLDocument();
XMLElement element1 = doc1.createElement("person");
XMLDocument doc2 = new XMLDocument();
XMLElement element2 = doc2.createElement("firstname");
// element2 = doc1.importNode(element2);
// element2 = doc1.adoptNode(element2);
element1.appendChild(element2);

DTDの解析

この項では、DTDの解析方法について説明します。内容は次のとおりです。

- 外部DTDのロード

- setDoctypeによるDTDのキャッシュ

外部DTDのロード

DOMParser.parse()メソッドをコールしてXML文書をInputStreamとして解析する場合は、DOMParser.setBaseURL()メソッドを使用してJavaプログラム内の外部DTDを認識します。このメソッドは、DTDが公開されている場所を指します。

DTDをロードして解析する方法を次の手順で説明します。

1. DTDをInputStreamとしてロードします。たとえば、/mydir/my.dtd外部DTDに対して文書が妥当であるかどうかを検証する必要があるとします。次のコードを使用できます。

InputStream is = MyClass.class.getResourceAsStream("/mydir/my.dtd");

このコードによって、DTDが指定されているCLASSPATH上の最初の相対位置にある./mydir/my.dtdが開かれます。JARファイルがCLASSPATHにある場合は、そのJARファイルも開かれます。

2. DOMパーサーを作成し、検証モードを設定します。たとえば、次のコードを使用します。

DOMParser d = new DOMParser();
d.setValidationMode(DTD_VALIDATION);

3. DTDを解析します。次の例では、InputStreamオブジェクトをDOMParser.parseDTD()メソッドに渡します。

d.parseDTD(is, "rootelementname");

4. 文書タイプを取得し、設定します。getDoctype()メソッドはDTDオブジェクトを取得し、setDoctype()メソッドは解析に使用するDTDを設定します。次の例に、この方法を示します。

d.setDoctype(d.getDoctype());

次のコードは、別の方法を示しています。parseDTD()メソッドを起動して、DTDファイルを個別に解析し、DTDオブジェクトを取得できます。

d.parseDTD(new FileReader("/mydir/my.dtd"));
DTD dtd = d.getDoctype();
parser.setDoctype(dtd);

5. 入力XML文書を解析します。たとえば、次のコードはmydoc.xmlを解析します。

d.parse("mydoc.xml");

setDoctypeによるDTDのキャッシュ

XML Parser for Javaには、DOMParser.setDoctype()メソッドを使用した検証モードと非検証モードでのDTDキャッシュ機能が用意されています。このメソッドでDTDを設定すると、パーサーはこのDTDをキャッシュして、さらに解析を実行します。DTDキャッシュ機能はオプションであり、自動的には有効にならないことに注意してください。

プログラムで、同じDTDを使用して複数のXML文書を解析する必要があると想定します。XML文書の解析後、次の例のようにパーサーからDTDを取得し、設定できます。

DOMParser parser = new DOMParser();
DTD dtd = parser.getDoctype();
parser.setDoctype(dtd);

パーサーはこのDTDをキャッシュして、後続のXML文書の解析に使用します。例4-7に、DOMParser.setDoctype()を起動してDTDをキャッシュする方法の詳細な例を示します。

例4-7 DTDSample.java

/**
* DESCRIPTION
* This program illustrates DTD caching.
*/

import java.net.URL;
import java.io.*;
import org.xml.sax.InputSource;
import oracle.xml.parser.v2.*;

public class DTDSample
{
static public void main(String[] args)
{
try
{
if (args.length != 3)
{
System.err.println("Usage: java DTDSample dtd rootelement xmldoc");
System.exit(1);
}

// Create a DOM parser
DOMParser parser = new DOMParser();

// Configure the parser
parser.setErrorStream(System.out);
parser.showWarnings(true);

// Create a FileReader for the DTD file specified on the command
// line and wrap it in an InputSource
FileReader r = new FileReader(args[0]);
InputSource inSource = new InputSource(r);

// Create a URL from the command-line argument and use it to set the
// system identifier
inSource.setSystemId(DemoUtil.createURL(args[0]).toString());

// Parse the external DTD from the input source. The second argument is
// the name of the root element.
parser.parseDTD(inSource, args[1]);
DTD dtd = parser.getDoctype();

// Create a FileReader object from the XML document specified on the
// command line
r = new FileReader(args[2]);

// Wrap the FileReader in an InputSource, create a URL from the filename,
// and set the system identifier
inSource = new InputSource(r);
inSource.setSystemId(DemoUtil.createURL(args[2]).toString());

// ********************
parser.setDoctype(dtd);
// ********************

parser.setValidationMode(DOMParser.DTD_VALIDATION);
// parser.setAttribute(DOMParser.USE_DTD_ONLY_FOR_VALIDATION,Boolean.TRUE);
parser.parse(inSource);

// Obtain the DOM tree and print
XMLDocument doc = parser.getDocument();
doc.print(new PrintWriter(System.out));

}
catch (Exception e)
{
System.out.println(e.toString());
}
}
}

キャッシュされたDTDオブジェクトが検証に対してのみ使用される場合は、DOMParser.USE_DTD_ONLY_FOR_VALIDATION属性を設定します。DTDオブジェクトが検証に使用されない場合、XMLパーサーはDTDオブジェクトをコピーして、結果のDOMツリーに追加します。パーサーを次のように設定できます。

parser.setAttribute(DOMParser.USE_DTD_ONLY_FOR_VALIDATION,Boolean.TRUE);

XML Parserでのキャラクタ・セットの処理

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

- オペレーティング・システム上でのXMLファイルの検出およびエンコーディング

- NCLOB列に格納されたXMLのエンコーディングの検出

- デフォルト以外のエンコーディングでのXMLファイルの作成

- 文字列内のXMLの操作

- アクセント付き文字を含むXML文書の解析

- タグ名内の特殊文字の処理

オペレーティング・システム上でのXMLファイルの検出およびエンコーディング

オペレーティング・システム・ファイルに格納されたXMLファイルを読み取る場合は、FileReaderクラスを使用しないでください。かわりにXMLパーサーを使用して、文書の文字のエンコーディングが自動的に検出されるようにします。外部エンコーディング情報がないバイナリFileInputStreamの場合、パーサーは、バイト・オーダー・マークおよびXML文書のエンコーディング宣言に基づいて、文字のエンコーディングを自動的に判断します。AutoDetectEncoding.javaデモのサンプル・コードを使用して、サポートされている任意のエンコーディングでの任意の整形式文書を解析できます。このデモは、$ORACLE_HOME/xdk/demo/java/parser/domにあります。

注意:
仕様のとおりに、ドキュメント内で適切なエンコーディング宣言を含めます。setEncoding()では、入力ドキュメントのエンコーディングを設定できません。かわりに、出力に正しいエンコーディングを設定するためにoracle.xml.parser.v2.XMLDocumentで使用されます。

NCLOB列に格納されたXMLのエンコーディングの検出

UTF-8エンコーディングを使用して、XMLをデータベースのNCLOB列にロードするとします。XMLには、2つのUTF-8マルチバイト文字が含まれています。

G(0xc2,0x82)otingen, Br(0xc3,0xbc)ck_W

次の処理を行うJavaストアド・ファンクションを作成します。

1. デフォルトの接続オブジェクトを使用して、データベースに接続します。

2. SELECT問合せを実行します。

3. oracle.jdbc.OracleResultSetオブジェクトを取得します。

4. OracleResultSet.getCLOB()メソッドをコールします。

5. CLOBオブジェクトに対してgetAsciiStream()メソッドをコールします。

6. 次のコードを実行してXMLをDOMオブジェクトに変換します。

DOMParser parser = new DOMParser();
parser.setPreserveWhitespace(true);
parser.parse(istr);
// istr getAsciiStream XMLDocument xmldoc = parser.getDocument();

プログラムは、文字(0xc2、0x82)が有効なUTF-8であっても、XMLに無効なUTF-8エンコーディングが含まれているということを示す例外をスローします。問題は、プログラムがOracleResultSet.getAsciiStream()メソッドをコールするときに文字に異常が発生する可能性があることです。この問題を解決するには、getAsciiStream()のかわりに、getUnicodeStream()およびgetBinaryStream()メソッドを起動します。この方法が機能しない場合は、DOMParser.parse(istr)をコールする際に文字がパーサーに送信される前に、文字が異常でないことを確認するために出力してみてください。

デフォルト以外のエンコーディングでのXMLファイルの作成

FileWriterクラスは、実行時環境のデフォルトの文字エンコーディングに依存するため、XMLファイルを作成するときに、このクラスを使用しないでください。ドキュメントにデフォルトの文字エンコーディングで使用できない文字が含まれる場合、出力ファイルでは、解析エラーやデータの損失が発生する可能性があります。

UTF-8エンコーディングはXML文書には一般的ですが、UTF-8は、通常はJavaのデフォルトのファイル・エンコーディングではありません。デフォルトのファイル・エンコーディングを想定したJavaクラスをプログラムで使用すると、問題が発生する可能性があります。これらの問題を回避するために、$ORACLE_HOME/xdk/demo/java/parser/domのI18nSafeXMLFileWritingSample.javaプログラムに示されている方法を使用できます。

特殊文字の出力にはSystem.out.println()を使用できないことに注意してください。OutputStreamWriterなど、エンコーディングを識別するバイナリ出力ストリームを使用する必要があります。次の例のように、OutputStreamWriterを構築し、write(char[], int, int)メソッドを使用して出力できます。

/* Java encoding string for ISO8859-1*/
OutputStreamWriter out = new OutputStreamWriter(System.out, "8859_1");
OutputStreamWriter.write(...);

文字列内のXMLの操作

Stringに含まれているXML文書を直接解析する方法は現在はありません。文字列は、解析する前にInputStreamまたはInputSourceオブジェクトに変換する必要があります。

1つの方法は、文字列内のバイトを使用するByteArrayInputStreamを生成することです。たとえば、xmlDocがXMLの文字列への参照であると想定します。例4-8に示す方法を使用して、文字列をバイト配列に変換し、配列をByteArrwayInputStreamに変換してから解析できます。

例4-8 文字列内のXMLの変換

// create parser
DOMParser parser=new DOMParser();
// create XML document in a string
String xmlDoc =
"<?xml version='1.0'?>"+
"<hello>"+
"  <world/>"+
"</hello>";
// convert string to bytes to stream
byte aByteArr [] = xmlDoc.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(aByteArr,0,aByteArr.length);
//  parse and obtain DOM tree
DOMParser.parse(bais);
XMLDocument doc = parser.getDocument();

前述のコードで作成したXMLDocumentオブジェクトを再び文字列に変換するとします。このタスクは、PrintWriterにStringWriterをラップすることで実行できます。次の例に、この方法を示します。

StringWriter sw = new StringWriter();
PrintWriter  pw = new PrintWriter(sw);
doc.print(pw);
String YourDocInString = sw.toString();

$ORACLE_HOME/xdk/demo/java/parser/domにあるParseXMLFromString.javaは、XML文書を文字列として作成し、それを解析する完全なプログラムです。

アクセント付き文字を含むXML文書の解析

入力XMLファイルに、éなどのアクセント付き文字が含まれているとします。例4-9に、アクセント付き文字を含むXML文書の解析方法の1つを示します。

例4-9 アクセント付き文字を含む文書の解析

DOMParser parser=new DOMParser();
parser.setPreserveWhitespace(true);
parser.setErrorStream(System.err);
parser.setValidationMode(false);
parser.showWarnings(true);
parser.parse (new FileInputStream(new File("file_with_accents.xml")));

XMLファイルを解析しようとすると、パーサーによって、無効なUTF8エンコーディングであるという例外がスローされることがあります。エンコーディングを明示的にUTF-8に設定した場合、またはエンコーディングを指定しない場合、パーサーはアクセント付き文字(127より大きいASCII値の文字)をUTF-8マルチバイト文字列の最初のバイトとして解析します。後続のバイトが有効なUTF-8文字列を構成していない場合、エラーが発生します。

このエラーは、XMLエディタがファイルをUTF-8エンコーディングを使用して保存していないことを意味します。たとえば、エディタはISO 8859-1エンコーディングを使用してファイルを保存している場合があります。エンコーディングはUnicodeの文字番号表現をディスクに書き込むために使用される特定のスキーマです。次の要素をXML文書の最上部に追加しても、エディタはファイルを表すバイトをUTF-8エンコーディングを使用してディスクに書き出しません。

<?xml version="1.0" encoding="UTF-8"?>

1つの解決策として、アクセント付き文字は、XML文書内で&#xd9;のように16進または10進フォーマットで表すと読み取ることができます。ただし、この方法を使用しない場合は、XMLファイルの作成時に使用したキャラクタ・セットに基づいてエンコーディングを設定できます。たとえば、使用しているツールまたはオペレーティング・システムに応じて、エンコーディングをISO-8859-1(Western European ASCII)またはそれ以外に設定してみてください。

タグ名内の特殊文字の処理

&、$、#などの特殊文字はタグ名として有効ではありません。たとえば、文書が会社名に基づいた名前をタグに付けていて、文書にタグ<A&B>が含まれる場合、パーサーは無効な文字に関するエラーを発行します。

XML文書を最初から作成する場合は、有効なNameCharsのみを使用すると、この問題を回避できます。たとえば、タグに<A_B>、<AB>、<A_AND_B>などの名前を付けることができます。ただし、データベース表などの外部データ・ソースからXMLを生成する場合、XML 1.0はこの問題に対応していません。

データ型XMLTypeは、DBMS_XMLGENパッケージでsetConvertSpecialCharsおよびconvertファンクションを提供することで、この問題に対処しています。これらのファンクションを使用して、SQL名とXML名の特殊文字の使用を制御できます。SQLからXMLに名前をマップする機能によって、_XHHHH_という形式(HHHHは無効な文字のUnicode値)の無効なXML NameChar文字がエスケープされます。たとえば、表名V$SESSIONはXMLの名前V_X0024_SESSIONにマップされます。

無効な文字のエスケープも、名前を他の場所に再ロードできるようにシリアライズする方法をユーザーに提供する有効な手段です。

5 バイナリXML for Javaの使用

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

- バイナリXML for Javaの概要

- バイナリXMLの使用モデル

- バイナリXML for Javaの各部分

- バイナリXMLボキャブラリ管理

- JavaバイナリXMLパッケージの使用

バイナリXML for Javaの概要

バイナリXMLは、Oracle 11gリリース1(11.1)で導入された機能です。バイナリXMLを使用すると、XMLテキストと圧縮バイナリXMLの間でのエンコードおよびデコードが可能になります。効率を考慮して、DOMおよびSAX APIは、XMLアプリケーションが直接使用できるようにバイナリXMLの上位にあります。XML文書のフラグメントの圧縮と解凍により、インクリメンタル処理が促進されます。

この章では、XML Parser for Javaを十分に理解していると想定します。

関連項目:
第4章「XML Parsing for Java」

バイナリXML格納形式

XMLType記憶域オプションは、XML文書を新しいバイナリ形式で格納するために提供されています。この新しい記憶域オプションは、既存のCLOBオプションおよびオブジェクト・リレーショナル記憶域オプションに追加されるものです。新しいバイナリXML記憶域オプションを使用して、XMLTypeの表および列を作成することができます。バイナリ形式のXMLデータは、XMLType上で動作するすべての既存のSQL演算子および関数、およびPL/SQL APIでアクセスおよび操作することができます。

バイナリXMLは、XMLデータの簡潔なXMLスキーマ対応エンコーディングですが、XMLスキーマに基づいていないXMLデータで使用することもできます。データベース外にあるXMLデータについても(たとえばクライアント側アプリケーションで)バイナリXMLを使用することができます。バイナリXMLを使用すると、テキストからバイナリ、およびバイナリからテキストへのXML文書のエンコーディングおよびデコーディングが可能です。バイナリXMLはネイティブなデータベース・データ型を持つ解析後の永続的なXMLです。

バイナリXMLでは、非構造化記憶域より効率的なデータベースの格納、更新、索引付け、問合せ性能およびフラグメント抽出が可能です。データとメタデータは一緒に、または分けて格納することができます。

バイナリXMLプロセッサ

バイナリXMLプロセッサとは、バイナリXML形式をテキストに、またXMLテキストをバイナリXML形式に処理および変換するコンポーネントを説明する抽象語です。スキーマを格納するためのキャッシュも提供されます。バイナリXMLプロセッサのベース・クラスはBinXMLProcessorです。バイナリXMLプロセッサでは、ネットワーク・プロトコル・リクエストを発信または受信できます。

バイナリXMLの使用モデル

バイナリXML for Javaにはいくつかの使用モデルがあります。最初に用語集を示します。

バイナリXMLの用語集

次にバイナリXMLの使用方法に関する用語集を示します。

- 文書ID: エンコード済の各XML文書は、一意の文書IDにより識別されます。これは、16バイトのグローバル・ユーザーID (GUID)またはURLなどの不透明なバイト列です。

- トークン表: テキストXML文書に、関連付けられたスキーマがない場合、繰返し項目の容量を最小化するためにトークン(または記号)表が使用されます。

- ボキャブラリID: スキーマID、またはトークン表の名前空間URI識別です。

- スキーマID: バイナリXMLプロセッサを有効範囲とするスキーマの一意の不透明なバイナリID。スキーマIDはバイナリXMLプロセッサに対して一意で、そのバイナリXMLプロセッサの有効範囲内でのみ識別可能です。スキーマIDは、スキーマが拡張された場合も不変です。スキーマIDは、インポートされたスキーマやインクルードされたスキーマなどを含むスキーマ文書セットの全体を表します。

- スキーマ・バージョン: 注釈付きのスキーマにはすべて、それに関連付けられたバージョン番号があります。バージョン番号はシステム・レベルの注釈の一部として指定されます。スキーマが拡張されると(つまり、同一のスキーマの新しいバージョンがそのバイナリXMLプロセッサに登録されると)、バイナリXMLプロセッサによって増分されます。

- 部分妥当性: バイナリXMLのスキーマを使用するストリーム・エンコーディングは、スキーマに関する少なくとも部分妥当性を前提としています。部分妥当性には、一意のキー、キー参照、IDまたはIDREFに関する検証は含まれません。

スタンドアロン・モデル

これはバイナリXMLの最も単純な使用例です。単一のバイナリXMLプロセッサがあります。使用可能な唯一のリポジトリは、永続的でなく、バイナリXMLプロセッサが存在する間のみ使用できる、ローカルなインメモリー・ボキャブラリ・キャッシュです。すべてのスキーマはあらかじめエンコーディング前にバイナリXMLプロセッサに登録される必要がありますが、XMLプロセッサがxsi:SchemaLocationタグを認識したときに自動登録させることもできます。デコーディングの場合、スキーマはボキャブラリ・キャッシュですでに使用可能です。

異なるバイナリXMLプロセッサでデコーディングが発生する場合は、ここで説明する様々なWebサービスを参照してください。

クライアントサーバー・モデル

この使用例では、バイナリXMLプロセッサはJDBCを使用してデータベースに接続しています。スキーマがエンコーディングの前にデータベースで登録されていると想定します。

その実行方法の例を次に示します。

BEGIN
DBMS_XMLSCHEMA.registerSchema(
SCHEMAURL =>
'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd',
SCHEMADOC =>
bfilename('XMLDIR','purchaseOrder.xsd'),
CSID => nls_charset_id('AL32UTF8'),
GENTYPES => FALSE,
OPTIONS => REGISTER_BINARYXML );
END;
/

データに対して別個の接続が指定(associateDataConnection()を使用)されているのでなければ、エンコーディングでもデコーディングでも同じ接続を使用してすべてのデータとメタデータが格納および取得されるとします。

リポジトリを使用したWebサービス・モデル

このシナリオでは複数のクライアントがあり、それぞれでバイナリXMLプロセッサが実行されています。エンコーディングするクライアントとデコーディングするクライアントは異なります。メタデータを格納するための、すべてのクライアントに接続された共有リポジトリ(データベースでなくてもかまいません)があります。これはファイル・システムでも何か他のリポジトリでもかまいません。最初のバイナリXMLプロセッサは、エンコーディングを実行する前に、スキーマがリポジトリに登録されるか、エンコーディング時にxsi:schemaLocationタグを使用してスキーマが自動的に登録されることを保証します。2番目のバイナリXMLプロセッサはデコーディングに使用され、スキーマの場所を認識しません。スキーマはリポジトリからフェッチします。

最初のバイナリXMLプロセッサがスキーマを登録し、2番目のバイナリXMLプロセッサが同一のスキーマをリポジトリに登録すると、バイナリXMLプロセッサはスキーマをコンパイルしないで、ローカルなボキャブラリ・キャッシュにある、既存のコンパイル済スキーマのvocabulary-idを戻します。

BinXMLProcessorはスレッド・セーフではないため、リポジトリにアクセスする複数のスレッドまたはクライアントは独自のセーフティ・スキームを実装する必要があります。

リポジトリを使用しないWebサービス・モデル

このシナリオでは複数のクライアントがあり、それぞれでバイナリXMLプロセッサが実行されています。エンコーディングとデコーディングが異なったクライアント上で発生する可能性があります。共有メタデータ・リポジトリはありません。エンコーダは、次のクライアントに渡されたバイナリ・データがスキーマに依存しない、つまりインライン・トークン定義を持っていることを保証する必要があります。そうするには、エンコード時にsetProperty()メソッドを使用してschemaAware = false、およびinlineTokenDefs = trueと設定します。デコーディング時にスキーマは必要ありません。

バイナリXML for Javaの各部分

Java XMLバイナリ機能には次の3つの部分があります。

- バイナリXMLエンコーディング - バイナリXMLエンコーダはXML 1.0 infosetをバイナリXMLに変換します。

- BバイナリXMLデコーディング: バイナリXMLデコーダはバイナリXMLをXML infosetに変換します。

- スキーマ管理、トークン管理などのバイナリXMLボキャブラリ管理。

バイナリXMLエンコーディング

エンコーダはBinXMLStreamから作成されます。XMLテキストを入力として取り、作成元のBinXMLStreamにエンコード済バイナリXMLを出力します。エンコーダは、ストリーミングSAXを使用してXMLテキストを読み取ります。XMLテキストのエンコーディングは、XML解析の結果に基づいています。

エンコーディングがスキーマ対応か、スキーマレスかどうかを指定するエンコーダ上でschemaAwareフラグを設定します。

スキーマ対応のエンコーディングでは、特定のスキーマURLのスキーマがボキャブラリ・マネージャに登録されているかどうかをエンコーダが決定します。リポジトリベースまたはデータベースベースのプロセッサでは、エンコーダはリポジトリまたはデータベースに対して、スキーマURLに基づいてコンパイルされたスキーマを問い合せます。データベースでスキーマが使用可能である場合、バイナリXML形式でリポジトリまたはデータベースからフェッチされ、ローカルのボキャブラリ・マネージャに登録されます。ボキャブラリはスキーマです。

また、エンコーディングの結果が、スキーマに依存しないバイナリXMLストリームになるようにフラグを設定します。この場合、結果として生じるバイナリXMLストリームは、すべてのトークン定義インラインを含んでいて、スキーマまたは外部トークン・セットに依存していません。

エンコーディングがスキーマ対応の場合、エンコーダは、SAXストリームをより効率的にエンコーディングするためにスキーマ・オブジェクトからのデータ型情報を使用します。スキーマ組込みの各データ型には、関連付けられたデフォルトのエンコーディング・データ型があります。スキーマを使用するバイナリXMLストリーム・エンコーディングは、スキーマに関する少なくとも部分妥当性を前提としています(部分妥当性の場合、一意のキー、キー参照、IDまたはDREFに関する検証はありません)。スキーマに関してデータが完全に有効であることがわかっている場合、エンコード済バイナリXMLストリームにその情報が格納されます。

関連項目:
バイナリ・エンコーディング・データ型と、そのXML Schemaデータ型からのマッピングに関する表は、『Oracle XML DB開発者ガイド』を参照してください。

テキストXMLに関連付けられたスキーマがない場合、テキストXML内で繰り返される項目について整数のトークンIDが生成されます。トークンIDとトークン定義の表を作成することは、重要な圧縮テクニックです。トークン定義はボキャブラリ・キャッシュ内にトークン表として格納されます。インライン・トークン定義のプロパティが設定されている場合、そのトークン定義は現在のインラインです。

関連項目:
「トークン管理」

エンコーダ上の別のプロパティは、PSVI(Post Schema Validated Infoset)情報をバイナリ・ストリームの一部として指定しています。これがtrueに設定されると、DOM上のPSVI用のXDK拡張APIを使用してPSVI情報にアクセスできます。psvi = trueの場合、入力XMLはスキーマに関して完全に検証されます。psviがfalseの場合、PSVI情報は出力バイナリ・ストリームに含まれません。デフォルトはfalseです。

バイナリXMLデコーディング

バイナリXMLデコーダはバイナリXMLをXML infosetに変換します。デコーダはBinXMLStreamから作成されます。このストリームからバイナリXMLを読み取り、SAXイベントを出力するか、デコードされたXMLの読取りのためのPull型InfosetReader APIを提供します。スキーマがBinXMLStreamに関連付けられている場合、バイナリXMLデコーダは、デコーディングの前にボキャブラリIDを使用してボキャブラリ・キャッシュから関連付けられたスキーマ・オブジェクトを取得します。ボキャブラリ・キャッシュにスキーマがないが、サーバーへの接続情報はある場合、スキーマはサーバーからフェッチされます。

スキーマがBinXMLStreamに関連付けられていない場合、トークン定義はBinXMLStream内のインラインであっても、トークン・セットに格納されていてもかまいません。対応する名前空間のトークンが、ローカルなボキャブラリ・キャッシュの中に格納されていない場合、トークン・セットはリポジトリからフェッチされます。

バイナリXMLボキャブラリ管理

バイナリXMLプロセッサはメタデータの場所(スキーマまたはトークン・セット)に応じて、ローカル・バイナリXMLプロセッサまたはリポジトリ・バイナリXMLプロセッサとなります。

スキーマ管理

メタデータの永続性を考慮して、DBバイナリXMLプロセッサを使用することをお薦めします。この場合、スキーマとトークン・セットはデータベースに登録されます。ボキャブラリ・マネージャはスキーマまたはトークン・セットをデータベースからフェッチし、エンコーディングとデコーディングのためにローカルのボキャブラリ・キャッシュにキャッシュします。

関連項目:
「バイナリXML DB」

データベースでないパーシステントなメタデータ・リポジトリを使用する必要がある場合、独自のメタデータ・リポジトリにプラグインすることができます。このリポジトリBinXMLMetadataProviderで通信するためには、インタフェースを実装する必要があります。

スキーマ登録

スキーマは、ローカル・バイナリXMLプロセッサにローカルに登録します。ローカル・バイナリXMLプロセッサには、存続期間にユーザーにより送信されたすべてのスキーマを保持するボキャブラリ管理があります。ローカル・バイナリXMLプロセッサに関連付けられたボキャブラリ・マネージャは、スキーマに永続性を提供しません。

同一のスキーマ(スキーマの場所とターゲット名前空間が同一)を登録する場合、スキーマは解析されず、既存のボキャブラリIDが戻されます。ターゲット名前空間は同じでスキーマの場所が異なる新しいスキーマを登録すると、既存のスキーマ定義が増大した新しいスキーマ定義ができるか、競合エラーが発生します。

スキーマ識別

各スキーマはボキャブラリIDによって識別されます。ボキャブラリIDはプロセッサの有効範囲内にあり、プロセッサの範囲内で一意です。スキーマを使用して検証する文書はすべて、スキーマの最新バージョンを使用して検証する際に必要になります。

スキーマ注釈

バイナリXML注釈は、スキーマ内の<xsd:appInfo>要素内にのみ出現できます。スキーマ注釈には、ユーザー・レベルとシステム・レベルの2つのカテゴリがあります。ボキャブラリ・マネージャは、スキーマ登録時にそれらを解釈します。他のすべての型の注釈(データベース関連の注釈など)は無視されます。

ユーザー・レベル注釈

これらは登録の前にユーザーによって指定されます。

encodingType: これはxsd:element、xsd:attributeまたはxsd:simpleType要素の中で使用できます。特定の要素または属性のノード値をエンコードするために使用されるデータ型を示します。文字列に関しては、このリリースではUTF8エンコーディングのサポートのみがあります。

システム・レベル注釈

ボキャブラリ・マネージャがスキーマ登録時にそれらを追加します。上書きできません。

トークン管理

トークン・セットはデータベースまたはメタデータ・リポジトリからフェッチされ、ローカルなボキャブラリ・マネージャにキャッシュされて、デコーディング用途に使用できます。エンコーディング時には、永続性を考慮してトークン・セットをリポジトリにプッシュすることができます。

エンコーダ上にフラグを設定することで、トークン定義をバイナリXMLストリームの一部にも含めることができます。

JavaバイナリXMLパッケージの使用

BinXMLStreamクラスはバイナリXMLストリームを表します。バイナリXMLストリームに対して定義されている様々な格納場所を次に示します。

- InputStream: 読取り用ストリーム。

- OutputStream: 書込み用ストリーム。

- URL: 読取り用ストリーム。

- File: 読み書き用ストリーム。

- BLOB: 読み書き用ストリーム。

- バイト配列: 読み書き用ストリーム。

- インメモリー: 読み書き用ストリーム。

BinXMLStreamオブジェクトは、作成時に格納タイプを指定します。

BinXMLStreamオブジェクトはBinXMLProcessorファクトリから作成することができます。このファクトリは、JDBC接続(リモート・メタデータ・アクセスの場合)、接続プール、URLまたはPageManagerPool(遅延型インメモリー格納の場合)で初期化することができます。BinXMLEncoderおよびBinXMLDecoderは、エンコーディングまたはデコーディングのためにBinXMLStreamから作成できます。

1. リポジトリを持たないプロセッサを作成し、スキーマを登録し、XML SAXイベントをスキーマ対応のバイナリ形式にエンコードし、ファイルに格納する例を次に示します。

BinXMLProcessor  proc = BinXMLProcessorFactory.createProcessor();
proc.registerSchema(schemaURL);
BinXMLStream outbin = proc.createBinaryStream(outFile);
BinXMLEncoder enc = outbin.getEncoder();
enc.setSchemaAware(true);
ContentHandler hdlr = enc.getContentHandler();

ContentHandlerを取得できる他、次のように他のハンドラも取得できます。

LexicalHandler lexhdlr = enc.getLexicalHandler();
DTDHandler dtdhdlr = encenc.getDTDHandler();
DeclHandler declhdlr = enc.getDeclHandler();
ErrorHandler errhdlr = enc.getErrorHandler();

SAXイベントを生成するアプリケーションではhdlrを使用します。

2. データベース・リポジトリを持つプロセッサを作成し、スキーマ対応のバイナリ・ストリームをデコードし、Pull APIを使用してデコードされたXMLを読む例を次に示します。デコーディング用のスキーマはデータベース・リポジトリからフェッチされます。

DBBinXMLMetadataProvider dbrep =
BinXMLMetadataProviderFactory.createDBMetadataProvider();
BinXMLProcessor proc = BinXMLProcessorFactory.createProcessor(dbrep);
BinXMLStream inpbin = proc.createBinaryStream(blob);
BinXMLDecoder dec = inpbin.getDecoder();
InfosetReader xmlreader = dec.getReader();

デコーダからPull型でXMLを読み取るにはxmlreaderを使用します。

バイナリXMLエンコーダ

エンコーダがXML入力を取得すると、それはSAXイベントを使用して解析および読取りを受け、バイナリXMLを出力します。

スキーマなしオプション

エンコーディングの前に、スキーマ対応オプションとスキーマなしオプションのいずれかを指定することができます。デフォルトはスキーマなしエンコーディングです。スキーマ対応オプションを設定すると、エンコーディングはインスタンス・ドキュメントで指定されたスキーマに基づいて行われます。エンコーディングで使用された注釈付きスキーマは、デコーディング時にも必要になります。スキーマなしオプションを指定すると、エンコーディングはスキーマに依存しませんが、トークンはデフォルトでインラインです。デフォルトをオーバーライドするには、Inline-token = falseを設定します。

インライン・トークン・オプション

エンコーディングの前に、インライン・トークン定義を持つバイナリXMLストリームを作成するオプションを設定することができます。「インライン化」をオフにすると、エンコーダまたはデコーダのプロセッサが同一のメタデータ・リポジトリを使用することをユーザーが確認する必要があります。スキーマ対応オプションがtrueの場合、フラグInline-tokenは無視されます。デフォルトでは、トークン定義はインラインです。

図5-1 バイナリXMLエンコーディング

バイナリXMLデコーダ

バイナリXMLデコーダはバイナリXMLストリームを入力に取り、出力としてSAXイベントを生成するか、デコードされたXMLを読み取るためのPull型インタフェースを提供します。スキーマ対応バイナリXMLストリームの場合、バイナリXMLデコーダはスキーマ情報を抽出するためにボキャブラリ・マネージャと対話します。

ボキャブラリ・マネージャに必須スキーマが含まれず、プロセッサのタイプが有効JDBC接続を伴うバイナリXML DBの場合、リモート・スキーマは、デコードされるバイナリXMLストリームのボキャブラリIDに基づいてデータベースまたはメタデータ・リポジトリからフェッチされます。同様に、トークン定義の集合をデータベースまたはメタデータ・リポジトリからフェッチすることができます。

図5-2 バイナリXMLデコーダ

スキーマ登録

プロセスのフローを次に示します。ボキャブラリがXMLスキーマの場合、入力としてXMLスキーマ・テキストを取ります。Schema Annotatorにより、スキーマ・テキストにシステム・レベルの注釈が付けられます。スキーマにはすでに多少のユーザー・レベル注釈があることがあります。

結果として生じる注釈付きスキーマは、Schema Builderによって処理されてXML Schemaオブジェクトを構成します。このXML Schemaオブジェクトはボキャブラリ・キャッシュに格納されます。ボキャブラリ・キャッシュは各XML Schemaオブジェクトに一意のボキャブラリIDを割り当て、それが出力として戻されます。スキーマの注釈付きDOM表現がバイナリXMLエンコーダに送信されます。

xsi:schemaLocationの解決

エンコーディング時に、schemaAwareがtrueでプロパティImplcitSchemaRegistrationがtrueの場合、XMLインスタンス・ドキュメントのルート要素にある最初のxsi:schemaLocationタグは、そのスキーマをローカルのボキャブラリ・マネージャに自動的に登録します。他のすべてのschemaLocationタグは明示的に登録されません。プロセッサがデータベース指向の場合、メタデータ・リポジトリ・ベースのプロセッサと同様にスキーマもデータベース内に登録されています。

エンコーディングのschemaAwareがfalseに設定されるか、ImplcitSchemaRegistrationがfalseの場合、xsi:schemaLocationタグはエンコーダによってすべて無視されます。

バイナリXML DB

DBBinXMLMetadataProviderオブジェクトは、スキーマやトークン・セットなどのボキャブラリ情報にアクセスするために、専用のJDBC接続または接続プールを使用してインスタンス化されます。また、XMLデータにアクセスするために、プロセッサは1つ以上のデータ接続を使用して関連付けられています。

バイナリXMLプロセッサは、バイナリXMLスキーマ、トークン・セットおよびバイナリXMLストリームの格納と取得など、様々なタイプのバイナリXML操作のためにデータベースと通信することができます。データベース通信は、次のような場面で使用されます。

1. スキーマURLのボキャブラリIDを使用したコンパイル済バイナリXMLスキーマの抽出
エンコーディングのためにコンパイル済バイナリXMLスキーマを取得する場合、スキーマURLに基づいてデータベースへの問合せが行われます。バイナリXMLスキーマのデコーディングでは、ボキャブラリIDに基づいてデータベースからスキーマをフェッチします。

2. スキーマURLの使用とボキャブラリIDの取得によるコンパイル済でないバイナリXMLスキーマの格納。
エンコーディング時にxsi:schemaLocationタグが見つかると、データベースへの永続的な格納のためにスキーマがデータベースに登録されます。スキーマに関連付けられたボキャブラリIDは、コンパイル済スキーマのバイナリ・バージョンと同様、データベースから取得されます。コンパイル済スキーマ・オブジェクトが構成され、データベースから戻されたボキャブラリIDを使用してローカル・キャッシュに格納されます。

3. 名前空間URLを使用したバイナリ・トークン・セットの取得。
デコードされるバイナリ・ストリームがデコーディングのためにトークン表で関連付けられている場合、それらはメタデータ接続を使用してデータベースからフェッチされます。

4. 名前空間URLを使用したバイナリ・トークン・セットの格納
XMLテキストをスキーマなしでエンコードすると、トークン定義のトークン・セットになります。これらのトークン表はデータベース内に永続的に格納されることができます。メタデータ接続は、トークン・セットをデータベースに転送するために使用されます。

5. リモート記憶域オプションを持つバイナリXMLストリーム
エンコーディングの結果を格納し、デコード用にバイナリXMLを取得するために、バイナリXMLを持つXMLType列が含まれた表は、ユーザーが作成します。データベースとの通信は、SQL*NetおよびJDBCで行うことができます。JDBC問合せの出力結果セットからXMLTypeオブジェクトをフェッチします。バイナリ・データを読み取るため、またはバイナリ・データを書き出すためのBinXMLStreamは、XMLTypeオブジェクトから作成することができます。バイナリXMLデータの読み書きをサポートするには、XMLTypeクラスを拡張する必要があります。

メタデータの永続的格納

ローカルのボキャブラリ・マネージャおよびキャッシュは、BinXMLProcessorが存続する間、メモリーにメタデータ情報を格納します。BinXMLMetadataProviderインタフェースを実装してBinXMLProcessorにプラグインすることによって、メタデータの独自のバックエンド記憶域をプラグインします。現在のところ、メタデータ・プロバイダは各プロセッサにつき1つのみサポートされています。

BinXMLMetadataProviderインタフェースを実装するFileBinXMLMetadataProviderをコーディングする必要があります。エンコーダとデコーダはこれらのAPIを使用して、永続的なバックエンド記憶域からメタデータにアクセスします。永続的な記憶域の構成情報を設定します。たとえば、ファイル・システムの場合のルート・ディレクトリをFileBinXMLMetadataProviderクラスに設定します。FileBinXMLMetadataProviderをインスタンス化してBinXMLProcessorにプラグインします。

6 XSLT Processor for Javaの使用

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

- XSLT Processorの概要

- XSLT Processor for Javaの使用: 概要

- XMLの変換

- Oracle XSLT拡張によるプログラミング

- XML変換のヒントと方法

XSLT Processorの概要

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

- 前提条件

- 標準と仕様

- XSLT 1.0および2.0でのXML変換

前提条件

XSLTは、1つのXML文書を別のテキスト文書に変換するために使用できるXMLベースの言語です。たとえば、XSLTを使用してXMLデータ文書を入力として受け取り、文書の要素値に対して算術計算を実行し、計算結果を示すXHTML文書を生成できます。XSLTでは、XPathはソース・ノード・ツリーの要素をナビゲートおよび処理するために使用されます。XPathは、XML文書をノードから構成されるツリーとしてモデル化します。XPathノード・ツリー内のノードのタイプは、DOMツリー内のノードのタイプに対応します。

この章では、次のW3C標準を十分に理解していると想定します。

- eXtensible Stylesheet Language (XSL)およびeXtensible Stylesheet Language Transformation (XSLT): XSLTの概要説明が必要な場合は、「はじめに」の「関連ドキュメント」に記載されているXMLの資料を参照してください。

標準と仕様

XSLTには現在、XSLT 2.0の草案およびXSLT 1.0勧告という2つのバージョンがあります。仕様は次のURLにあります。

- http://www.w3.org/TR/xslt20/

- http://www.w3.org/TR/xslt

XPathは、XSLTおよびその他のXML言語で使用されるナビゲーショナル言語であり、XPath 2.0の草案およびXPath 1.0勧告という2つのバージョンがあります。2つのXPathバージョンの仕様は次のURLにあります。

- http://www.w3.org/TR/xpath20/

- http://www.w3.org/TR/xpath

Oracle XDK XSLT Processorは、XSLTとXPathの1.0標準、およびXSLTとXPathの2.0標準の最新草案を実装します。XDK XSLT Processorでは、XPath 2.0の関数および演算子がサポートされます。仕様は次のURLにあります。

http://www.w3.org/TR/xpath-functions/

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

XSLT 1.0および2.0でのXML変換

Oracle Database 10gでは、XDKはXSLT 1.0に含まれていない便利な機能をいくつか提供しています。XSLT 2.0を使用するには、次のようにスタイルシートにversion属性を設定します。

<? xml-stylesheet version="2.0" ... ?>

XSLT 2.0の最も便利な機能を次にいくつか示します。

- ユーザー定義関数
<xsl:function>宣言を使用して関数を定義できます。この要素には、関数名を定義するために1つのname属性が必要です。name属性の値はQNameです。<xsl:function>要素の内容は、関数の形式的な引数を指定する0個以上のxsl:param要素と、それに続く、関数から戻される値を定義する順序コンストラクタです。

QNameはnullの名前空間を持つことができますが、ユーザー定義関数にはnull以外の名前空間が必要です。つまり、abcが名前空間として定義されている場合、addは有効なユーザー定義関数ではありませんが、abc:addは有効なユーザー定義関数です。

- グループ化
<xsl:for-each-group>要素、current-group()関数およびcurrent-grouping-key()関数を使用して、アイテムをグループ化できます。

- 複数結果文書
<xsl:result-document>要素を使用して結果ツリーを作成できます。<xsl:result-document>要素の内容は、ツリーの文書ノードの子に対する順序コンストラクタです。

たとえば、この要素を使用すると、XML文書を入力として受け取り、別々の文書に分割できます。書籍のリストを記述するXML文書を受け取り、各書籍に関するXHTML文書を生成できます。次に、各出力文書を検証できます。

- 一時ツリー
XSLT 1.0のようにXSL変換の中間結果とXSL変数を文字列で表現するかわりに、これらを一連の文書ノードとして格納できます。<xsl:variable>、<xsl:param>および<xsl:with-param>要素で構築できる文書ノードは、一時ツリーと呼ばれます。

- 文字マッピング
XSLT 1.0では、文字のエスケープを指定するには<xsl:text>および<xsl:value-of>要素のdisable-output-escaping属性を使用する必要がありました。XSLT 2.0では、最上位レベルのスタイルシート要素としてマッピング文字を<xsl:character-map>要素で宣言できます。この要素を使用して、XSLT出力に<、>、&などの予約文字や無効なXML文字のあるファイルを生成できます。

関連項目:
http://www.w3.org/TR/xslt20にあるXSLT 2.0の機能の説明と例

XSLT Processor for Javaの使用: 概要

Oracle XDK XSLT Processorは、XML文書を別のテキストベース形式に変換するソフトウェア・プログラムです。たとえば、プロセッサはXMLをXML、HTML、XHTMLまたはテキストに変換できます。プロセッサは、APIを使用してプログラムで起動するか、コマンドラインから実行できます。XSLT Processorは、次のタスクを実行できます。

- 1つ以上のXSLTスタイルシートを読み取ります。プロセッサは、1つのXML入力文書に複数のスタイルシートを適用し、異なる結果を生成できます。

- 1つ以上の入力XML文書を読み取ります。プロセッサは、1つのスタイルシートを使用して複数のXML入力文書を変換できます。

- スタイルシートのルールを入力XML文書に適用して、出力文書を構築します。出力は、DOMツリー、出力ストリームまたは一連のSAXイベントです。

XSLTは関数ベースの言語であり、一般に変換を実行するには入力文書およびスタイルシートのDOMを必要としますが、XSLTプロセッサのJava XDK実装は、より少ないリソースで効率的に変換を実行するために、SAXを使用してスタイルシート・オブジェクトを作成できます。このスタイルシート・オブジェクトを再利用して、スタイルシートを再解析せずに複数の文書を変換できます。

XSLT Processorの使用: 基本プロセス

図6-1に、XSLT Processor for Javaの基本設計を示します。

関連項目:
XMLParserクラスおよびXSDBuilderクラスの詳細は、Oracle Database XML Java APIリファレンスを参照してください

図6-1 XSLT Processor for Javaの使用

XSLT Processorのデモ・プログラムの実行

XSLT Processor for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/parser/xsltにあります。表6-1に、XSLT Processorのテストに使用できるXMLファイルとプログラムを示します。

表6-1 XSLT Processorのサンプル・ファイル

ファイル

説明

match.xml

ID選択とパターン・マッチングのテストに使用できるサンプルXML文書。関連付けられているスタイルシートはmatch.xslです。

match.xsl

match.xmlで使用するサンプル・スタイルシート。単純な識別子変換のテストに使用できます。

math.xml

単純な算術の実行に使用できるサンプルXMLデータ文書。関連付けられているスタイルシートはmath.xslです。

math.xsl

math.xmlで使用するサンプル・スタイルシート。スタイルシートは、math.xmlの要素値に対して実行した算術演算の結果とともにHTMLページを出力します。

number.xml

ソース・ツリーのナンバリングのテストに使用できるサンプルXMLデータ文書。このXMLデータ文書は書籍の構造を記述します。

number.xsl

number.xmlで使用するサンプル・スタイルシート。スタイルシートは、number.xmlで記述されている書籍内のセクションのセクション番号を計算するHTMLページを出力します。

position.xml

複合パターンでposition()=Xのテストに使用できるサンプルXMLデータ文書。関連付けられているスタイルシートはposition.xslです。

position.xsl

position.xmlで使用するサンプル・スタイルシート。スタイルシートは、複合パターン・マッチングの結果とともにHTMLページを出力します。

reverse.xml

ツリーを後方検索するためにreverse.xslで使用できるサンプルXMLデータ文書。

reverse.xsl

reverse.xmlで使用するサンプル・スタイルシート。スタイルシートは、reverse.xmlのアイテム番号を逆の順序で出力します。

string.xml

様々な文字列テストと操作のテストに使用できるサンプルXMLデータ文書。関連付けられているスタイルシートはstring.xslです。

string.xsl

string.xmlで使用するサンプル・スタイルシート。スタイルシートは、文字列操作の結果を表示するXML文書を出力します。

style.txt

HTMLページのフレームワークを提供するスタイルシート。スタイルシートはnumber.xslによってインクルードされます。

variable.xml

XSL変数の使用のテストに使用できるサンプルXMLデータ文書。このXMLデータ文書は書籍の構造を記述します。関連付けられているスタイルシートはvariable.xslです。

variable.xsl

variable.xmlで使用するスタイルシート。スタイルシートは、XSL変数を広範に使用します。

XSLSample.java

Oracle XSLT ProcessorのXSL処理機能の使用方法を簡単な例で示すサンプル・アプリケーション。このプログラムは、入力スタイルシートを使用して入力XML文書を変換します。このプログラムは、XSL変換の結果をDocumentFragmentとして構築し、xsl:output機能を表示しません。

ディレクトリ内の任意のXSLTスタイルシートを最初の引数として使用し、関連付けられている*.xml XML文書を第2引数として使用して、このプログラムを実行します。たとえば、variable.xslとvariable.xml、またはstring.xslとstring.xmlを指定してプログラムを実行します。

XSLSample2.java

Oracle XSLT ProcessorのXSL処理機能の使用方法を簡単な例で示すサンプル・アプリケーション。このプログラムは、入力スタイルシートを使用して入力XML文書を変換します。このプログラムは、結果をストリームに出力し、xsl:output機能をサポートします。XSLSample.javaと同様に、ディレクトリ内のXMLデータ文書とスタイルシートの任意のペアに対してこのプログラムを実行できます。

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

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

2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。

3. コマンドラインでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。makeファイルはソース・コードをコンパイルしてから、各*.xmlファイルおよび関連付けられている*.xslスタイルシートに対してXSLSampleおよびXSLSample2プログラムを実行します。プログラムは、各変換の出力を*.outに書き込みます。

4. *.outファイルを表示して、XML変換の出力を参照できます。次のようにコマンドラインでプログラムを実行することもできます。nameはmatch、mathなどで置き換えます。

java XSLSample name.xsl name.xml
java XSLSample2 name.xsl name.xml

たとえば、match.xmlデモは次のように実行します。

java XSLSample match.xsl match.xml
java XSLSample2 match.xsl match.xml

XSLT Processorコマンドライン・ユーティリティの使用

XDKには、複数のXML文書にスタイルシートを適用できるコマンドラインJavaインタフェースであるoraxslが含まれています。$ORACLE_HOME/bin/oraxslおよび%ORACLE_HOME%\bin\oraxsl.batシェル・スクリプトは、oracle.xml.jaxb.oraxslクラスを実行します。oraxslを使用するには、CLASSPATHが「Java XDK環境の設定」の説明に従って設定されていることを確認します。

コマンドラインで次の構文を使用して、oraxslを起動します。

oraxsl options source stylesheet result

oraxslユーティリティには、スタイルシート、変換するXMLファイルおよび結果ファイル(オプション)を指定します。結果ファイルを指定しない場合、ユーティリティは変換した文書を標準出力に送信します。複数のXML文書をスタイルシートによって変換する必要がある場合は、-lまたは-dオプションを-sおよび-rオプションと組み合せて使用します。表6-2に、これらのオプションおよび他のオプションを示します。

表6-2 oraxslのコマンドライン・オプション

オプション

説明

-w

警告を表示します。デフォルトでは、警告はオフになっています。

-e error_log

プログラムがエラーおよび警告を書き込むファイルを指定します。

-l xml_file_list

処理するファイルをリストします。

-d directory

変換するファイルが格納されているディレクトリを指定します。デフォルトの動作では、ディレクトリ内のすべてのファイルが処理されます。そのディレクトリ内にあるファイルのサブセットのみ(1つのファイルのみなど)を処理する必要がある場合は、-lを設定して処理する必要のあるファイルを指定し、この動作を変更します。-xまたは-iを使用して拡張子に基づいてファイルを選択することで、この動作を変更することもできます。

-x source_extension

除外する必要のあるファイルの拡張子を指定します。このオプションは-dとともに使用します。プログラムは、指定された拡張子の付いたファイルを選択しません。

-i source_extension

含める必要のあるファイルの拡張子を指定します。このオプションは-dとともに使用します。プログラムは、指定された拡張子の付いたファイルのみ選択します。

-s stylesheet

スタイルシートを指定します。-dまたは-lを設定した場合は、-sを設定して使用するスタイルシートを示します。完全なパスを指定する必要があります。

-r result_extension

結果に使用する拡張子を指定します。-dまたは-lを設定した場合は、-rを設定して変換の結果に使用する拡張子を指定します。このため、拡張子outを指定した場合、プログラムは入力文書docをdoc.outに変換します。デフォルトでは、プログラムは結果を現在のディレクトリに出力します。この動作は、結果を保存するディレクトリを指定する-oオプションを使用して変更できます。

-o result_directory

結果を保存するディレクトリを指定します。このオプションは、-rオプションと組み合せて設定する必要があります。

-p param_list

パラメータをリストします。

-t num_of_threads

処理に使用するスレッド数を指定します。複数のスレッドを使用すると、複数の文書を処理する際のパフォーマンスを向上させることができます。

-v

冗長出力を生成します。プログラムは、デバッグ情報を出力します。この出力は、処理中に発生した問題の追跡に有効な場合があります。

-debug

デバッグ出力を生成します。デフォルトでは、デバッグ・モードは無効になっています。XSLTデバッガのGUIバージョンは、Oracle JDeveloperで使用できます。

XSLT Processorコマンドライン・ユーティリティの使用: 例

$ORACLE_HOME/xdk/demo/java/parser/xsltにある様々なXMLファイルおよびスタイルシートでoraxslをテストできます。例6-1に、math.xmlのコンテンツを示します。

例6-1 math.xml

<?xml version="1.0"?>
<doc>
<n1>5</n1>
<n2>2</n2>
<div>-5</div>
<mod>2</mod>
</doc>

例6-2に、math.xslというXSLTスタイルシートを示します。

例6-2 math.xsl

<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="doc">
<HTML>
<H1>Test for mod.</H1>
<HR/>
<P>Should say "1": <xsl:value-of select="5 mod 2"/></P>
<P>Should say "1": <xsl:value-of select="n1 mod n2"/></P>
<P>Should say "-1": <xsl:value-of select="div mod mod"/></P>
<P><xsl:value-of select="div or ((mod)) | or"/></P>
</HTML>
</xsl:template>
</xsl:stylesheet

これらのファイルに対してoraxslユーティリティを実行して、次の例に示すHTML出力を生成できます。

oraxsl math.xml math.xsl math.htm

例6-3に、出力ファイルmath.htmを示します。

例6-3 math.htm

<HTML>
<H1>Test for mod.</H1>
<HR>
<P>Should say "1": 1</P>
<P>Should say "1": 1</P>
<P>Should say "-1": -1</P>
<P>true</P>
</HTML>

XMLの変換

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

- 基本的なXSL変換の実行

- XSL変換からのDOM結果の取得

基本的なXSL変換の実行

「XSLT Processor for Javaの使用: 概要」で説明したように、XSLT Processorで使用される基本的なクラスはDOMParserおよびXSLProcessorです。XSL2Sample.javaデモ・プログラムは、これらのクラスを使用してXSLTスタイルシートでXML文書を変換する方法をわかりやすく示します。

次の基本手順を使用して、XSLT Processorを使用するJavaプログラムを作成します。

1. XMLデータ文書とXSLTスタイルシートの解析に使用できるDOMパーサー・オブジェクトを作成します。XSL2Sample.javaの次のコード部分は、パーサーをインスタンス化する方法を示します。

XMLDocument xml, xsldoc, out;URL xslURL;URL xmlURL;
// ...
parser = new DOMParser();parser.setPreserveWhitespace(true);

デフォルトでは、DTDが使用されていないかぎりパーサーは空白を保持しないことに注意してください。空白を保持するとXSLTの空白ルールで空白の処理方法を決定できるため、空白の保持は重要です。

2. DOMParser.parse()メソッドを使用してXSLTスタイルシートを解析します。XSL2Sample.javaの次のコード部分は、解析の実行方法を示します。

xslURL = DemoUtil.createURL(args[0]);
parser.parse(xslURL);
xsldoc = parser.getDocument();

3. DOMParser.parse()メソッドを使用してXMLデータ文書を解析します。XSL2Sample.javaの次のコード部分は、解析の実行方法を示します。

xmlURL = DemoUtil.createURL(args[1]);
parser.parse(xmlURL);
xml = parser.getDocument();

4. 新規XSLTスタイルシート・オブジェクトを作成します。次のクラスのオブジェクトをXSLProcessor.newXSLStylesheet()メソッドに渡すことができます。

- java.io.Reader

- java.io.InputStream

- XMLDocument

- java.net.URL

たとえば、XSL2Sample.javaは、XMLDocumentオブジェクトからスタイルシートを作成する方法を示します。

XSLProcessor processor = new XSLProcessor();
processor.setBaseURL(xslURL);
XSLStylesheet xsl = processor.newXSLStylesheet(xsldoc);

5. 警告を表示するようにXSLT Processorを設定します。たとえば、XSL2Sample.javaは次のようにshowWarnings()およびsetErrorStream()メソッドをコールします。

processor.showWarnings(true);
processor.setErrorStream(System.err);

6. XSLProcessor.processXSL()メソッドを使用して、スタイルシートを入力XMLデータ文書に適用します。表6-3に、他の使用可能なXSLProcessorメソッドの一部を示します。

表6-3 XSLProcessorのメソッド

メソッド

説明

removeParam()

パラメータを削除します。

resetParams()

すべてのパラメータをリセットします。

setParam()

変換用のパラメータを設定します。

setBaseUrl()

スタイルシート内の相対参照のベースURLを設定します。

setEntityResolver()

スタイルシート内の相対参照のエンティティ・リゾルバを設定します。

setLocale()

エラー・レポートのロケールを設定します。

XSL2Sample.javaの次のコード部分は、スタイルシートをXML文書に適用する方法を示します。

processor.processXSL(xsl, xml, System.out);

7. 変換した出力を処理します。XML文書オブジェクトの作成、出力ストリームの書出しまたはSAXイベントの報告によって、結果を変換できます。
XSL2Sample.javaの次のコード部分は、結果を出力する方法を示します。

processor.processXSL(xsl, xml, System.out);

関連項目:

- http://www.w3.org/TR/xslt

- http://www.w3.org/style/XSL

- 第4章「XML Parsing for Java」

XSL変換からのDOM結果の取得

XSLSample.javaデモ・プログラムは、XSL変換の結果としてoracle.xml.parser.v2.XMLDocumentFragmentオブジェクトを生成する方法を示します。XMLDocumentFragmentはXML文書ツリーの一部を抽出する軽量Documentオブジェクトです。XMLDocumentFragmentクラスは、org.w3c.dom.DocumentFragmentインタフェースを実装します。

XSL2Sample.javaプログラムは、DocumentFragmentオブジェクトの生成方法を示します。XMLの変換の基本手順は、「基本的なXSL変換の実行」で説明した手順と同じです。XSLProcessor.processXSL()メソッドに渡される引数のみ異なります。XSL2Sample.javaの次のコード部分は、DOMフラグメントを作成して標準出力に出力する方法を示します。

XMLDocumentFragment result = processor.processXSL(xsl, xml);
result.print(System.out);

表6-4に、オブジェクトの操作に使用できるXMLDocumentFragmentメソッドの一部を示します。

表6-4 XMLDocumentFragmentのメソッド

メソッド

説明

getAttributes()

このノードがElementである場合はその属性を含むNamedNodeMapを取得し、Elementでない場合はnullを生成します。

getLocalName()

この要素のローカル名を取得します。

getNamespaceURI()

この要素の名前空間URIを取得します。

getNextSibling()

現在のノードの直後のノードを取得します。

getNodeName()

ノードの名前を取得します。

getNodeType()

基礎となるオブジェクトの型を表すコードを取得します。

getParentNode()

現在のノードの親を取得します。

getPreviousSibling()

現在のノードの直前のノードを取得します。

reportSAXEvents()

DOMツリーからSAXイベントを報告します。

Oracle XSLT拡張によるプログラミング

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

- Oracle XSLT拡張の概要

- XSLT拡張関数の名前空間の指定

- XSLTでのstaticおよび非static Javaメソッドの使用

- コンストラクタ拡張関数の使用

- 戻り値拡張関数の使用

Oracle XSLT拡張の概要

XSLT 1.0標準では、拡張要素および拡張関数という2種類の拡張を定義しています。XDKに提供されているXSLT処理用の拡張関数を使用すると、XSLT Processorのユーザーは、任意のJavaメソッドをXSLの式からコールできます。Oracle XSLT拡張を使用する場合のガイドラインを次に示します。

- 特定のプログラミング言語でXSLT拡張を定義する場合、この拡張を起動できるXSLT ProcessorでのみXSLTスタイルシートを使用できます。したがって、Javaで定義されている拡張関数を起動できるのは、JavaバージョンのXSLT Processorのみです。

- 組込みXSL関数で特定の問題を解決できない場合のみ、XSLT拡張を使用します。

- 次の項で説明するように、拡張クラスの名前空間は適切なURLから開始する必要があります。

次のOracle拡張関数は特に便利です。

- <ora:output>。<ora:output>は、最上位レベルの要素として、またはXSLテンプレートで使用できます。最上位レベルの要素として使用する場合は、追加のname属性がある点を除いて<xsl:output>拡張関数と同様です。テンプレートとして使用されている場合は、追加属性useおよびhrefがあります。この関数は、1つのXSL変換から複数の出力を作成するときに役立ちます。

- <ora:node-set>。結果ツリーのフラグメントをnode-setに変換します。この関数は、XSL内の既存のテキストまたは中間テキストの結果を参照してさらに変換する必要がある場合に役立ちます。

XSLT拡張関数の名前空間の指定

Oracle Javaの拡張関数は、次のURIに対応する名前空間にあります。

http://www.oracle.com/XSL/Transform/java/

次の名前空間にある拡張関数は、次の形式でURIを作成できるようにJava classnameのメソッドを参照します。

http://www.oracle.com/XSL/Transform/java/classname

たとえば、次の名前空間を使用して、XSLの式からjava.lang.Stringメソッドをコールできます。

http://www.oracle.com/XSL/Transform/java/java.lang.String

注意:
xsl接頭辞を名前空間に割り当てる場合、適切なURIはxmlns:xsl="http://www.w3.org/1999/XSL/Transform"です。その他のURIでは正しい出力を生成できません。

XSLTでのstaticおよび非static Javaメソッドの使用

Javaメソッドがクラスの非staticメソッドの場合、最初のパラメータはメソッドが起動されるインスタンスとして使用され、残りのパラメータがメソッドに渡されます。ただし、拡張関数がstaticメソッドの場合、その拡張関数のすべてのパラメータが、静的関数へのパラメータとして渡されます。例6-4に、XSLTスタイルシートでのjava.lang.Math.ceil()メソッドの使用例を示します。

例6-4 XSLTスタイルシートでの静的関数の使用

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://www.oracle.com/XSL/Transform/java/java.lang.Math">
<xsl:template match="/">
<xsl:value-of select="math:ceil('12.34')"/>
</xsl:template>
</xsl:stylesheet>

たとえば、例6-4をスタイルシートceil.xslとして作成し、任意の整形式XML文書に適用できます。たとえば、次のようにoraxslユーティリティを実行します。

oraxsl ceil.xsl ceil.xsl ceil.out

出力文書ceil.outのコンテンツは次のとおりです。

<?xml version = '1.0' encoding = 'UTF-8'?>
13

注意:
XSLクラス・ローダーは、静的に追加されたJARおよびwrapper.classpathによって指定されたCLASSPATHのパスのみ認識します。動的に追加されたファイルはXSLT Processorで認識されません。

コンストラクタ拡張関数の使用

拡張関数newは、クラスの新しいインスタンスを作成し、コンストラクタとして動作します。例6-5では、"Hello World"という値を持つ新しいStringオブジェクトを作成し、それをXSL変数str1に格納し、大文字で出力します。

例6-5 XSLTスタイルシートでのコンストラクタの使用

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:jstring="http://www.oracle.com/XSL/Transform/java/java.lang.String">
<xsl:template match="/">
<!-- creates a new java.lang.String and stores it in the variable str1 -->
<xsl:variable name="str1" select="jstring:new('HeLlO wOrLd')"/>
<xsl:value-of select="jstring:toUpperCase($str1)"/>
</xsl:template>
</xsl:stylesheet>

たとえば、このスタイルシートをhello.xslとして作成し、任意の整形式XML文書に適用できます。たとえば、次のようにoraxslユーティリティを実行します。

oraxsl hello.xsl hello.xsl hello.out

出力文書hello.outのコンテンツは次のとおりです。

<?xml version = '1.0' encoding = 'UTF-8'?>
HELLO WORLD

戻り値拡張関数の使用

拡張関数の結果は、XSLに定義されている次の5つの型、およびXSLT 2.0で定義されている単純なXML Schemaデータ型を含むどの型でも出力できます。

- NodeSet

- Boolean

- String

- Number

- ResultTree

これらのデータ型は、変数に格納したり、他の拡張関数に渡したりできます。結果の型がXSLに定義されている5つの型のうちの1つである場合、その結果はXSLの式の結果として戻すことができます。

XSLT Processorは、パラメータ数と型に基づくオーバーロードをサポートします。プロセッサは、XSLに定義されたとおりに5つのXSL型の間で暗黙的な型変換を実行します。次のデータ型間で型変換を暗黙的に実行します。また、NodeSetから次のデータ型にも変換します。

- String

- Number

- Boolean

- ResultTree

相互に暗黙的な変換が可能な2つの型に基づくオーバーロードは許可されません。次のオーバーロードでは、StringおよびNumberは相互に暗黙的な変換が可能なため、XSLでエラーが発生します。

- overloadme(int i){}

- overloadme(String s){}

XSLデータ型とJavaデータ型間のマッピングは次のとおり行われます。

String     ->     java.lang.String
Number     ->     int, float, double
Boolean    ->     boolean
NodeSet    ->     NodeList
ResultTree ->     XMLDocumentFragment

例6-6のスタイルシートは、$ORACLE_HOME/xdk/demo/java/parser/xsltディレクトリにあるvariable.xml文書を解析し、<chapter>要素の子である<title>の値を取得します。

例6-6 gettitle.xsl

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:parser = "http://www.oracle.com/XSL/Transform/java/oracle.xml.parser.v2.DOMParser"
xmlns:document =
"http://www.oracle.com/XSL/Transform/java/oracle.xml.parser.v2.XMLDocument">

<xsl:template match ="/">
<!-- Create a new instance of the parser and store it in myparser variable -->
<xsl:variable name="myparser" select="parser:new()"/>

<!-- Call an instance method of DOMParser. The first parameter is the object.
The PI is equivalent to $myparser.parse('file:/my_path/variable.xml'). Note
that you should replace my_path with the absolute path on your system. -->
<xsl:value-of select="parser:parse($myparser, 'file:/my_path/variable.xml')"/>

<!-- Get the document node of the XML Dom tree -->
<xsl:variable name="mydocument" select="parser:getDocument($myparser)"/>

<!-- Invoke getelementsbytagname on mydocument -->
<xsl:for-each select="document:getElementsByTagName($mydocument,'chapter')">
The value of the title element is: <xsl:value-of select="docinfo/title" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

例6-6をgettitle.xslとして作成し、次のようにoraxslを実行できます。

oraxsl gettitle.xsl gettitle.xsl variable.out

出力文書variable.outのコンテンツは次のとおりです。

<?xml version = '1.0' encoding = 'UTF-8'?>
The value of the title element is: Section Tests

XML変換のヒントと方法

この項では、XSLおよびXSLT Processor for Javaについてのヒントを示します。次の内容が含まれます。

- XML文書とXSLTのマージ

- 表の列に基づくHTML入力フォームの作成

XML文書とXSLTのマージ

「appendChild()を使用した文書のマージ」では、DOMでの文書のマージ方法について説明しています。マージ操作が単純な場合、XSLTベースの方法も使用できます。例6-7および例6-8のXML文書をマージすると想定します。

例6-7 msg_w_num.xml

<messages>
<msg>
<key>AAA</key>
<num>01001</num>
</msg>
<msg>
<key>BBB</key>
<num>01011</num>
</msg>
</messages>

例6-8 msg_w_text.xml

<messages>
<msg>
<key>AAA</key>
<text>This is a Message</text>
</msg>
<msg>
<key>BBB</key>
<text>This is another Message</text>
</msg>
</messages>

例6-9に、一致する<key/>要素値に基づいて、2つのXML文書をマージするサンプル・スタイルシートを示します。

例6-9 msgmerge.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<!-- store msg_w_text.xml in doc2 variable -->
<xsl:variable name="doc2" select="document('msg_w_text.xml')"/>

<!-- match each node in input xml document, that is, msg_w_num.xml -->
<xsl:template match="@*|node()">
<!-- copy the current node to the result tree -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!-- match each <msg> element in msg_w_num.xml -->
<xsl:template match="msg">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<!-- insert two spaces so indentation is correct in output document -->
<xsl:text>  </xsl:text>
<!-- copy <text> node from msg_w_text.xml into result tree -->
<text><xsl:value-of
select="$doc2/messages/msg[key=current()/key]/text"/>
</text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

例6-7、例6-8および例6-9でXMLファイルを作成し、コマンドラインで次のコマンドを実行します。

oraxsl msg_w_num.xml msgmerge.xsl msgmerge.xml

例6-10に、出力文書を示します。この文書は、msg_w_num.xmlおよびmsg_w_text.xmlに含まれるデータをマージします。

例6-10 msgmerge.xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<messages>
<msg>
<key>AAA</key>
<num>01001</num>
<text>This is a Message</text>
</msg>
<msg>
<key>BBB</key>
<num>01011</num>
<text>This is another Message</text>
</msg>
</messages>

この方法は、サイズが大きいファイルの場合は、2つの表間での同等のデータベースの結合ほど効果的ではありませんが、XMLファイルのみを処理する場合は有用です。

表の列に基づくHTML入力フォームの作成

データベース表の列名を使用する入力データに対してHTMLフォームを生成する必要があるとします。この目的は、XSUを使用してuser_tab_columns表に基づくXML文書を取得し、XSLTを使用してXMLをHTMLフォームに変換することによって達成できます。

1. XSUを使用して、表の列に基づいてXML文書を生成します。たとえば、表がhr.employeesであるとします。XSUは次のようにコマンドラインから実行できます。

java OracleXML getXML -user "hr/password"\
"SELECT column_name FROM user_tab_columns WHERE table_name = 'EMPLOYEES'"

2. XSU出力を、emp_columns.xmlというXMLファイルとして保存します。XMLは次のようになります。1つの<ROW>要素が表の各列に対応します(一部の<ROW>要素はスペース節約のために削除されています)。

<?xml version = '1.0'?><ROWSET>
<ROW num="1">
<COLUMN_NAME>EMPLOYEE_ID</COLUMN_NAME>
</ROW>
<ROW num="2">
<COLUMN_NAME>FIRST_NAME</COLUMN_NAME>
</ROW>
<!-- rows 3 through 10 -->
<ROW num="11">
<COLUMN_NAME>DEPARTMENT_ID</COLUMN_NAME>
</ROW>
</ROWSET>

3. XMLをHTMLに変換するスタイルシートを作成します。たとえば、columns.xslスタイルシートを次のように作成します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<HTML>
<xsl:apply-templates select="@*|node()"/>
</HTML>
</xsl:template>
<xsl:template match="ROW">
<xsl:value-of select="COLUMN_NAME"/>
<xsl:text>&nbsp;</xsl:text>
<INPUT NAME="{COLUMN_NAME}"/>
<BR/>
</xsl:template>
</xsl:stylesheet>

4. oraxslユーティリティを実行してHTMLフォームを生成します。次に例を示します。

oraxsl emp_columns.xml columns.xsl emp_form.htm

5. 出力HTMLフォームを確認します。このフォームのコンテンツは次のようになります。

<HTML>
EMPLOYEE_ID&nbsp;<INPUT NAME="EMPLOYEE_ID"><BR>
FIRST_NAME&nbsp;<INPUT NAME="FIRST_NAME"><BR>
LAST_NAME&nbsp;<INPUT NAME="LAST_NAME"><BR>
EMAIL&nbsp;<INPUT NAME="EMAIL"><BR>
PHONE_NUMBER&nbsp;<INPUT NAME="PHONE_NUMBER"><BR>
HIRE_DATE&nbsp;<INPUT NAME="HIRE_DATE"><BR>
JOB_ID&nbsp;<INPUT NAME="JOB_ID"><BR>
SALARY&nbsp;<INPUT NAME="SALARY"><BR>
COMMISSION_PCT&nbsp;<INPUT NAME="COMMISSION_PCT"><BR>
MANAGER_ID&nbsp;<INPUT NAME="MANAGER_ID"><BR>
DEPARTMENT_ID&nbsp;<INPUT NAME="DEPARTMENT_ID"><BR>
</HTML>

7 Schema Processor for Javaの使用

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

- XML検証の概要

- XML Schema Processorの使用: 概要

- XMLスキーマを使用したXMLの検証

- XMLスキーマを使用したプログラミングのヒントと方法

XML検証の概要

この項では、XML検証の様々な方法について説明します。内容は次のとおりです。

- 前提条件

- 標準と仕様

- DTDを使用したXML検証

- XMLスキーマを使用したXML検証

- XMLスキーマとDTDの違い

前提条件

この章では、次のテクノロジについて実用的な知識があることを前提にしています。

- Document Type Definition (DTD): XML DTDは、XML文書の有効な構造を定義します。

- XMLスキーマ言語: XMLスキーマは、XML文書の有効な構造を定義します。

これらのテクノロジを十分に理解していない場合や、知識を更新する必要がある場合は、「はじめに」の「関連ドキュメント」にあるXMLの資料を参照してください。

関連項目:

- http://www.w3schools.com/dtd/にあるDTDのチュートリアル

- http://www.w3schools.com/schemaにあるXML Schema言語のチュートリアル

標準と仕様

XML SchemaはW3C標準です。XML Schemaの仕様は次の場所にあります。

- http://www.w3.org/TR/xmlschema-0/(W3C XML Schemaの入門書)

- http://www.w3.org/TR/xmlschema-1/(XML Schema言語の構造の定義)

- http://www.w3.org/TR/xmlschema-2/(XML Schema言語のデータ型の定義)

Oracle XML Schema Processorは、W3CのXML Schema仕様をサポートしています。

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

DTDを使用したXML検証

DTDは、最初はSGML用に開発されました。XML DTDは、SGMLで使用可能なDTDのサブセットであり、XMLマークアップに対する制約を宣言するためのメカニズムを提供します。XML DTDによって、次のものを指定できます。

- XML文書で使用できる要素。

- XML要素のコンテンツ・モデル。つまり、要素にデータのみが含まれるか、またはその構造を定義するサブ要素のセットを含むか。DTDでは、サブ要素がオプションと必須のどちらであるか、またサブ要素の出現が1回のみか複数回可能かを定義します。

- XML要素の属性。DTDでは、属性がオプションと必須のどちらであるかも指定できます。

- XML文書で有効なエンティティ。

XML DTD自体はXMLで記述されているのではなく、XML文書の構造を定義するための、コンテキストに依存しない文法です。DTDは、XML文書内で、またはXML文書とは別のファイルで宣言できます。

検証とは、関連するDTDに対してXML文書が妥当であるかどうかを検証して、構造、要素の使用方法および属性の使用方法がDTDの定義と一致していることを確認するプロセスです。XML文書を処理するアプリケーションでは、検証によって、データと定義が一致することを想定できます。

XDKを使用することにより、検証XMLパーサー(XML文書を解析して、その文書がDTDに対して妥当かどうかを検証するプログラム)を含むアプリケーションを作成できます。DTD検証を実行するパーサーの次の側面に注意してください。

- 実装に応じて、検証パーサーはエラーの発生時に処理を停止または続行できます。

- 検証パーサーは、警告およびエラーが発生すると、処理の最後にこれらを要約形式で報告できます。

- ほとんどのプロセッサでは検証モードを有効または無効にできますが、いずれの場合もエンティティ定義とDTDのその他の構成メンバーは処理する必要があります。

XDKでのDTDの例

例7-1に、family.dtdという名前のDTDのコンテンツを示します。このDTDは$ORACLE_HOME/xdk/demo/java/parser/common/にあります。<ELEMENT>タグでは文書内の要素の有効な名称および構造を指定し、<ATTLIST>タグでは要素の有効な属性を指定します。

例7-1 family.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT family (member*)>
<!ATTLIST family lastname CDATA #REQUIRED>
<!ELEMENT member (#PCDATA)>
<!ATTLIST member memberid ID #REQUIRED>
<!ATTLIST member dad IDREF #IMPLIED>
<!ATTLIST member mom IDREF #IMPLIED>

例7-2に、family.xmlという名前のXML文書のコンテンツを示します。このXML文書は$ORACLE_HOME/xdk/demo/java/parser/common/にあります。family.xmlの<!DOCTYPE>要素では、このXML文書がfamily.dtdという名前の外部DTDに準拠することを指定します。

例7-2 family.xml

<?xml version="1.0" standalone="no"?>
<!DOCTYPE family SYSTEM "family.dtd">
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>

XMLスキーマを使用したXML検証

XML Schema定義とも呼ばれるXML Schema言語は、XML構文を使用してXML文書のコンテンツおよび構造を記述するためにW3Cで作成されました。XMLスキーマは、XML Schema言語で記述されたXML文書です。XMLスキーマ文書には、入力XML文書の構造を記述するインスタンス・ドキュメントと呼ばれるルールが含まれています。インスタンス・ドキュメントは、XMLスキーマのルールに準拠する場合のみ有効です。

XML Schema言語では、次のようなことを定義します。

- インスタンス・ドキュメントで有効な要素および属性

- 他の要素の子にすることのできる要素

- 子要素の順序と数

- 要素と属性のデータ型

- 要素と属性のデフォルト値と固定値

検証XMLパーサーは、インスタンス・ドキュメントが関連XMLスキーマのルールに準拠しているかどうかの判断を試行します。XDKを使用することにより、このスキーマ検証を実行する検証パーサーを作成できます。スキーマ検証を実行するパーサーの次の側面に注意してください。

- 実装に応じて、パーサーはエラーの発生時に処理を停止または続行できます。

- パーサーは、警告およびエラーが発生すると、処理の最後にこれらを要約形式で報告できます。

- プロセッサは、インスタンス・ドキュメントによって含められたDTDに定義されているエンティティ定義およびその他の構成メンバーを考慮する必要があります。XML Schema言語では、インスタンス・ドキュメントにXMLスキーマとDTDの両方が含まれる場合に何を行う必要があるかは定義されていません。したがって、このような場合のアプリケーションの動作は実装によって決まります。

XDKでのXML Schemaの例

例7-3に、異なる地域で注文された部品を記述する購入レポートを含むサンプルXML文書を示します。このサンプル・ファイルは、$ORACLE_HOME/xdk/demo/java/schema/report.xmlにあります。

例7-3 report.xml

<purchaseReport
xmlns="http://www.example.com/Report"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/Report  report.xsd"
period="P3M" periodEnding="1999-12-31">

<regions>
<zip code="95819">
<part number="872-AA" quantity="1"/>
<part number="926-AA" quantity="1"/>
<part number="833-AA" quantity="1"/>
<part number="455-BX" quantity="1"/>
</zip>
<zip code="63143">
<part number="455-BX" quantity="4"/>
</zip>
</regions>
<parts>
<part number="872-AA">Lawnmower</part>
<part number="926-AA">Baby Monitor</part>
<part number="833-AA">Lapis Necklace</part>
<part number="455-BX">Sturdy Shelves</part>
</parts>
</purchaseReport>

例7-4に、report.xsdという名前のXMLスキーマ・ドキュメントを示します。このドキュメントは、report.xmlの検証に使用できるサンプルXMLスキーマ・ドキュメントです。XMLスキーマは特に、インスタンス・ドキュメントで有効な要素の名前と、要素に含めることのできるデータ型を定義します。

例7-4 report.xsd

<schema targetNamespace="http://www.example.com/Report"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:r="http://www.example.com/Report"
elementFormDefault="qualified">

<annotation>
<documentation xml:lang="en">
Report schema for Example.com
Copyright 2000 Example.com. All rights reserved.
</documentation>
</annotation>

<element name="purchaseReport">
<complexType>
<sequence>
<element name="regions" type="r:RegionsType">
<keyref name="dummy2" refer="r:pNumKey">
<selector xpath="r:zip/r:part"/>
<field xpath="@number"/>
</keyref>
</element>

<element name="parts" type="r:PartsType"/>
</sequence>
<attribute name="period"       type="duration"/>
<attribute name="periodEnding" type="date"/>
</complexType>

<unique name="dummy1">
<selector xpath="r:regions/r:zip"/>
<field xpath="@code"/>
</unique>

<key name="pNumKey">
<selector xpath="r:parts/r:part"/>
<field xpath="@number"/>
</key>
</element>
<complexType name="RegionsType">
<sequence>
<element name="zip" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="part" maxOccurs="unbounded">
<complexType>
<complexContent>
<restriction base="anyType">
<attribute name="number"   type="r:SKU"/>
<attribute name="quantity" type="positiveInteger"/>
</restriction>
</complexContent>
</complexType>
</element>
</sequence>
<attribute name="code" type="positiveInteger"/>
</complexType>
</element>
</sequence>
</complexType>

<simpleType name="SKU">
<restriction base="string">
<pattern value="\d{3}-[A-Z]{2}"/>
</restriction>
</simpleType>

<complexType name="PartsType">
<sequence>
<element name="part" maxOccurs="unbounded">
<complexType>
<simpleContent>
<extension base="string">
<attribute name="number" type="r:SKU"/>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>

</schema>

XMLスキーマとDTDの違い

XML Schema言語には、DTD仕様のほとんどの機能が含まれています。XMLスキーマはDTDと同様の目的を果しますが、文書制約の指定の柔軟性が高くなっています。表7-1に、2つの検証メカニズム間で機能の一部を比較します。

表7-1 XMLスキーマとDTDの機能の比較

機能

XMLスキーマ

DTD

要素のネスト

可

可

要素の出現の制約

可

可

許可される属性

可

可

属性タイプとデフォルト値

可

可

XMLでの記述

可

名前空間のサポート

可

組込みデータ型

可

ユーザー定義のデータ型

可

組込み/インポート

可

再定義(継承)

可

次に、DTD検証ではなくXMLスキーマ検証を選択する最大の理由を示します。

- XMLスキーマ言語では、要素と属性のコンテンツのルールを定義できます。データ型を使用してコンテンツを制御できます。XML Schemaのデータ型では、次のようなアクションを簡単に実行できます。

- どの要素にどのデータ型が含まれるかを宣言します。たとえば、ある要素に正の整数が含まれ、別の要素に年が含まれることを宣言します。

- データベースから取得したデータを処理します。

- 10から20までの数値など、データに対する制限を定義します。

- MM-DD-YYYY形式の日付など、データ形式を定義します。

- 文字列から日付など、異なるデータ型間でデータを変換します。

- DTDの文法とは異なり、XML Schema言語で記述された文書自体はXMLで記述されています。このため、次のアクションを実行できます。

- XMLパーサーを使用したXMLスキーマの解析

- XML DOMを使用したXMLスキーマの処理

- XSLTを使用したXML文書の変換

- 他のXMLスキーマでのXMLスキーマの再利用

- 要素と属性の追加によるXMLスキーマの拡張

- 同じ文書からの複数のXMLスキーマの参照

XML Schema Processorの使用: 概要

Oracle XML Schema ProcessorはSAXベースのXMLスキーマ・バリデータであり、XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証するために使用できます。プロセッサでは、LAXと厳密な検証の両方がサポートされています。

プロセッサは次の方法で使用できます。

- XMLパーサーで有効にします。

- DOMツリーで使用して、XML文書の全体または一部を検証します。

- 処理パイプライン(コンテンツ・ハンドラなど)でコンポーネントとして使用します。

要件に応じて、様々な方法でSchema Processorを構成できます。たとえば、次の操作を行うことができます。

- 固定のXMLスキーマを使用するか、インスタンス・ドキュメントのschemaLocation属性に基づいてスキーマを自動的に構築します。

- 検証プロセスをより詳細に制御できるようにXMLErrorおよびentityResolverを設定します。

- インスタンス・ドキュメントをどの程度検証するかを決定します。表4-1に示した検証モードのいずれかを使用できます。検証のルートとして要素の型を指定することもできます。

XML Schema Processorの使用: 基本プロセス

次のXDKパッケージは、XMLスキーマを処理するアプリケーションで重要です。

- XML解析用のAPIを提供するoracle.xml.parser.v2

- XMLスキーマ処理用のAPIを提供するoracle.xml.parser.schema

表7-2に、oracle.xml.parser.schemaパッケージの最も重要なクラスを示します。これらのクラスは、ほとんどのXMLスキーマ・アプリケーションのコアを形成します。

表7-2 oracle.xml.parser.schemaのクラス

クラス/インタフェース

説明

メソッド

XMLSchemaクラス

XML Schemaコンポーネント・モデルを表します。XMLSchemaオブジェクトは、様々なターゲット名前空間に属するXMLSchemaNodesのセットです。XSDValidatorクラスでは、スキーマ検証またはメタデータにXMLSchemaを使用します。

主要なメソッドは次のとおりです。

- getElement()やgetSchemaTargetNS()などのgetメソッドは、XMLスキーマに関する情報を取得します。

- printSchema()は、XMLスキーマに関する情報を出力します。

XMLSchemaNodeクラス

型定義、要素と属性の宣言、グループと属性グループの定義など、ターゲット名前空間内のスキーマ・コンポーネントを表します。

主要なメソッドはgetElementSet()などのgetメソッドであり、getAttributeDeclarations()はXMLスキーマのコンポーネントを取得します。

XSDBuilderクラス

XMLスキーマ文書からXMLSchemaオブジェクトを作成します。XMLSchemaオブジェクトは、最上位レベルのスキーマ宣言および定義に対応するオブジェクト(Infoset項目)のセットです。スキーマ文書はXMLで解析され、DOMツリーに変換されます。

主要なメソッドは次のとおりです。

- build()は、XMLSchemaオブジェクトを作成します。

- getObject()は、XMLSchemaオブジェクトを戻します。

- setEntityResolver()は、インポートと組込みを解決するためのEntityResolverを設定します。

XSDValidatorクラス

XMLスキーマに対してXMLインスタンス・ドキュメントが妥当かどうかを検証します。登録されている場合、XSDValidatorオブジェクトはXMLParserとXMLDocumentのイベント・ハンドラ間にパイプライン・ノードとして挿入されます。

主要なメソッドは次のとおりです。

- getCurrentMode()やgetElementDeclaration()などのgetメソッド。

- setXMLProperty()やsetDocumentLocator()などのsetメソッド。

- startDocument()は、文書の開始に関する通知を受け取ります。

- startElement()は、要素の開始に関する通知を受け取ります。

図7-1 に、XML Schema Processorでインスタンス・ドキュメントを検証する基本プロセスを示します。

図7-1 XML Schema Processor

XML Schema Processorは、次の主要タスクを実行します。

1. ビルダー(XSDBuilderオブジェクト)が、入力XMLスキーマ文書からXMLスキーマを作成します。インスタンス・ドキュメントおよびスキーマは、特にオペレーティング・システムにファイルとして存在する必要はありませんが、一般にファイルと呼ばれます。これらは、バイト・ストリーム、データベース・レコードのフィールドまたはXML Infosetの情報項目のコレクションとして存在できます。
このタスクには、スキーマ文書のオブジェクトへの解析が含まれます。ビルダーは、スキーマ・オブジェクトを明示的または暗黙的に作成します。

- 明示的モードでは、プロセッサを起動するときにXMLスキーマを渡します。「外部参照XMLスキーマに対する検証」では、明示的モードでのスキーマ・オブジェクトの作成方法について説明しています。

- 暗黙的モードでは、スキーマがインスタンス・ドキュメントにより内部的に参照されているため、プロセッサの起動時にXMLスキーマを渡しません。「内部参照XMLスキーマに対する検証」では、暗黙的モードでのスキーマ・オブジェクトの作成方法について説明しています。

2. XMLスキーマ・バリデータでは、スキーマ・オブジェクトを使用してインスタンス・ドキュメントを検証します。このタスクには、次の手順が含まれます。

1. SAXパーサーは、インスタンス・ドキュメントをSAXイベントに解析し、これをバリデータに渡します。

2. バリデータは、SAXイベントを入力として受け取り、これらがスキーマ・オブジェクトに対して妥当かどうかを検証し、無効なXMLコンポーネントが見つかった場合はエラー・メッセージを送信します。
「XMLパーサーでの検証」では、インスタンス・ドキュメントの検証時に使用できる検証モードについて説明しています。XSDBuilderクラスを使用して検証用のスキーマを明示的に設定しない場合は、インスタンス・ドキュメントで正しいxsi:schemaLocation属性がスキーマ・ファイルを指している必要があります。そうでない場合、プログラムは検証を実行しません。プロセッサでエラーが発生した場合は、エラー・メッセージが生成されます。

3. バリデータは、入力SAXイベント、デフォルト値またはスキーマ検証後の情報をDOMビルダーまたはアプリケーションに送信します。

関連項目:

- XSDBuilder、DOMParserおよびSAXParserクラスの詳細は、Oracle Database XML Java APIリファレンスを参照してください

- XDK SAXおよびDOMパーサーの詳細は、第7章「Schema Processor for Javaの使用」を参照してください。

XML Schema Processorのデモ・プログラムの実行

XML Schema Processor for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/schemaに含まれています。表7-3で、XML Schema Processorのテストに使用できるXMLファイルとプログラムについて説明します。

表7-3 XML Schemaのサンプル・ファイル

ファイル

説明

cat.xsd

catalogue.xmlを検証するためにXSDSetSchema.javaプログラムで使用されるサンプルXMLスキーマ。cat.xsdスキーマは、書籍のカタログの構造を指定します。

catalogue.xml

cat.xsdスキーマに対して妥当かどうかを検証するためにXSDSetSchema.javaプログラムで使用されるサンプル・インスタンス・ドキュメント。

catalogue_e.xml

XSDSample.javaプログラムで使用されるサンプル・インスタンス・ドキュメント。プログラムは、cat.xsdスキーマに対してこのドキュメントが妥当かどうかの検証を試行すると、スキーマ・エラーを生成します。

DTD2Schema.java

このサンプル・プログラムは、DTD(第1引数)をXML Schemaに変換し、これを使用してXMLファイル(第2引数)を検証します。

embeded_xsql.xsd

XSDLax.javaで使用されるXMLスキーマ。スキーマでは、XSQLページの構造を定義します。

embeded_xsql.xml

XSDLax.javaで使用されるインスタンス・ドキュメント。

juicer1.xml

xsdproperty.javaで使用するサンプルXML文書。この文書を定義するXMLスキーマはjuicer1.xsdです。

juicer1.xsd

xsdproperty.javaで使用するサンプルXMLスキーマ。このXMLスキーマは、juicer1.xmlを定義します。

juicer2.xml

xsdproperty.javaで使用するサンプルXML文書。この文書を定義するXMLスキーマはjuicer2.xsdです。

juicer2.xsd

xsdproperty.javaで使用するサンプルXML文書。このXMLスキーマは、juicer2.xmlを定義します。

report.xml

XMLスキーマreport.xsdに対して妥当かどうかを検証するためにXSDSetSchema.javaで使用されるサンプルXMLファイル。

report.xsd

report.xmlのコンテンツを検証するためにXSDSetSchema.javaプログラムで使用されるサンプルXMLスキーマ。report.xsdスキーマは、発注書の構造を指定します。

report_e.xml

プログラムは、XSDSample.javaを使用してこのサンプルXMLファイルを検証すると、XML Schemaエラーを生成します。

xsddom.java

このプログラムは、ドキュメントのDOM表現を取得し、XSDValidatorオブジェクトを使用してこれを検証することにより、インスタンス・ドキュメントを検証する方法を示します。

xsdent.java

このプログラムは、SchemaLocation属性で参照されているスキーマをローカル・バージョンにリダイレクトすることにより、XML文書を検証します。

xsdent.xml

このXML文書は書籍を記述します。ファイルは、xsdent.javaへの入力として使用されます。

xsdent.xsd

このXMLスキーマ文書は、xsdent.xmlのルールを定義します。スキーマ文書には、xsdent-1.xsdに設定されたschemaLocation属性が含まれています。

xsdent-1.xsd

xsdent.xsdのschemaLocation属性により参照されているXMLスキーマ文書。

xsdproperty.java

このデモは、複合型または要素宣言に基づいてXML文書を検証するようにXML Schema Processorを構成する方法を示します。

xsdsax.java

このデモは、SAXストリームとして受け取ったXML文書の検証方法を示します。

XSDLax.java

このデモは、XSDSetSchema.javaと同じですが、SCHEMA_LAX_VALIDATIONフラグをLAX検証用に設定します。

XSDSample.java

このプログラムは、XMLインスタンス・ドキュメントの処理に使用できるサンプル・ドライバです。

XSDSetSchema.java

このプログラムは、schemaLocationをオーバーライドすることでXMLインスタンス・ドキュメントを処理するためのサンプル・ドライバです。プログラムでは、cat.xsdのXML Schema仕様を使用して、catalogue.xmlのコンテンツを検証します。

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

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

2. コマンドラインでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。

3. xmlparserv2.jar、xschema.jarおよび現在のディレクトリをCLASSPATHに追加します。これらのJARファイルは$ORACLE_HOME/lib(UNIXの場合)および%ORACLE_HOME%\lib(Windowsの場合)にあります。たとえば、CLASSPATHは、UNIXのtcshシェルで次のように設定できます。

setenv CLASSPATH
"$CLASSPATH":$ORACLE_HOME/lib/xmlparserv2.jar:$ORACLE_HOME/lib/schema.jar:.

XML Schema ProcessorにはJDKバージョン1.2以上が必要であり、Java 1.2をサポートしている任意のオペレーティング・システムで使用できます。

4. ディレクトリに含まれているXMLファイルを使用してサンプル・プログラムを実行します。

- 次の例では、report.xsdを使用して、report.xmlのコンテンツを検証します。

java XSDSample report.xml
java XSDSetSchema report.xsd report.xml

- 次の例では、Laxモードでインスタンス・ドキュメントを検証します。

java XSDLax embeded_xsql.xsd embeded_xsql.xml

- 次の例では、cat.xsdを使用して、catalogue.xmlのコンテンツを検証します。

java XSDSample catalogue.xml
java XSDSetSchema cat.xsd catalogue.xml

- 次の例では、エラー・メッセージを生成します。

java XSDSample catalogue_e.xml
java XSDSample report_e.xml

- 次の例では、xsdent.xsdのschemaLocation属性を使用して、XMLスキーマを検証のためにxsdent-1.xsdにリダイレクトします。

java xsdent xsdent.xml xsdent.xsd

- 次の例では、report.xmlからSAXストリームを生成し、report.xsdで定義されているXMLスキーマに対して妥当かどうかを検証します。

java xsdsax report.xsd report.xml

- 次の例では、report.xmlのDOM表現を作成し、report.xsdで定義されているXMLスキーマに対して妥当かどうかを検証します。

java xsddom report.xsd report.xml

- 次の例では、要素宣言または複合型定義から開始する検証を構成します。

java xsdproperty juicer1.xml juicer1.xsd http://www.juicers.org \
juicersType false > juicersType.out

java xsdproperty juicer2.xml juicer2.xsd http://www.juicers.org \
Juicers true > juicers_e.out

- 次の例では、DTD(dtd2schema.dtd)をXMLスキーマに変換し、これを使用してインスタンス・ドキュメント(dtd2schema.xml)を検証します。

java DTD2Schema dtd2schema.dtd dtd2schema.xml

XML Schema Processorコマンドライン・ユーティリティの使用

「XML Parserコマンドライン・ユーティリティの使用」では、oraxmlコマンドライン・ユーティリティの実行方法を説明しています。このユーティリティを使用して、XMLスキーマとDTDに対してインスタンス・ドキュメントが妥当かどうかを検証できます。

oraxmlを使用したスキーマに対する検証

$ORACLE_HOME/xdk/demo/java/schemaディレクトリに変更します。例7-5に、コマンドラインで次のコマンドを実行することにより、report.xmlがreport.xsdに対して妥当かどうかを検証する方法を示します。

例7-5 oraxmlを使用したスキーマに対する検証

oraxml -schema -enc report.xml

取得される出力は次のとおりです。

The encoding of the input file: UTF-8
The input XML file is parsed without errors using Schema validation mode.

oraxmlを使用したDTDに対する検証

$ORACLE_HOME/xdk/demo/java/parser/commonディレクトリに変更します。例7-6に、コマンドラインで次のコマンドを実行することにより、family.xmlがfamily.dtdに対して妥当かどうかを検証する方法を示します。

例7-6 oraxmlを使用したDTDに対する検証

oraxml -dtd -enc family.xml

取得される出力は次のとおりです。

The encoding of the input file: UTF-8
The input XML file is parsed without errors using DTD validation mode.

XMLスキーマを使用したXMLの検証

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

- 内部参照XMLスキーマに対する検証

- 外部参照XMLスキーマに対する検証

- XML文書のサブセクションの検証

- SAXストリームからのXMLの検証

- DOMからのXMLの検証

- 設計した型および要素からのXMLの検証

- XSDValidator BeanによるXMLの検証

内部参照XMLスキーマに対する検証

$ORACLE_HOME/xdk/demo/java/schema/XSDSample.javaプログラムは、暗黙的なXMLスキーマに対して妥当かどうかを検証する方法を示します。XMLスキーマはインスタンス・ドキュメント自体で参照されているため、検証モードは暗黙的です。

この項の手順に従って、oracle.xml.parser.v2.DOMParserクラスのsetValidationMode()メソッドを使用するプログラムを作成します。

1. インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。XSDSample.javaの次のコード部分は、DOMParserオブジェクトの作成方法を示します。

public class XSDSample
{
public static void main(String[] args) throws Exception
{
if (args.length != 1)
{
System.out.println("Usage: java XSDSample <filename>");
return;
}
process (args[0]);
}

public static void process (String xmlURI) throws Exception
{
DOMParser dp  = new DOMParser();
URL       url = createURL(xmlURI);
...
}
...
}

createURL()は、プログラムに引数として渡されるファイル名からURLを構築するヘルパー・メソッドです。

2. DOMParser.setValidationMode()メソッドを使用して検証DOMパーサーの検証モードを設定します。たとえば、XSDSample.javaはXMLスキーマ検証の指定方法を示します。

dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
dp.setPreserveWhitespace(true);

3. DOMParser.setErrorStream()メソッドを使用して出力エラー・ストリームを設定します。たとえば、XSDSample.javaはDOMパーサー・オブジェクトのエラー・ストリームを次のように設定します。

dp.setErrorStream (System.out);

4. DOMParser.parse()メソッドを使用してインスタンス・ドキュメントを検証します。スキーマはインスタンス・ドキュメントにより内部的に参照されているため、XMLスキーマ・オブジェクトを明示的に作成する必要はありません。たとえば、XSDSample.javaはインスタンス・ドキュメントを次のように検証します。

try
{
System.out.println("Parsing "+xmlURI);
dp.parse(url);
System.out.println("The input file <"+xmlURI+"> parsed without errors");
}
catch (XMLParseException pe)
{
System.out.println("Parser Exception: " + pe.getMessage());
}
catch (Exception e)
{
System.out.println("NonParserException: " + e.getMessage());
}

外部参照XMLスキーマに対する検証

$ORACLE_HOME/xdk/demo/java/schema/XSDSetSchema.javaプログラムは、XMLスキーマを明示的に検証する方法を示します。XSDBuilderクラスを使用して検証用のスキーマを指定するため、検証モードは明示的です。暗黙的な検証の場合とは異なり、スキーマはインスタンス・ドキュメントでは指定されません。

この項の基本手順に従って、oracle.xml.parser.schema.XSDBuilderクラスのbuild()メソッドを使用するJavaプログラムを作成します。

1. XSDBuilder.build()メソッドを使用して、XMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。XSDSetSchema.javaの次のコード部分は、オブジェクトの作成方法を示します。

public class XSDSetSchema
{
public static void main(String[] args) throws Exception
{
if (args.length != 2)
{
System.out.println("Usage: java XSDSample <schema_file> <xml_file>");
return;
}

XSDBuilder builder = new XSDBuilder();
URL    url =  createURL(args[0]);

// Build XML Schema Object
XMLSchema schemadoc = (XMLSchema)builder.build(url);
process(args[1], schemadoc);
}
. . .

createURL()メソッドは、コマンドラインで指定されたスキーマ文書ファイル名からURLを構築するヘルパー・メソッドです。

2. インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。XSDSetSchema.javaの次のコードは、インスタンス・ドキュメントのファイル名とXMLスキーマ・オブジェクトをprocess()メソッドに渡す方法を示します。

public static void process(String xmlURI, XMLSchema schemadoc)throws Exception{
DOMParser dp  = new DOMParser();
URL       url = createURL (xmlURI);
. . .

3. DOMParser.setXMLSchema()メソッドを使用して、検証に使用するスキーマ・オブジェクトを指定します。暗黙的検証モードでは、インスタンス・ドキュメントがすでにスキーマを参照しているため、この手順は不要です。たとえば、XSDSetSchema.javaはスキーマを次のように指定します。

dp.setXMLSchema(schemadoc);

4. DOMParser.setValidationMode()メソッドを使用してDOMパーサー・オブジェクトの検証モードを設定します。たとえば、XSDSample.javaはXMLスキーマ検証の指定方法を示します。

dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
dp.setPreserveWhitespace(true);

5. DOMParser.setErrorStream()メソッドを使用してパーサーの出力エラー・ストリームを設定します。たとえば、XSDSetSchema.javaは出力エラー・ストリームを次のように設定します。

dp.setErrorStream (System.out);

6. DOMParser.parse()メソッドを使用して、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。たとえば、XSDSetSchema.javaには次のコードが含まれます。

try
{
System.out.println("Parsing "+xmlURI);
dp.parse (url);
System.out.println("The input file <"+xmlURI+"> parsed without errors");
}
catch (XMLParseException pe)
{
System.out.println("Parser Exception: " + pe.getMessage());
}
catch (Exception e)
{
System.out.println ("NonParserException: " + e.getMessage());
}

XML文書のサブセクションの検証

LAXモードでは、文書全体を検証せずに、インスタンス・ドキュメントのXMLコンテンツの一部を検証できます。LAXパーサーは、関連するXMLスキーマで宣言されているインスタンス・ドキュメントの要素に対してプロセッサが検証を実行する必要があることを示します。プロセッサは、スキーマで宣言された要素がインスタンス・ドキュメントに含まれていない場合でも、そのインスタンス・ドキュメントを無効とみなしません。

LAXモードを使用することにより、XMLの検証対象部分に対してのみスキーマを定義できます。$ORACLE_HOME/xdk/demo/java/schema/XSDLax.javaプログラムは、LAX検証の使用方法を示します。このプログラムは、「外部参照XMLスキーマに対する検証」で説明している基本手順を実行します。

1. ユーザー指定のXMLスキーマ文書から、XMLスキーマ・オブジェクトを作成します。

2. インスタンス・ドキュメントの検証に使用するDOMパーサーを作成します。

3. 検証に使用するXMLスキーマを指定します。

4. DOMパーサー・オブジェクトの検証モードを設定します。

5. パーサーの出力エラー・ストリームを設定します。

6. DOMParser.parse()をコールすることにより、XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証します。

LAX検証を有効にするには、パーサーの検証モードをSCHEMA_VALIDATIONではなくSCHEMA_LAX_VALIDATIONに設定します。XSDLax.javaの次のコード部分は、この方法を示しています。

dp.setXMLSchema(schemadoc);
dp.setValidationMode(XMLParser.SCHEMA_LAX_VALIDATION);
dp.setPreserveWhitespace (true);
. . .

サンプル・プログラムを次のように実行することにより、LAX検証をテストできます。

java XSDLax embeded_xsql.xsd embeded_xsql.xml

SAXストリームからのXMLの検証

$ORACLE_HOME/xdk/demo/java/schema/xsdsax.javaプログラムは、SAXストリームとして受け取ったXML文書を検証する方法を示します。XSDValidatorをインスタンス化し、SAXパーサーにコンテンツ・ハンドラとして登録します。

この項の手順に従って、SAXストリームからXMLを検証するプログラムを作成します。

1. XSDBuilder.build()メソッドを起動することにより、ユーザー指定のXMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。次のコード部分は、オブジェクトの作成方法を示します。

XSDBuilder builder = new XSDBuilder();
URL    url =  XMLUtil.createURL(args[0]);

// Build XML Schema Object
XMLSchema schemadoc = (XMLSchema)builder.build(url);
process(args[1], schemadoc);
. . .

createURL()は、コマンドラインで指定されたファイル名からURLを作成するヘルパー・メソッドです。

2. インスタンス・ドキュメントの検証に使用するSAXパーサー(SAXParserオブジェクト)を作成します。saxxsd.javaの次のコード部分は、XML文書とスキーマ文書へのハンドルをprocess()メソッドに渡します。

process(args[1], schemadoc);...public static void process(String xmlURI, XMLSchema schemadoc)
throws Exception
{
SAXParser dp  = new SAXParser();
...

3. SAXパーサーを構成します。次のコード部分は、XSDBuilder.setValidationMode()メソッドを使用してSAXパーサー・オブジェクトの検証モードを設定します。

dp.setPreserveWhitespace (true);
dp.setValidationMode(XMLParser.NONVALIDATING);

4. バリデータ(XSDValidatorオブジェクト)を作成して構成します。次のコード部分は、この方法を示します。

XMLError err;... err = new XMLError();
...
XSDValidator validator = new XSDValidator();
...
validator.setError(err);

5. XSDBuilder.setXMLProperty()メソッドを起動することにより、検証に使用するXMLスキーマを指定します。最初の引数はプロパティの名前(fixedSchema)で、2番目の引数はXMLスキーマ・オブジェクトへの参照です。次のコード部分は、この方法を示します。

validator.setXMLProperty(XSDNode.FIXED_SCHEMA, schemadoc);
...

6. バリデータをパーサーのSAXコンテンツ・ハンドラとして登録します。次のコード部分は、この方法を示します。

dp.setContentHandler(validator);
...

7. SAXParser.parse()メソッドを起動することにより、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。次のコード部分は、この方法を示します。

dp.parse (url);

DOMからのXMLの検証

$ORACLE_HOME/xdk/demo/java/schema/xsddom.javaプログラムは、ドキュメントのDOM表現を取得し、XSDValidatorオブジェクトを使用してこれを検証することにより、インスタンス・ドキュメントを検証する方法を示します。

xsddom.javaプログラムは次の手順を実行します。

1. XSDBuilder.build()メソッドを起動することにより、ユーザー指定のXMLスキーマ文書からXMLスキーマ・オブジェクトを作成します。次のコード部分は、オブジェクトの作成方法を示します。

XSDBuilder builder = new XSDBuilder();
URL    url =  XMLUtil.createURL(args[0]);

XMLSchema schemadoc = (XMLSchema)builder.build(url);
process(args[1], schemadoc);

createURL()は、コマンドラインで指定されたファイル名からURLを作成するヘルパー・メソッドです。

2. インスタンス・ドキュメントの検証に使用するDOMパーサー(DOMParserオブジェクト)を作成します。domxsd.javaの次のコード部分は、XML文書とスキーマ文書へのハンドルをprocess()メソッドに渡します。

process(args[1], schemadoc);...public static void process(String xmlURI, XMLSchema schemadoc)
throws Exception
{
DOMParser dp  = new DOMParser();
. . .

3. DOMパーサーを構成します。次のコード部分は、DOMParser.setValidationMode()メソッドを使用してパーサー・オブジェクトの検証モードを設定します。

dp.setPreserveWhitespace (true);
dp.setValidationMode(XMLParser.NONVALIDATING);
dp.setErrorStream (System.out);

4. インスタンス・ドキュメントを解析します。次のコード部分は、この方法を示します。

dp.parse (url);

5. 入力文書のDOM表現を取得します。次のコード部分は、この方法を示します。

XMLDocument doc = dp.getDocument();

6. バリデータ(XSDValidatorオブジェクト)を作成して構成します。次のコード部分は、この方法を示します。

XMLError err;... err = new XMLError();
...
XSDValidator validator = new XSDValidator();
...
validator.setError(err);

7. XSDBuilder.setXMLProperty()メソッドを起動することにより、検証に使用するスキーマ・オブジェクトを指定します。最初の引数はプロパティの名前(この例ではfixedSchema)で、2番目の引数はスキーマ・オブジェクトへの参照です。次のコード部分は、この方法を示します。

validator.setXMLProperty(XSDNode.FIXED_SCHEMA, schemadoc);
. . .

8. DOMツリーのルート要素(XMLElement)を取得し、検証します。次のコード部分は、この方法を示します。

XMLElement root = (XMLElement)doc.getDocumentElement();
XMLElement copy = (XMLElement)root.validateContent(validator, true);
copy.print(System.out);

設計した型および要素からのXMLの検証

$ORACLE_HOME/xdk/demo/java/schema/xsdproperty.javaプログラムは、複合型または要素宣言に基づいてXML文書を検証するようにXML Schema Processorを構成する方法を示します。

xsdproperty.javaプログラムは次の手順を実行します。

1. インスタンス・ドキュメント名、XMLスキーマ名、ルート・ノードの名前空間、ルート・ノードのローカル名、および要素または複合型の指定("true"はルート・ノードが要素宣言であることを意味します)に関するStringオブジェクトを作成します。次のコード部分は、この方法を示します。

String xmlfile = args[0];
String xsdfile =  args[1];
...
String ns = args[2]; //namespace for the root node
String nm = args[3]; //root node's local name
String el = args[4]; //true if root node is element declaration,
// otherwise, the root node is a complex type

2. XSDビルダーを作成し、それを使用してスキーマ・オブジェクトを作成します。次のコード部分は、この方法を示します。

XSDBuilder builder = new XSDBuilder();
URL    url =  XMLUtil.createURL(xsdfile);
XMLSchema  schema;
...
schema = (XMLSchema) builder.build(url);

3. ノードを取得します。ノードが要素宣言と複合型のどちらであるかに応じて異なるメソッドを起動します。

- ノードが要素宣言である場合は、ローカル名と名前空間をスキーマ・オブジェクトのgetElement()メソッドに渡します。

- ノードが要素宣言である場合は、名前空間、ローカル名およびルート複合型をスキーマ・オブジェクトのgetType()メソッドに渡します。

xsdproperty.javaは、次の制御構造を使用します。

QxName qname = new QxName(ns, nm);
...
XSDNode nd;
...
if (el.equals("true"))
{
nd = schema.getElement(ns, nm);
/* process ... */
}
else
{
nd = schema.getType(ns, nm, XSDNode.TYPE);
/* process ... */
}

4. ノードを取得した後で、新規パーサーを作成し、スキーマをパーサーに設定してスキーマ検証を有効にします。次のコード部分は、この方法を示します。

DOMParser dp  = new DOMParser();
URL       url = XMLUtil.createURL (xmlURI);

5. パーサー上のプロパティを設定し、URLを解析します。schemaValidatorProperty()メソッドを次のように起動します。

1. パーサーのルート要素または型プロパティを完全修飾名に設定します。
最上位レベルの要素宣言では、process1()メソッドで示されているように、プロパティ名をXSDNode.ROOT_ELEMENTに設定し、値をQNameに設定します。

最上位レベルの型定義では、process2()メソッドで示されているように、プロパティ名をXSDNode.ROOT_TYPEに設定し、値をQNameに設定します。

2. パーサーのルート・ノード・プロパティを要素または複合型ノードに設定します。
要素ノードでは、process3()メソッドで示されているように、プロパティ名をXSDNode.ROOT_NODEに設定し、値をXSDElementノードに設定します。

型ノードでは、process3()メソッドで示されているように、プロパティ名をXSDNode.ROOT_NODEに設定し、値をXSDComplexTypeノードに設定します。

次のコード部分はメソッドの起動順序を示します。

if (el.equals("true"))
{
nd = schema.getElement(ns, nm);
process1(xmlfile, schema, qname);
process3(xmlfile, schema, nd);
}
else
{
nd = schema.getType(ns, nm, XSDNode.TYPE);
process2(xmlfile, schema, qname);
process3(xmlfile, schema, nd);
}

処理メソッドは次のように実装されます。

static void process1(String xmlURI, XMLSchema schema, QxName qname)
throws Exception
{
/* create parser... */
dp.setXMLSchema(schema);
dp.setSchemaValidatorProperty(XSDNode.ROOT_ELEMENT, qname);
dp.setPreserveWhitespace (true);
dp.setErrorStream (System.out);
dp.parse (url);
...
}

static void process2(String xmlURI, XMLSchema schema, QxName qname)
throws Exception
{
/* create parser... */
dp.setXMLSchema(schema);
dp.setSchemaValidatorProperty(XSDNode.ROOT_TYPE, qname);
dp.setPreserveWhitespace (true);
dp.setErrorStream (System.out);
dp.parse (url);
...
}

static void process3(String xmlURI, XMLSchema schema, XSDNode node)
throws Exception
{
/* create parser... */

dp.setXMLSchema(schema);
dp.setSchemaValidatorProperty(XSDNode.ROOT_NODE, node);
dp.setPreserveWhitespace (true);
dp.setErrorStream (System.out);
dp.parse (url);
...
}

XSDValidator BeanによるXMLの検証

oracle.xml.schemavalidator.XSDValidator Beanは、oracle.xml.parser.schema.XSDValidatorクラスをカプセル化し、DOMツリーの検証機能を追加します。パーサーは、インスタンス・ドキュメントとXMLスキーマ文書のDOMツリーを構築し、インスタンス・ドキュメントがスキーマに対して妥当かどうかを検証します。

$ORACLE_HOME/xdk/demo/java/transviewerのXSDValidatorSample.javaプログラムは、XSDValidator Beanの使用方法を示します。

この項の基本手順に従って、XSDValidator Beanを使用するJavaプログラムを作成します。

1. DOMParser.parse()メソッドを使用してインスタンス・ドキュメントを解析します。XSDValidatorSample.javaの次のコード部分は、この方法を示します。

URL xmlinstanceurl, schemaurl;
XMLDocument xmldoc1,xmldoc2;

// get the URL for the input files
xmlinstanceurl = createURL(args[0]);
// Parse the XML Instance document first
xmldoc1 = parseXMLDocument(xmlinstanceurl);

createURL()は、ファイル名からURLを作成するヘルパー・メソッドです。parseXMLDocument()メソッドは、次のように、URLを入力として受け取り、DOMParser.parse()メソッドを使用して解析します。

DOMParser parser = new DOMParser();
parser.parse(xmlurl);
return parser.getDocument();

2. DOMParser.parse()メソッドを使用してXMLスキーマ文書を解析します。XSDValidatorSample.javaの次のコードは、この方法を示します。

schemaurl = createURL(args[1]);xmldoc2 = parseXMLDocument(schemaurl);

3. XSDBuilder.build()メソッドを使用して、解析したXMLスキーマからスキーマ・オブジェクトを作成します。XSDValidatorSample.javaの次のコード部分は、この方法を示します。

XSDBuilder xsdbuild =  new XSDBuilder();
. . .
xmlschema = (XMLSchema)xsdbuild.build(xmldoc2, createURL(args+"builder"));

4. XSDValidator.setSchema()メソッドに参照を渡すことにより、検証に使用するスキーマ・オブジェクトを指定します。XSDValidatorSample.javaの次のコード部分は、バリデータを作成し、スキーマを設定します。

XSDValidator xsdval = new XSDValidator();
. . .
xsdval.setSchema(xmlschema);

5. XSDValidator.setError()メソッドを起動することにより、バリデータのエラー出力ストリームを設定します。XSDValidatorSample.javaの次のコード部分は、オブジェクトの作成方法を示します。

Properties p = new Properties(System.getProperties());
p.load(new FileInputStream("demo.properties"));
System.setProperties(p);
. . .
XMLError err = new XMLError();
. . .
err.setErrorHandler(new DocErrorHandler());
. . .
xsdval.setError(err);

6. インスタンス・ドキュメントへの参照をXSDValidator.validate()メソッドに渡すことにより、インスタンス・ドキュメントがスキーマに対して妥当かどうかを検証します。たとえば、XSDValidatorSample.javaには次のコード部分が含まれます。

xsdval.validate(xmldoc1);

XMLスキーマを使用したプログラミングのヒントと方法

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

- エンティティ・リゾルバによるスキーマの場所のオーバーライド

- DTDからXMLスキーマへの変換

エンティティ・リゾルバによるスキーマの場所のオーバーライド

XSDBuilderは、スキーマを構築する場合に、schemaLocation属性でURLとして指定された他のスキーマを組み込みまたはインポートすることが必要な場合があります。表7-3で説明したxsdent.javaデモでは、この事例を示しています。xsdent.xmlファイルの文書要素には、次の属性が含まれます。

xsi:schemaLocation =  "http://www.example.com/BookCatalogue
xsdent.xsd">

xsdent.xsd文書には、次の要素が含まれます。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/BookCatalogue"
xmlns:catd = "http://www.example.com/Digest"
xmlns:cat  = "http://www.example.com/BookCatalogue"
elementFormDefault="qualified">
<import namespace = "http://www.example.com/Digest"
schemaLocation = "xsdent-1.xsd" />

場合によっては、<import>で指定したスキーマの場所をオーバーライドし、必要なスキーマ・ドキュメントをビルダーに提供することが必要になります。たとえば、スキーマ・ドキュメントを外部Webサイトからダウンロードし、それをデータベースに格納する場合があります。このような場合は、XSDBuilderにエンティティ・リゾルバを設定できます。XSDBuilderは、スキーマの場所をリゾルバに渡します。リゾルバは、InputStream、ReaderまたはURLをInputSourceとして戻します。ビルダーは、InputSourceからスキーマ・ドキュメントを読み取ることができます。

xsdent.javaプログラムは、エンティティ・リゾルバを使用してスキーマの場所をオーバーライドする方法を示します。EntityResolverインタフェースを実装し、エンティティ・リゾルバをインスタンス化し、それをXMLスキーマ・ビルダーに設定する必要があります。デモ・コードでは、sampleEntityResolver1はInputSourceをInputStreamとして戻しますが、sampleEntityResolver2はInputSourceをURLとして戻します。

次の基本手順に従います。

1. 新規XMLスキーマ・ビルダーを次のように作成します。

XSDBuilder builder = new XSDBuilder();

2. ビルダーをエンティティ・リゾルバに設定します。エンティティ・リゾルバは、EntityResolverインタフェースを実装するクラスです。リゾルバの目的は、XMLリーダーが、外部エンティティを組み込む前に、それらのエンティティをインターセプトできるようにすることです。次のコード部分は、エンティティ・リゾルバを作成し、それをビルダーに設定します。

builder.setEntityResolver(new sampleEntityResolver1());

sampleEntityResolver1クラスは、resolveEntity()メソッドを実装します。このメソッドを使用して、外部システム識別子をローカルURIにリダイレクトできます。このソース・コードは次のようになります。

class sampleEntityResolver1 implements EntityResolver
{
public InputSource resolveEntity (String targetNS,  String systemId)
throws SAXException, IOException
{
// perform any validation check if needed based on targetNS & systemId
InputSource mySource = null;
URL u = XMLUtil.createURL(systemId);
// Create input source with InputStream as input
mySource = new InputSource(u.openStream());
mySource.setSystemId(systemId);
return mySource;
}
}

sampleEntityResolver1はInputSourceをストリームで初期化することに注意してください。

3. XMLスキーマ・オブジェクトを作成します。この方法を示すコードは次のとおりです。

schemadoc = builder.build(url);

4. XMLスキーマに対してインスタンス・ドキュメントが妥当かどうかを検証します。プログラムは次の文を実行します。

process(xmlfile, schemadoc);

process()メソッドはDOMパーサーを作成して構成し、parse()メソッドを起動します。メソッドは次のように実装されます。

public static void process(String xmlURI, Object schemadoc)
throws Exception
{
DOMParser dp  = new DOMParser();
URL       url = XMLUtil.createURL (xmlURI);

dp.setXMLSchema(schemadoc);
dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
dp.setPreserveWhitespace (true);
dp.setErrorStream (System.out);
try {
dp.parse (url);
...
}

DTDからXMLスキーマへの変換

XML Schema言語の機能と柔軟性を利用して、既存のDTDをXML Schema文書に変換できます。XDK APIを使用して、この変換を実行できます。

$ORACLE_HOME/xdk/demo/java/schema/DTD2Schema.javaプログラムは、DTDの変換方法を示します。プログラムは次のようにテストできます。

java DTD2Schema dtd2schema.dtd dtd2schema.xml

次の基本手順に従って、DTDをXMLスキーマ文書に変換します。

1. DOMParser.parseDTD()メソッドを使用してDTDを解析します。DTD2Schema.javaの次のコード部分は、DTDオブジェクトの作成方法を示します。

XSDBuilder builder = new XSDBuilder();
URL dtdURL = createURL(args[0]);
DTD dtd = getDTD(dtdURL, "abc");

getDTD()メソッドは次のように実装されます。

private static DTD getDTD(URL dtdURL, String rootName)
throws Exception
{
DOMParser parser = new DOMParser();
DTD dtd;
parser.setValidationMode(true);
parser.setErrorStream(System.out);
parser.showWarnings(true);
parser.parseDTD(dtdURL, rootName);
dtd = (DTD)parser.getDoctype();
return dtd;
}

2. DTD.convertDTD2Sdhema()メソッドを使用して、DTDをXMLスキーマのDOMツリーに変換します。DTD2Schema.javaの次のコード部分は、この方法を示します。

XMLDocument dtddoc = dtd.convertDTD2Schema();

3. XMLDocument.print()メソッドを使用して、XMLスキーマのDOMツリーを出力ストリームに書き出します。DTD2Schema.javaの次のコード部分は、この方法を示します。

FileOutputStream fos = new FileOutputStream("dtd2schema.xsd.out");
dtddoc.print(fos);

4. XSDBuilder.build()メソッドを使用して、スキーマのDOMツリーからXMLスキーマ・オブジェクトを作成します。DTD2Schema.javaの次のコード部分は、この方法を示します。

XMLSchema schemadoc = (XMLSchema)builder.build(dtddoc, null);

5. DOMParser.parse()メソッドを使用して、インスタンス・ドキュメントがXMLスキーマに対して妥当かどうかを検証します。DTD2Schema.javaの次のコード部分は、この方法を示します。

validate(args[1], schemadoc);

validate()メソッドは次のように実装されます。

DOMParser dp  = new DOMParser();
URL       url = createURL (xmlURI);
dp.setXMLSchema(schemadoc);
dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
dp.setPreserveWhitespace (true);
dp.setErrorStream (System.out);
try
{
System.out.println("Parsing "+xmlURI);
dp.parse (url);
System.out.println("The input file <"+xmlURI+"> parsed without errors");
}
...

8 JAXB Class Generatorの使用

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

- JAXB Class Generatorの概要

- JAXB Class Generatorの使用: 概要

- JAXB Class Generatorを使用したXMLの処理

注意:
XMLデータのオブジェクト・バインディング機能を使用できるよう、新しいアプリケーションではJAXB Class Generatorを使用してください。Oracle9i Class Generator for Javaは非推奨です。Oracle Database 10gでは、下位互換性を保つためにOracle9iのClass Generatorがサポートされています。

JAXB Class Generatorの概要

この項では、Java Architecture for XML Binding (JAXB)の概要を示します。内容は次のとおりです。

- 前提条件

- 標準と仕様

- JAXBを使用したマーシャリングおよびアンマーシャリング

- JAXBでの検証

- JAXBのカスタマイズ

前提条件

この章では、次の内容を十分に理解していると想定します。

- Java Architecture for XML Binding (JAXB)。この章で説明する内容より詳しいJAXBの概要が必要な場合は、「はじめに」の「関連ドキュメント」に記載されているXMLの資料を参照してください。

- XMLスキーマ言語: 概要および関連資料へのリンクは、第7章「Schema Processor for Javaの使用」を参照してください。

標準と仕様

Oracle JAXBプロセッサは、JCP(Java Community Process)の推奨によるJSR-31「The Java Architecture for XML Binding (JAXB)」バージョン1.0を実装しています。

JAXB 1.0仕様のOracle Database XDK実装では、次のオプション機能をサポートしていません。

- Javadocの生成

- フェイルファスト検証

- 外部カスタマイズ・ファイル

- 仕様のセクションE.2で説明されているXML Schemaの概念

JSRは、JCPのJava Specification Requestです。JSRの説明は、次のURLにあります。

http://jcp.org/en/jsr/overview

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

JAXB Class Generatorの機能

JAXB Class Generator for Javaでは、XMLスキーマに対応するインタフェースおよび実装クラスを生成します。Java開発者にとっての主な利点は、XML文書とJavaコード間のマッピングの自動化です。この機能により、生成されたコードをプログラムで使用して、XMLデータの読取り、操作および再作成ができます。Javaクラスは拡張可能で、開発者は基礎となるXMLデータ構造に関する知識がなくてもXMLデータにアクセスできます。

つまり、Oracle JAXB Class Generatorを使用すると、JavaでのXMLアプリケーション開発に次の利点がもたらされます。

- 迅速性
スキーマからコードへの変換が自動化されるため、入力XMLスキーマからJavaコードを迅速に生成できます。

- 使いやすさ
自身でコードを最初から作成するかわりに、生成されたgetおよびsetメソッドをコールできます。

- 自動化されたデータ変換
Javaデータ型へのXML文書データの変換を自動化できます。

- カスタマイズ
JAXBには、XMLの要素と属性のバインディングをカスタマイズできる柔軟なフレームワークが用意されています。

JAXBを使用したマーシャリングおよびアンマーシャリング

JAXBは、XMLデータをJavaオブジェクトにマップするAPIおよびツール・セットです。JAXBは、XML文書をJava形式のプログラムで表すことにより、JavaプログラムからXML文書へのアクセスを簡略化します。

JAXB APIおよびツールを使用して、次の基本タスクを実行できます。

1. orajaxbコマンドライン・ユーティリティを使用して、XMLスキーマからJAXBクラスを生成し、コンパイルします。
JAXB Class Generatorを使用してJavaクラスを生成するには、XMLスキーマを提供する必要があります。JAXBではDTDがサポートされません。ただし、「DTDからXMLスキーマへの変換」で説明しているように、DTD2Schemaプログラムを使用してDTDをXMLスキーマに変換できます。後でJAXB Class Generatorを使用して、スキーマからクラスを生成できます。

JAXBコンパイラは、ソースXMLスキーマの制約にマップされるJavaクラスを生成します。クラスで実装されるgetおよびsetメソッドを使用して、スキーマの各種要素および属性のデータを取得および指定できます。

2. 生成されたクラスをJavaプログラムでインスタンス化することにより、XML文書を処理します。
具体的には、JAXBバインディング・フレームワークを使用するプログラムを作成して、次のタスクを実行できます。

1. XML文書をアンマーシャリングします。
JAXB仕様で説明されているように、アンマーシャリングとは、XML文書からJavaによって生成されたオブジェクトにデータを移動することと定義されています。

2. XML文書を検証します。
コンテンツをコンテンツ・ツリーにアンマーシャリングする前またはアンマーシャリング中に、検証を行うことができます。Javaオブジェクトに対して検証APIをコールすることにより、検証をオンデマンドで行うこともできます。「JAXBでの検証」を参照してください。

3. Javaコンテンツ・オブジェクトを変更します。
データ・オブジェクトのコンテンツ・ツリーは、ソースXML文書の構造とコンテンツを表します。クラスに対して定義されているsetメソッドを使用して、要素と属性のコンテンツを変更できます。

4. Javaコンテンツ・オブジェクトをXMLにマーシャリングします。
アンマーシャリングとは対照的に、マーシャリングとは、Javaクラスのインスタンスのコンテンツ・ツリーを全検索することによって、JavaオブジェクトからXML文書を作成することです。DOMツリー、SAXコンテンツ・ハンドラ、変換結果または出力ストリームをシリアライズできます。

JAXBでの検証

Javaコンテンツ・ツリーは、ツリーのマーシャリングによって有効なXML文書が生成されるときに、XMLスキーマに関して有効であるとみなされます。

JAXBアプリケーションでは、次の状況で検証を実行できます。

- アンマーシャリング時検証では、アンマーシャリング時のエラーおよび警告がアプリケーションに通知されます。アンマーシャリングに、エラーのない検証が含まれている場合、入力XML文書とJavaコンテンツ・ツリーは有効です。

- オンデマンド検証は、アプリケーションによって開始された場合、Javaコンテンツ・ツリーに対して実行されます。

- フェイルファスト検証は、setおよびgetメソッドを使用したJavaコンテンツ・ツリーの更新中に即時結果を戻します。「標準と仕様」で示されているように、フェイルファスト検証はJAXB 1.0仕様のオプション機能であり、JAXB Class GeneratorのXDK実装ではサポートされていません。

JAXBアプリケーションは、有効なJavaコンテンツ・ツリーをマーシャリングできる必要がありますが、マーシャリングAPIのいずれかをコールする前にJavaコンテンツ・ツリーが有効であることを確認する必要はありません。マーシャリング・プロセス自体は、コンテンツ・ツリーを検証しません。プログラムで行う必要があるのは、無効なコンテンツによりマーシャリングが失敗したときにjavax/xml/bind/MarshalExceptionをスローすることのみです。

JAXBのカスタマイズ

XMLスキーマで宣言された要素と型名は、常に最も有用なJavaクラス名を提供するとはかぎりません。JAXB仕様で説明されているカスタム・バインディング宣言を使用して、デフォルトのJAXBバインディングをオーバーライドできます。これらの宣言により、XMLスキーマのXML固有の制約を超えて、生成されたJAXBクラスをカスタマイズして、クラス名とパッケージ名のマッピングなどのJava固有の改良点を含めることができます。

スキーマに注釈を加えて、次のカスタマイズを実行できます。

- XML名をユーザー定義のJavaクラス名にバインドします。

- パッケージ、導出クラスおよびメソッドに名前を付けます。

- どの要素をどのクラスにバインドするかを選択します。

- 各属性および要素宣言を適切なコンテンツ・クラスのプロパティにバインドする方法を決定します。

- 各属性値のタイプまたはコンテンツ仕様を選択します。

表8-2に、JAXBのカスタマイズを示すデモ・プログラムをいくつか示します。

関連項目:

- http://java.sun.com/webservices/tutorial.htmlにあるJAXBのチュートリアルの第4章「Customizing JAXB Bindings」

- カスタマイズ・デモの詳細な説明は、「最上位レベル要素でのクラス名のカスタマイズ」を参照してください。

JAXB Class Generatorの使用: 概要

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

- JAXBプロセッサの使用: 基本プロセス

- XML Schema Processorのデモ・プログラムの実行

- JAXB Class Generatorコマンドライン・ユーティリティの使用

JAXBプロセッサの使用: 基本プロセス

XDK JAXB APIでは、次のパッケージが公開されています。

- javax.xml.bindは、アンマーシャリング、マーシャリングおよび検証を含むクライアント・アプリケーションのランタイム・バインディング・フレームワークを提供します。

- javax.xml.bind.utilは、役に立つクライアント・ユーティリティ・クラスを提供します。

表8-1に、javax.xml.bindパッケージの最も重要なクラスおよびインタフェースを示します。これらのクラスおよびインタフェースは、ほとんどのJAXBアプリケーションのコアを形成します。

表8-1 javax.xml.bindのクラスおよびインタフェース

クラス/インタフェース

説明

メソッド

JAXBContextクラス

JAXBバインディング・フレームワーク操作(アンマーシャリング、マーシャリングおよび検証)の実装に必要なXML/Javaバインディング情報の管理の抽象化を提供します。クライアント・アプリケーションは、newInstance()メソッドを起動することにより、このクラスの新規インスタンスを取得します。

主要なメソッドは次のとおりです。

- newInstance()はJAXBコンテンツ・クラスを作成します。このメソッドには、生成されたクラスを含むパッケージの名前を提供します。

- createMarshaller()は、コンテンツ・ツリーからXMLへの変換に使用できるMarshallerを作成します。

- createUnmarshaller()は、XMLからコンテンツ・ツリーへの変換に使用できるUnmarshallerを作成します。

- createValidator()は、Javaコンテンツ・ツリーがそのソース・スキーマに対して妥当かどうかを検証できるValidatorオブジェクトを作成します。

Marshallerインタフェース

Javaコンテンツ・ツリーのXMLデータへのシリアライズのプロセスを管理します。

主要なメソッドは次のとおりです。

- getEventHandler()は、現在のイベント・ハンドラまたはデフォルトのイベント・ハンドラを戻します。

- getProperty()は、Marshallerの基礎となる実装のプロパティを取得します。

- marshal()は、コンテンツ・ツリーをDOM、SAX2イベント、出力ストリーム、変換結果またはWriterにマーシャリングします。

- setEventHandler()は、Javaコンテンツ・ツリーがそのソース・スキーマに対して妥当かどうかを検証するValidatorオブジェクトを作成します。

Unmarshallerインタフェース

XMLデータを新規に作成されたJavaコンテンツ・ツリーにデシリアライズし、オプションとしてXMLデータのアンマーシャリング時に検証を行うプロセスを管理します。

主要なメソッドは次のとおりです。

- getEventHandler()は、現在のイベント・ハンドラまたはデフォルトのイベント・ハンドラを戻します。

- getUnmarshallerHandler()は、XMLパイプラインのコンポーネントとして役立つUnmarshallerハンドラ・オブジェクトを戻します。

- isValidating()は、Unmarshallerが検証モードに設定されているかどうかを示します。

- setEventHandler()は、アプリケーションがValidationEventHandlerを登録できるようにします。

- setValidating()は、Unmarshallerがアンマーシャリング操作時に検証を行う必要があるかどうかを指定します。

- marshal()は、指定されたファイル、URL、入力ストリーム、入力ソース、SAXまたはDOMからXMLデータをアンマーシャリングします。

Validatorインタフェース

実行時のコンテンツ・ツリーの検証を制御します。具体的には、このインタフェースはオンデマンド検証を制御します。オンデマンド検証により、クライアントは、Javaコンテンツ・ツリーで検出された検証エラーおよび警告に関するデータを受け取ることができます。

主要なメソッドは次のとおりです。

- getEventHandler()は、現在のイベント・ハンドラまたはデフォルトのイベント・ハンドラを戻します。

- setEventHandler()は、アプリケーションがValidationEventHandlerを登録できるようにします。

- validate()は、実行時にJavaコンテンツ・ツリーをオンデマンドで検証します。このメソッドは、Javaコンテンツ・ツリーの任意のサブツリーを検証できます。

- validateRoot()は、rootObjをルートとするJavaコンテンツ・ツリーを検証します。このメソッドを使用して、Javaコンテンツ・ツリー全体を検証できます。

図8-1に、JAXB Class Generatorを使用するフレームワークのプロセス・フローを示します。

図8-1 JAXB Class Generator for Java

図8-1に示したプロセスの基本ステージは次のとおりです。

1. XMLパーサーは、XMLスキーマを解析し、解析したデータをJAXB Class Generatorに送信します。

2. Class Generatorは、入力XMLスキーマに基づいてJavaクラスおよびインタフェースを作成します。
デフォルトでは、1つのXML要素または型宣言により1つのインタフェースと1つのクラスが生成されます。たとえば、スキーマが<anElement>という名前の要素を定義する場合、デフォルトでは、JAXB Class GeneratorはAnElement.javaという名前のソース・ファイルとAnElementImpl.javaという名前の別のファイルを生成します。カスタマイズ・バインディング宣言を使用して、XML SchemaコンポーネントからJava表現へのデフォルト・バインディングをオーバーライドできます。

3. Javaコンパイラは、.javaソース・ファイルをクラス・ファイルにコンパイルします。生成されたクラス、ソース・ファイルおよびアプリケーション・コードはすべてコンパイルする必要があります。

4. Javaアプリケーションでは、コンパイルされたクラスとバインディング・フレームワークを使用して、次のタイプのタスクを実行します。

- JAXBコンテキストを作成する。このコンテキストを使用して、MarshallerとUnmarshallerを作成します。

- XMLスキーマに対して有効なXMLデータを表すオブジェクト・ツリーを構築する。このタスクは、スキーマに準拠するXML文書からデータをアンマーシャリングするか、クラスをインスタンス化することにより実行できます。

- データにアクセスし変更する。

- オプションで、XML Schemaで表現された制約と比較し、データへの変更を検証する。

- データを新規XML文書にマーシャリングする。

関連項目:

- JAXB APIの詳細は、Oracle Database XML Java APIリファレンスを参照してください

- JAXB処理の詳細な説明は、「JAXB Class Generatorを使用したXMLの処理」を参照してください。

XML Schema Processorのデモ・プログラムの実行

JAXB Class Generator for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/jaxbにあります。表8-2に、XDKに含まれるJAXBのデモを具体的に示します。

表8-2 JAXB Class Generatorのデモ

プログラム

Oracleホーム内のサブディレクトリ

デモの内容 . .

SampleApp1.java

/xdk/demo/java/jaxb/Sample1

sample1.xsdスキーマ内の最上位レベルの要素とcomplexType定義のJavaクラスへのバインディング。

SampleApp2.java

/xdk/demo/java/jaxb/Sample2

sample2.xsdスキーマ内の最上位レベルの要素とインラインsimpleType定義のバインディング。

SampleApp3.java

/xdk/demo/java/jaxb/Sample3

別の最上位レベルのcomplexType定義からの拡張により導出された最上位レベルのcomplexType要素のバインディング。このプログラムの詳細な説明は、「複合型のバインディング」を参照してください。

SampleApp4.java

/xdk/demo/java/jaxb/Sample4

最上位レベルの名前付きグループを参照するcomplexType内のコンテンツ・モデルのバインディング。

SampleApp5.java

/xdk/demo/java/jaxb/Sample5

complexType内でアンバインドされたmaxOccursと<choice>とのバインディング。

SampleApp6.java

/xdk/demo/java/jaxb/Sample6

アトミック・データ型のバインディング。

SampleApp7.java

/xdk/demo/java/jaxb/Sample7

mixed="true"のcomplexType定義のバインディング。

SampleApp8.java

/xdk/demo/java/jaxb/Sample8

2つの異なる名前空間で宣言されている要素と型のバインディング。

SampleApp9.java

/xdk/demo/java/jaxb/Sample9

Javaパッケージ名のカスタマイズ。

SampleApp10.java

/xdk/demo/java/jaxb/Sample10

最上位レベル要素のクラス名のカスタマイズ。このプログラムの詳細な説明は、「最上位レベル要素でのクラス名のカスタマイズ」を参照してください。

SampleApp11.java

/xdk/demo/java/jaxb/Sample11

complexType要素の内部で宣言されたモデル・グループの反復で発生するローカル要素のクラス名のカスタマイズ。

SampleApp12.java

/xdk/demo/java/jaxb/Sample12

属性名のカスタマイズ。

SampleApp13.java

/xdk/demo/java/jaxb/Sample13

グローバルsimpleTypeで指定されたjavaTypeカスタマイズ。javaTypeカスタマイズは、ユーザー定義クラスで宣言された解析および出力メソッドを指定します。

SampleApp14.java

/xdk/demo/java/jaxb/Sample14

TypeSafe Enumクラス名のカスタマイズ。

サンプル・プログラムのコンパイルおよび実行方法を説明するドキュメントは、同じディレクトリ内のREADMEにあります。基本手順は次のとおりです。

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

2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。

3. システム・プロンプトでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。makeユーティリティは、各サンプル・サブディレクトリに対して次の順次アクションを実行します。

1. orajaxbユーティリティを実行して、入力XMLスキーマに基づくJavaクラス・ファイルを生成します。ほとんどのデモでは、出力クラス・ファイルはgeneratedサブディレクトリに書き込まれます。たとえば、makeファイルはSample1サブディレクトリ内のsample1.xsdスキーマに対して次のコマンドを実行します。

cd ./Sample1; $(JAVA_HOME)/bin/java -classpath "$(MAKE_CLASSPATH)" \
oracle.xml.jaxb.orajaxb -schema sample1.xsd -targetPkg generated; echo;

2. javacユーティリティを実行してJavaクラスをコンパイルします。たとえば、makeユーティリティはSample1/generated/サブディレクトリ内のJavaクラス・ファイルに対して次のコマンドを実行します。

cd ./Sample1/generated; $(JAVA_HOME)/bin/javac -classpath \
"$(MAKE_CLASSPATH)" *.java

3. javacユーティリティを実行して、前の手順でコンパイルされたクラスを使用するサンプルJavaアプリケーションをコンパイルします。たとえば、makeユーティリティはSampleApp1.javaプログラムをコンパイルします。

cd ./Sample1; $(JAVA_HOME)/bin/javac -classpath "$(MAKE_CLASSPATH)" \
SampleApp1.java

4. サンプルJavaアプリケーションを実行し、結果をログ・ファイルに書き込みます。たとえば、makeユーティリティはSampleApp1クラスを実行し、出力をsample1.outに書き込みます。

cd ./Sample1; $(JAVA_HOME)/bin/java -classpath "$(MAKE_CLASSPATH)" \SampleApp1 > sample1.out

JAXB Class Generatorコマンドライン・ユーティリティの使用

XDKには、入力XMLスキーマからJavaクラスを生成するコマンドラインJavaインタフェースであるorajaxbが含まれています。$ORACLE_HOME/bin/orajaxbおよび%ORACLE_HOME%\bin\orajaxb.batシェル・スクリプトは、oracle.xml.jaxb.orajaxbクラスを実行します。orajaxbを使用するには、CLASSPATHが「Java XDK環境の設定」の説明に従って設定されていることを確認します。

表8-3に、orajaxbのコマンドライン・オプションを示します。

表8-3orajaxbのコマンドライン・オプション

オプション

用途

-help

ヘルプ・メッセージを出力します。

-version

バージョン番号を出力します。

-outputdir OutputDir

Javaソース・ファイルの生成先ディレクトリを指定します。スキーマに名前空間がある場合、プログラムでは、outputDirから参照されるパッケージ(名前空間に対応)にJavaコードが生成されます。デフォルトでは、現行ディレクトリはoutputDirです。

-schema SchemaFile

入力XMLスキーマを指定します。

-targetPkg targetPkg

ターゲット・パッケージ名を指定します。このオプションは、パッケージ名のバインディング・カスタマイズと、JAXB仕様で定義されているデフォルトのパッケージ名アルゴリズムをオーバーライドします。

-interface

インタフェースのみを生成します。

-verbose

生成されたクラスおよびインタフェースをリストします。

-defaultCus fileName

デフォルトのカスタマイズ・ファイルを生成します。

-extension

ベンダー固有の拡張を許可し、JAXB 1.0仕様の付録E.2に指定されている互換性ルールに厳密には従いません。これが指定されている場合、プログラムでは、表記法、置換グループ、属性など、JAXB 1.0でサポートされていない機能は無視されます。

JAXB Class Generatorコマンドライン・ユーティリティの使用: 例

orjaxbをテストするには、$ORACLE_HOME/xdk/demo/java/jaxb/Sample1ディレクトリに変更します。makeを実行した場合、ディレクトリには次のファイルが含まれています。

SampleApp1.class
SampleApp1.java
generated/
sample1.out
sample1.xml
sample1.xsd

sample.xsdファイルは、sample1.xmlに関連付けられているXMLスキーマです。generated/サブディレクトリには、入力スキーマから生成されたクラスが含まれます。次のように、generated/のコンテンツを削除し、クラスを再生成することにより、orajaxbをテストできます。

rm generated/*
orajaxb -schema sample1.xsd -targetPkg generated -verbose

端末には次の出力が表示されます。

generated/CType.java
generated/AComplexType.java
generated/AnElement.java
generated/RElemOfCTypeInSameNs.java
generated/RType.java
generated/RElemOfSTypeInSameNs.java

generated/CTypeImpl.java
generated/AComplexTypeImpl.java
generated/AnElementImpl.java
generated/RElemOfCTypeInSameNsImpl.java
generated/RTypeImpl.java
generated/RElemOfSTypeInSameNsImpl.java
generated/ObjectFactory.java

XDKでサポートされていないJAXB機能

Oracle Database XDKにおけるJAXB仕様の実装では、次の機能はサポートされていません。

- Javadocの生成

- XML Schemaコンポーネント"any"および置換グループ

JAXB Class Generatorを使用したXMLの処理

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

- 複合型のバインディング

- 最上位レベル要素でのクラス名のカスタマイズ

複合型のバインディング

Sample3.javaプログラムは、複合型定義をJavaコンテンツ・インタフェースにバインドする方法を示します。XMLスキーマで定義されている1つの複合型は、別の複合型からの拡張によって導出されます。

スキーマの定義

例8-1に、サンプル・アプリケーションへの入力を提供するXMLデータ文書を示します。sample3.xml文書では、従業員の住所を記述します。

例8-1 sample3.xml

<?xml version="1.0"?>
<myAddress xmlns = "http://www.oracle.com/sample3/"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.oracle.com/sample3 sample3.xsd">
<name>James Bond</name>
<doorNumber>420</doorNumber>
<street>Oracle parkway</street>
<city>Redwood shores</city>
<state>CA</state>
<zip>94065</zip>
<country>United States</country>
</myAddress>

例8-2に示すXMLスキーマは、sample3.xmlの検証に使用する構造を定義します。スキーマでは、次のように定義されている2つの複合型と1つの要素を定義します。

- Addressという名前の最初の複合型は要素のシーケンスです。シーケンスで定義されている各要素は、住所の一部(名前、ドア番号など)を表します。

- USAddressという名前の2番目の複合型は、<extension base="exp:Address">要素を使用して、Addressシーケンスに州や郵便番号などの米国固有の要素を追加することによりAddressを拡張します。接頭辞expは、http://www.oracle.com/sample3/名前空間を指定します。

- 要素はmyAddressという名前で、その型はexp:USAddressです。接頭辞expは、http://www.oracle.com/sample3/名前空間を指定します。sample3.xmlでは、最上位レベル要素myAddressは名前空間http://www.oracle.com/sample3/にあり、スキーマ定義に準拠します。

例8-2 sample3.xsd

<?xml version="1.0"?>

<!-- Binding a complex type definition to java content interface
The complex type definition is derived by extension
-->

<schema xmlns = "http://www.w3.org/2001/XMLSchema"
xmlns:exp="http://www.oracle.com/sample3/"
targetNamespace="http://www.oracle.com/sample3/"
elementFormDefault="qualified">

<complexType name="Address">
<sequence>
<element name="name" type="string"/>
<element name="doorNumber" type="short"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>

<complexType name="USAddress">
<complexContent>
<extension base="exp:Address">
<sequence>
<element name="state" type="string"/>
<element name="zip" type="integer"/>
<element name="country" type="string"/>
</sequence>
</extension>
</complexContent>
</complexType>

<element name="myAddress" type="exp:USAddress"/>

</schema>

Javaクラスの生成およびコンパイル

XML文書および対応するXMLスキーマがある場合、処理の次のステージは、XMLスキーマからJavaクラスを生成することです。「JAXB Class Generatorコマンドライン・ユーティリティの使用」で説明したJAXBコマンドライン・インタフェースを使用して、このタスクを実行できます。

「Java XDK環境の設定」の説明に従って環境が設定されていると想定した場合は、次のようにgeneratedパッケージにソース・ファイルを作成できます。

cd $ORACLE_HOME/xdk/demo/java/jaxb/Sample3
orajaxb -schema sample1.xsd -targetPkg generated

前のorajaxbコマンドでは、./generated/サブディレクトリに次のソース・ファイルを作成する必要があります。

Address.java
AddressImpl.java
MyAddress.java
MyAddressImpl.java
ObjectFactory.java
USAddress.java
USAddressImpl.java

要素MyAddressと同様に、複合型AddressおよびUSAddressには、それぞれ2つのソース・ファイルが関連付けられています。要素に基づいて名前が付けられたソース・ファイルには、インタフェースが含まれます。接尾辞がImplのファイルには、インタフェースを実装するクラスが含まれます。たとえば、Address.javaにはインタフェースAddressが含まれますが、AddressImpl.javaにはAddressを実装するクラスが含まれます。

Address.javaソース・ファイルのコンテンツを例8-3に示します。

例8-3 Address.java

package generated;
public interface Address
{
public void setName(java.lang.String n);
public java.lang.String getName();
public void setDoorNumber(short d);
public short getDoorNumber();
public void setStreet(java.lang.String s);
public java.lang.String getStreet();
public void setCity(java.lang.String c);
public java.lang.String getCity();
}

Address複合型では、要素のシーケンス(name、doorNumber、streetおよびcity)を定義しました。したがって、Addressインタフェースには、4つの各要素に対するgetおよびsetメソッド署名が含まれます。たとえば、インタフェースには、<name>要素内のデータを取得するためのgetName()およびこの要素内のデータを変更するためのsetName()が含まれます。

Javaソース・ファイルはjavacを使用して次のようにコンパイルできます。

cd $ORACLE_HOME/xdk/demo/java/jaxb/Sample3/generated
javac *.java

XMLデータの処理

Sample3.javaは、「Javaクラスの生成およびコンパイル」で生成したJavaクラス・ファイルを使用してsample3.xml文書を処理する方法を示します。サンプル・プログラムは、XMLデータ文書をアンマーシャリングしてマーシャリングし、生成されたクラスを使用して住所データを出力および変更します。

Sample3.javaプログラムでは、データを次のように処理します。

1. XMLデータ文書のファイル名、および生成されたクラスを含むディレクトリの名前の文字列を作成します。この名前はパッケージ名です。次に例を示します。

String fileName = "sample3.xml";
String instancePath = "generated";

2. JAXBContext.newInstance()を起動することにより、JAXBコンテンツをインスタンス化します。クライアント・アプリケーションは、コンテキスト・パスで初期化することにより、このクラスの新規インスタンスを取得します。パスには、Marshallerで使用可能なインタフェースを含むJavaパッケージ名のリストが含まれます。この方法を示す文は次のとおりです。

JAXBContext jc = JAXBContext.newInstance(instancePath);

3. Unmarshallerをインスタンス化します。Unmarshallerクラスは、XMLデータを新規に作成されたオブジェクトにデシリアライズし、オプションとしてXMLデータのアンマーシャリング時に検証を行うプロセスを管理します。この方法を示す文は次のとおりです。

Unmarshaller u = jc.createUnmarshaller();

4. XML文書をアンマーシャリングします。Unmarshaller.unmarshal()メソッドを起動して、sample3.xml文書をデシリアライズし、コンテンツ・ツリーをObjectとして戻します。fileToUrl()ヘルパー・メソッドを起動することにより、XMLファイル名からURLを作成できます。この方法を示す文は次のとおりです。

Object obj = u.unmarshal(fileToURL(fileName));

5. Marshallerをインスタンス化します。Marshallerクラスは、Javaコンテンツ・ツリーのXMLデータへのシリアライズのプロセスを管理します。この方法を示す文は次のとおりです。

Marshaller m = jc.createMarshaller();

6. コンテンツ・ツリーをマーシャリングします。Marshaller.marshal()メソッドを起動して、Unmarshallerから戻されたコンテンツ・ツリーObjectをマーシャリングします。DOMツリー、SAXコンテンツ・ハンドラ、変換結果または出力ストリームをシリアライズできます。次の文は、マークアップを含めたXMLデータを出力ストリームとしてシリアライズします。

m.marshal(obj, System.out);

デフォルトでは、Marshallerは出力ストリームにXMLデータを書き込むときにUTF-8エンコーディングを使用します。

7. XML文書のコンテンツを出力します。プログラムでは、コンテンツ・ツリーとMarshallerをパラメータとして受け入れるprocess()メソッドを実装します。
処理の最初のステージでは、XMLマークアップのないXML文書内のデータが出力されます。このメソッドでは、Marshallerにより生成されたObjectがMyAddress型にキャストされます。続いて、XML要素の名前の先頭にgetを付けることでメソッド名が作成された一連のメソッドが起動されます。たとえば、例8-1の<city>要素内のデータを取得するために、プログラムはgetCity()を起動します。次のコード部分は、この方法を示します。

public static void process(Object obj, Marshaller m) throws Throwable
{
generated.MyAddress elem = (generated.MyAddress)obj;
System.out.println();
System.out.println(" My address is: ");
System.out.println("  name:  "  + elem.getName() + "\n"  +
"  doorNumber " + elem.getDoorNumber() + "\n" +
"  street: " + elem.getStreet() + "\n" +
"  city:   " + elem.getCity() + "\n"  +
"  state:  " + elem.getState() + "\n" +
"  zip:  " + elem.getZip() + "\n" +
"  country:  " + elem.getCountry() + "\n" +
"\n" );
...

8. XMLデータを変更し、出力します。process()メソッドは、先行するgetメソッドに対応するsetメソッドを起動することで続行します。各setメソッドの名前は、XML要素名の先頭にsetを付けることで作成されます。たとえば、setCountry()は<country>要素内の値を変更します。次の文は、この方法を示します。

short num = 550;
elem.setDoorNumber(num);
elem.setCountry("India");
num = 10100;
elem.setZip(new java.math.BigInteger("100100"));
elem.setCity("Noida");
elem.setState("Delhi");

データを変更した後、プログラムは、前の手順と同じgetメソッドを起動することによりデータを出力します。

最上位レベル要素でのクラス名のカスタマイズ

Sample10.javaプログラムは、JAXBカスタマイズの1つの形式を示します。プログラムでは、入力XMLスキーマの要素に対応するクラスの名前を変更できることを示します。

スキーマの定義

例8-4に、サンプル・アプリケーションへの入力を提供するXMLデータ文書を示します。sample10.xml文書は業務を記述します。

例8-4 sample10.xml

<?xml version="1.0"?>
<business xmlns="http://jaxbcustomized/sample10/">
<title>Software Development</title>
<owner>Larry Peterson</owner>
<id>45123</id>
</business>

例8-5に、sample10.xmlの構造を定義するXMLスキーマを示します。スキーマでは、次のように1つの複合型と1つの要素を定義します。

- businessTypeという名前の複合型は要素のシーケンスです。シーケンスで定義されている各要素は、業務の一部(タイトル、所有者およびID)を表します。

- businessという名前の要素の型はbiz:businessTypeです。biz接頭辞は、http://jaxbcustomized/sample10/名前空間を指定します。sample10.xmlでは、最上位レベル要素businessは名前空間http://jaxbcustomized/sample10/にあり、スキーマ定義に準拠します。

例8-5 sample10.xsd

<?xml version="1.0"?>

<!-- Customization of class name in top level element -->

<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://jaxbcustomized/sample10/"
xmlns:biz="http://jaxbcustomized/sample10/"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0"
elementFormDefault="qualified">

<element name="business" type="biz:businessType">
<annotation>
<appinfo>
<jaxb:class name="myBusiness"/>
</appinfo>
</annotation>
</element>

<complexType name="businessType">
<sequence>
<element name="title" type="string"/>
<element name="owner" type="string"/>
<element name="id" type="integer"/>
</sequence>
</complexType>

</schema>

スキーマ・バインディングのカスタマイズ

例8-5に示したスキーマは、インライン・バインディング宣言を使用して、business要素のバインディングをカスタマイズします。インライン・カスタマイズの一般的な形式は次のとおりです。

<xs:annotation>
<xs:appinfo>
.
.
binding declarations
.
.
</xs:appinfo>
</xs:annotation>

例8-5では、<class>バインディング宣言を使用してスキーマ要素をJavaクラス名にバインドしています。宣言を使用して、インタフェースの名前またはインタフェースを実装するクラスをカスタマイズできます。JAXB Class Generatorでは、<class>カスタマイズに対して次の構文をサポートしています。

<class [ name = "className"] >

name属性では、導出されたJavaインタフェースの名前を指定します。例8-5には、次のカスタマイズが含まれます。

<jaxb:class name="myBusiness"/>

このため、スキーマはbusiness要素をデフォルトのインタフェースbusinessではなくインタフェースmyBusinessにバインドします。

Javaクラスの生成およびコンパイル

XML文書および対応するXMLスキーマがある場合、次のステージは、XMLスキーマからJavaクラスを生成することです。JAXBコマンドライン・インタフェースを使用して、このタスクを実行できます。

「Java XDK環境の設定」の説明に従って環境が設定されている場合は、次のようにgeneratedパッケージにソース・ファイルを作成できます。

cd $ORACLE_HOME/xdk/demo/java/jaxb/Sample10
orajaxb -schema sample10.xsd

前述のコマンドはターゲット・パッケージを指定しないため、パッケージ名はスキーマのターゲット名前空間(http://jaxbcustomized/sample10/)から作成されます。したがって、ユーティリティでは、./jaxbcustomized/sample10/サブディレクトリに次のソース・ファイルが生成されます。

BusinessType.java
BusinessTypeImpl.java
MyBusiness.java
MyBusinessImpl.java
ObjectFactory.java

複合型businessTypeにはBusinessType.javaおよびBusinessTypeImpl.javaという2つのソース・ファイルがあることに注意してください。JAXBのカスタマイズにより、business要素はインタフェースMyBusinessにバインドされ、クラスMyBusinessImplを実装しています。

BusinessType.javaソース・ファイルのコンテンツを例8-6に示します。

例8-6 BusinessType.java

package jaxbcustomized.sample10;

public interface BusinessType
{
public void setTitle(java.lang.String t);
public java.lang.String getTitle();
public void setOwner(java.lang.String o);
public java.lang.String getOwner();
public void setId(java.math.BigInteger i);
public java.math.BigInteger getId();
}

BusinessType複合型では、要素のシーケンス(title、ownerおよびid)を定義しました。したがって、Addressインタフェースには、各要素に対するgetおよびsetメソッド署名が含まれます。たとえば、インタフェースには、<title>要素内のデータを取得するためのgetTitle()およびこの要素内のデータを変更するためのsetTitle()が含まれます。

Javaソース・ファイルはjavacを使用して次のようにコンパイルできます。

cd $ORACLE_HOME/xdk/demo/java/jaxb/Sample10/jaxbcustomized/sample10
javac *.java

XMLデータの処理

Sample10.javaソース・ファイルは、「Javaクラスの生成およびコンパイル」で生成したクラス・ファイルを使用してsample10.xml文書のデータを処理する方法を示しています。サンプル・プログラムは、XML文書をアンマーシャリングし、そのコンテンツを出力し、XMLを標準出力にマーシャリングします。

Sample10.javaプログラムでは、XMLデータを次のように処理します。

1. XMLデータ文書のファイル名、および生成されたクラスを含むディレクトリの名前の文字列を作成します。この名前はパッケージ名です。次に例を示します。

String fileName = "sample10.xml";
String instancePath = "jaxbcustomized.sample10";

2. JAXBContext.newInstance()メソッドを起動することにより、JAXBコンテンツをインスタンス化します。この方法を示す文は次のとおりです。

JAXBContext jc = JAXBContext.newInstance(instancePath);

3. Unmarshallerを作成します。この方法を示す文は次のとおりです。

Unmarshaller u = jc.createUnmarshaller();

4. XML文書をアンマーシャリングします。プログラムは、ドキュメントを2回アンマーシャリングします。最初にObjectを戻し、次にキャストを使用してMyBusinessオブジェクトを戻します。この方法を示す文は次のとおりです。

Object obj = u.unmarshal(fileToURL(fileName));
jaxbcustomized.sample10.MyBusiness bus =
(jaxbcustomized.sample10.MyBusiness) u.unmarshal(fileToURL(fileName));

5. XML文書のコンテンツを出力します。プログラムは、MyBusinessオブジェクトに対してgetメソッドを起動します。次のコード部分は、この方法を示します。

System.out.println("My business details are: ");
System.out.println("    title: " + bus.getTitle());
System.out.println("    owner: " + bus.getOwner());
System.out.println("    id:    " + bus.getId().toString());
System.out.println();

6. Marshallerを作成します。この方法を示す文は次のとおりです。

Marshaller m = jc.createMarshaller();

7. Marshallerを構成します。setProperty()を起動して、Marshallerの様々なプロパティを構成できます。JAXB_FORMATTED_OUTPUT定数は、MarshallerがXMLデータを改行とインデントで書式設定する必要があることを指定します。次の文は、この方法を示します。

m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));

8. コンテンツ・ツリーをマーシャリングします。次の文は、マークアップを含めたXMLデータを出力ストリームとしてシリアライズします。

m.marshal(bus, System.out);

デフォルトでは、Marshallerは出力ストリームにXMLデータを書き込むときにUTF-8エンコーディングを使用します。

9 XML Pipeline Processor for Javaの使用

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

- XML Pipeline Processorの概要

- XML Pipeline Processorの使用: 概要

- パイプラインでのXMLの処理

XML Pipeline Processorの概要

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

- 前提条件

- 標準と仕様

- XMLのマルチステージ処理

- カスタマイズしたパイプライン・プロセス

前提条件

この章では、次の内容を十分に理解していると想定します。

- XML Pipeline Definition Language: このXML言語を使用すると、XMLリソース間の処理リレーションを記述できます。Pipeline Definition Languageの詳しい説明が必要な場合は、「はじめに」の「関連ドキュメント」に記載されているXMLの資料を参照してください。

- Document Object Model (DOM): DOMは、XML文書の構造を示すインメモリー・ツリー表現です。

- Simple API for XML (SAX): SAXは、イベントベースのXML解析の標準です。

- XMLスキーマ言語: 概要および関連資料へのリンクは、第7章「Schema Processor for Javaの使用」を参照してください。

標準と仕様

Oracle XML Pipeline Processorは、W3CノートのXML Pipeline Definition Languageバージョン1.0に基づいています。W3Cノートでは、APIではなくXML言語を定義しています。パイプライン仕様は次のURLにあります。

http://www.w3.org/TR/xml-pipeline/

「XDK for JavaのためのPipeline Definition Language標準」で、Oracle XDKでのOracle XML Pipeline Processorの実装とW3Cノートとの違いについて説明します。

関連項目:
表31-1「XDKがサポートするXML標準の概要」

XMLのマルチステージ処理

Oracle XML Pipeline Processorは、XML Pipeline Definition Languageに基づいています。入力XMLパイプライン文書を受け取り、派生した依存性に基づいてパイプライン・プロセスを実行できます。XMLで記述されるパイプライン文書は、実行するプロセスを宣言方式で指定します。パイプライン文書中に<processdef/>要素を使用して、Javaクラスをプロセスに関連付けることができます。

Pipeline Processorはマルチステージ処理に使用します。マルチステージ処理は、XMLコンポーネントを順次またはパラレルに処理するときに発生します。ある処理ステージの出力を別の処理ステージの入力にすることができます。プロセスの入力と出力を定義するパイプライン・ドキュメントを記述できます。図9-1に、可能なパイプライン・シーケンスを示します。

図9-1 パイプライン処理

XML Pipeline Processorに加えて、XDKにはパイプライン文書内で連結できるプロセス用のAPIが提供されています。表9-2に、oracle.xml.pipeline.processesパッケージで提供されているクラスの概要を示します。

パイプラインでの一般的なXML処理ステージは次のとおりです。

1. 入力XML文書を解析します。oracle.xml.pipeline.processesパッケージには、DOM解析用のDOMParserProcessと、SAX解析用のSAXParserProcessが含まれます。

2. 入力XML文書を検証します。

3. 入力文書をシリアライズまたは変換します。Pipeline Processorを使用してSAXパーサーをXSLTプロセッサに接続することはできません。XSLTプロセッサにはDOMが必要です。

マルチステージ処理において、大規模なXML文書のフィルタ処理と検索にはSAXが最適です。XMLコンテンツを変更する場合、またはコンテンツに効率的な動的アクセスを行う必要がある場合は、DOMを使用する必要があります。

関連項目:
パイプライン・アプリケーションへの入力を提供するパイプライン文書を記述する方法は、「パイプラインでのXMLの処理」を参照してください。

カスタマイズしたパイプライン・プロセス

oracle.xml.pipeline.controller.Processクラスは、すべてのパイプライン・プロセス定義のベース・クラスです。oracle.xml.pipeline.processesパッケージのクラスは、このベース・クラスを拡張します。カスタマイズしたパイプライン・プロセスを作成するには、Processクラスを拡張するクラスを作成する必要があります。

少なくとも、すべてのカスタム・プロセスは、Processクラスの何も処理を行わないinitialize()およびexecute()メソッドをオーバーライドする必要があります。カスタマイズしたプロセスがSAXイベントを入力として受け入れる場合は、受信したSAXイベントを処理する適切なContentHandlerを戻すように、SAXContentHandler()メソッドをオーバーライドする必要があります。また、適切なErrorHandlerを戻すように、SAXErrorHandler()メソッドをオーバーライドする必要があります。表9-1に、前述のメソッドの詳細を示します。

表9-1 oracle.xml.pipeline.controller.Processクラスのメソッド

クラス

説明

initialize()

プロセスを実行前に初期化します。

getInput()をコールしてプロセスの要素に関連付けられた特定の入力オブジェクトをフェッチし、supportType()をコールしてサポートされる入力の型を示します。出力に対しても同様に、getOutput()およびsupportType()をコールします。

execute()

プロセスを実行します。

getInParaValue()、getInput()またはgetInputSource()をコールして、プロセスへの入力をフェッチします。カスタム・プロセスがSAXイベントを出力する場合は、execute()内でgetSAXContentHandler()およびgetSAXErrorHandler()メソッドをコールして、パイプラインの後続のプロセスで使用するSAXハンドラを取得する必要があります。

setOutputResult()、getOutputStream()、getOutputWriter()またはsetOutParam()をコールして、このプロセスによって生成される出力または外部パラメータを設定します。

getErrorSource()、getErrorStream()またはgetErrorDocument()をコールして、このプロセスの要素に関連付けられたパイプライン・エラー要素にアクセスします。execute()の実行中に例外が発生した場合は、error()またはinfo()をコールして例外をPipelineErrorHandlerに伝播します。

SAXContentHandler()

SAXのContentHandlerを戻します。

他のプロセスから発生する依存性がこの時点で使用可能でない場合は、nullを戻します。依存性が使用可能な場合は、メソッドが最後まで実行されます。

SAXErrorHandler()

SAXのErrorHandlerを戻します。

このメソッドをオーバーライドしなかった場合、JAXBプロセッサは、このクラスに実装されているデフォルト・エラー・ハンドラを使用してSAXエラーを処理します。

関連項目:
oracle.xml.pipeline.processesパッケージの詳細は、Oracle Database XML Java APIリファレンスを参照してください

XML Pipeline Processorの使用: 概要

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

- XML Pipeline Processorの使用: 基本プロセス

- XML Pipeline Processorのデモ・プログラムの実行

- XML Pipeline Processorコマンドライン・ユーティリティの使用

XML Pipeline Processorの使用: 基本プロセス

XML Pipeline Processorには次のパッケージを介してアクセスできます。

- oracle.xml.pipeline.controller: 依存性に基づいてパイプラインのXMLプロセスを実行するXMLパイプライン・コントローラを提供します。

- oracle.xml.pipeline.processes: XMLパイプライン・コントローラで実行できるXMLプロセスのラッパー・クラスを提供します。oracle.xml.pipelin.processesパッケージには、パイプライン・アプリケーション・フレームワークの設計に使用できるクラスが含まれます。各クラスは、oracle.xml.pipeline.controller.Processクラスを拡張します。
表9-2に、パッケージに含まれるコンポーネントを示します。XML Pipeline Processorとパイプライン文書を組み合せることによって、これらのコンポーネントとプロセスを連結できます。

表9-2 oracle.xml.pipeline.processesのクラス

クラス

説明

CompressReaderProcess

圧縮されたXMLを受け取り、解析済XMLを出力します。

CompressWriterProcess

DOMまたはSAXによって解析されたXMLを受け取り、圧縮済XMLを出力します。

DOMParserProcess

受信したXMLを解析し、DOMツリーを出力します。

SAXParserProcess

受信したXMLを解析し、SAXイベントを出力します。

XPathProcess

DOMを入力として受け入れ、XPathパターンを使用してXML DocumentまたはXML DocumentFragmentから1つ以上のノードを選択し、DocumentまたはDocumentFragmentを出力します。

XSDSchemaBuilder

XMLスキーマを解析し、検証のためのスキーマ・オブジェクトを出力します。このプロセスはXML Pipeline Processorに組み込まれています。XML文書の検証に使用されるスキーマ・オブジェクトを作成します。

XSDValProcess

ローカル・スキーマと照合して検証し、結果を分析し、必要に応じてエラーを報告します。

XSLProcess

DOMを入力として受け入れ、XSLスタイルシートを適用し、変換の結果を出力します。

XSLStylesheetProcess

XSLスタイルシートをストリームまたはDOMとして受け取り、XSLStylesheetオブジェクトを作成します。

図9-2に、XML Pipeline Processorを使用するJavaアプリケーションにパイプライン文書を渡し、プロセッサを構成し、パイプラインを実行する方法を示します。

図9-2 Pipeline Processor for Javaの使用

基本手順は次のとおりです。

1. パイプライン実行への入力となるパイプライン文書をインスタンス化します。次のように、コンストラクタにFileReaderを渡してオブジェクトを作成します。

PipelineDoc pipe;
FileReader f;
pipe = new PipelineDoc((Reader)f, false);

2. パイプライン・プロセッサをインスタンス化します。PipelineProcessorは、パイプラインを実行する最上位クラスです。表9-3に、使用可能なメソッドの一部を示します。

表9-3 PipelineProcessorのメソッド

メソッド

説明

executePipeline()

setPipelineDoc()を起動することによって設定したPipelineDocに基づいて、パイプラインを実行します。

getExecutionMode()

実行モードのタイプとしてPIPELINE_SEQUENTIALまたはPIPELINE_PARALLELを取得します。

setErrorHandler()

パイプラインのエラー・ハンドラを設定します。これはパイプラインを実行するために必須のコールです。

setExecutionMode()

実行モードを設定します。PIPELINE_PARALLELは、デフォルトであり、パイプライン内のプロセスをパラレルに実行することを指定します。PIPELINE_SEQUENTIALは、パイプライン内のプロセスを順次実行することを指定します。

setForce()

実行の動作を設定します。TRUEの場合は、パイプライン入力に関してターゲットが最新の状態であるかどうかにかかわらず、パイプラインを実行します。

setPipelineDoc()

パイプラインのPipelineDocオブジェクトを設定します。

パイプライン・プロセッサをインスタンス化する文は次のとおりです。

proc = new PipelineProcessor();

3. パイプライン文書にプロセッサを設定します。次に例を示します。

proc.setPipelineDoc(pipe);

4. プロセッサの実行モードを設定し、その他の必要な構成を行います。たとえば、PipelineProcessor.setExecutionMode()に定数を渡してモードを設定します。
次の文は、シーケンシャルな実行を指定します。

proc.setExecutionMode(PipelineConstants.PIPELINE_SEQUENTIAL);

5. エラー・ハンドラをインスタンス化します。エラー・ハンドラは、PipelineErrorHandlerインタフェースを実装する必要があります。次に例を示します。

errHandler = new PipelineSampleErrHdlr(logname);

6. setErrorHandler()を起動することで、プロセッサに対してエラー・ハンドラを設定します。次に例を示します。

proc.setErrorHandler(errHandler);

7. パイプラインを実行します。次に例を示します。

proc.executePipeline();

関連項目:

- oracle.xml.pipelineのサブパッケージの詳細は、Oracle Database XML Java APIリファレンスを参照してください

- 「パイプライン文書の作成」

XML Pipeline Processorのデモ・プログラムの実行

XML Pipeline Processorのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/pipelineにあります。表9-4に、ユーティリティのテストに使用できるXMLファイルとJavaソース・ファイルを示します。

表9-4 Pipeline Processorのサンプル・ファイル

ファイル

説明

README

Pipeline Processorのデモの設定方法が記述されたテキスト・ファイル。

PipelineSample.java

Pipeline Processorのサンプル・アプリケーション。このプログラムは第1引数としてpipedoc.xmlを受け取ります。

PipelineSampleErrHdlr.java

PipelineSampleで使用されるエラー・ハンドラを作成するサンプル・プログラム。

book.xml

一連の書籍を記述したサンプルXML文書。この文書は、pipedoc.xml、pipedoc2.xmlおよびpipedocerr.xmlで入力として指定されます。

book.xsl

book.xmlの書籍リストをHTML表に変換するXSLTスタイルシート。

book_err.xsl

pipedocerr.xmlパイプライン文書で入力として指定されるXSLTスタイルシート。このスタイルシートには、意図的にエラーが含まれています。

id.xsl

pipedoc3.xmlパイプライン文書で入力として指定されるXSLTスタイルシート。

items.xsd

pipedoc3.xmlパイプライン文書で入力として指定されるXMLスキーマ文書。

pipedoc.xml

パイプライン文書。このドキュメントは次の処理を指定します。(1)プロセスp1でDOMを使用してbook.xmlを解析します。(2)プロセスp2でbook.xslを解析してスタイルシート・オブジェクトを作成します。(3)プロセスp3でスタイルシートをDOMに適用してmyresult.htmlを生成します。

pipedoc2.xml

パイプライン文書。このドキュメントは次の処理を指定します。(1)プロセスp1でSAXを使用してbook.xmlを解析します。(2)プロセスp2でSAXイベントから圧縮されたXML compxmlを生成します。(3)プロセスp3で圧縮されたストリームからmyresult2.htmlをXMLとして再生成します。

pipedoc3.xml

パイプライン文書。この文書は次の処理を指定します。(1)プロセスp5でDOMを使用してpo.xmlを解析します。(2)プロセスp1でXPath式を使用してDOMツリーから1つのノードを選択します。(3)プロセスp4でitems.xsdを解析してスキーマ・オブジェクトを生成します。(4)プロセスp6で選択したノードをスキーマと照合して検証します。(5)プロセスp3でid.xslを解析してスタイルシート・オブジェクトを生成し、検証済ノードを生成してmyresult3.htmlを出力します。

pipedocerr.xml

パイプライン文書。このドキュメントは次の処理を指定します。(1)プロセスp1でDOMを使用してbook.xmlを解析します。(2)プロセスp2でbook_err.xslを解析し、エラーが検出されなかった場合はスタイルシート・オブジェクトを生成し、エラーが検出された場合はインライン・スタイルシートを適用します。(3)プロセスp3でDOMにスタイルシートを適用してmyresulterr.htmlを生成します。book_err.xslにはエラーが含まれているため、プログラムで入力XMLのテキスト・コンテンツをmyresulterr.htmlに書き込む必要があります。

po.xml

発注書を記述したサンプルXML文書。この文書は、pipedoc3.xmlで入力として指定されます。

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

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

2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。

3. システム・プロンプトでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行して、PipelineSample.javaおよびPipelineSampleErrHdler.javaのクラス・ファイルを生成し、デモ・プログラムを実行します。出力ファイルはlogサブディレクトリに書き込まれます。
または、次の構文を使用して、デモ・プログラムを手動で実行することもできます。

java PipelineSample pipedoc pipelog [ seq | para ]

pipedocオプションは、使用するパイプライン文書を指定します。pipelogオプションは、パイプラインのログ・ファイル名を指定します。seqまたはparaを指定した場合、ログ・ファイル名は必須ですが、それ以外の場合はオプションです。ログ・ファイルを指定しなかった場合は、デフォルトでpipeline.logが生成されます。seqオプションを指定するとスレッドは順次処理され、paraを指定するとパラレル処理されます。seqおよびparaのどちらも指定しなかった場合のデフォルトは、パラレル処理です。

4. パイプラインから生成されたファイルおよびログ・ファイルを表示します。パイプラインから生成されるすべてのファイルは、名前の先頭に文字列myresultが付けられます。

XML Pipeline Processorコマンドライン・ユーティリティの使用

XML Pipeline Processorのコマンドライン・インタフェースは、orapipeといいます。Pipeline Processorは、Oracle Databaseにパッケージ化されています。Oracle Universal Installerを使用すると、デフォルトでディスク上の$ORACLE_HOME/binにユーティリティがインストールされます。

初めてユーティリティを実行する場合は、「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。オペレーティング・システムのコマンドラインで、次の構文を使用してorapipeを実行します。

orapipe options pipedoc

pipedocはパイプライン文書であり、必須です。表9-5に、orapipeユーティリティの使用可能なオプションを示します。

表9-5orapipeのコマンドライン・オプション

" title="orapipeコマンドライン・オプション" width="100%">

オプション

用途

-help

ヘルプ・メッセージを出力します。

-log logfile

指定されたログ・ファイルにエラーおよびメッセージを書き込みます。デフォルトはpipeline.logです。

-noinfo

情報項目をログに記録しません。デフォルトはオンです。

-nowarning

警告をログに記録しません。デフォルトはオンです。

-validate

パイプライン・スキーマで入力pipedocを検証します。検証は、デフォルトでオフになっています。これは追加の機能であるため、outparam機能を使用した場合、現在のパイプライン・スキーマによるvalidateが失敗します。

-version

バージョン番号を出力します。

-sequential

シーケンシャル・モードでパイプラインを実行します。デフォルトはパラレルです。

-force

ターゲットが最新の状態にある場合でもパイプラインを実行します。デフォルトでは、forceは指定されていません。

-attr name value

$nameの値として、指定されたvalueを設定します。たとえば、属性名がsource、値がbook.xmlの場合、<input ... label="$source">と指定して、この値をパイプライン文書の要素に渡すことができます。

パイプラインでのXMLの処理

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

- パイプライン文書の作成

- Pipeline Processorアプリケーションの作成

- パイプライン・エラー・ハンドラの作成

パイプライン文書の作成

Oracle XML Pipeline Processorを使用するには、W3Cノートで指定されたPipeline Definition Languageの規則に従ってXML文書を作成する必要があります。

W3C仕様では、XML処理コンポーネントとプロセスの入力および出力が定義されています。XML Pipeline Processorには、次のXDKコンポーネントのサポートが含まれます。

- XMLパーサー

- XML Compressor

- XML Schemaバリデータ

- XSLTプロセッサ

パイプライン文書の例

XML Pipeline Processorは、パイプライン文書の規則に従って一連のXML処理を実行し、結果を戻します。例9-1に、デモ・ディレクトリに含まれているサンプル・パイプライン文書pipedoc.xmlを示します。

例9-1 pipedoc.xml

<pipeline xmlns="http://www.w3.org/2002/02/xml-pipeline"
xml:base="http://example.org/">

<param name="target" select="myresult.html"/>

<processdef name="domparser.p"
definition="oracle.xml.pipeline.processes.DOMParserProcess"/>
<processdef name="xslstylesheet.p"
definition="oracle.xml.pipeline.processes.XSLStylesheetProcess"/>
<processdef name="xslprocess.p"
definition="oracle.xml.pipeline.processes.XSLProcess"/>

<process id="p2" type="xslstylesheet.p" ignore-errors="false">
<input name="xsl" label="book.xsl"/>
<outparam name="stylesheet" label="xslstyle"/>
</process>

<process id="p3" type="xslprocess.p" ignore-errors="false">
<param name="stylesheet" label="xslstyle"/>
<input name="document" label="xmldoc"/>
<output name="result" label="myresult.html"/>
</process>

<process id="p1" type="domparser.p" ignore-errors="true">
<input name="xmlsource" label="book.xml "/>
<output name="dom" label="xmldoc"/>
<param name="preserveWhitespace" select="true"></param>
<error name="dom">
<html xmlns="http://www/w3/org/1999/xhtml">
<head>
<title>DOMParser Failure!</title>
</head>
<body>
<h1>Error parsing document</h1>
</body>
</html>
</error>
</process>

</pipeline>

パイプライン文書に指定するプロセス

例9-1では、3つのプロセスをコールし、oracle.xml.pipeline.processesパッケージのJavaクラスに関連付けています。パイプライン文書では、<processdef/>要素を使用して、次の関連付けを作成しています。

- domparser.pとDOMParserProcessクラスの関連付け

- xslstylesheet.pとXSLStylesheetProcessクラスの関連付け

- xslprocess.pとXSLProcessクラスの関連付け

パイプライン文書に指定する処理アーキテクチャ

PipelineSampleプログラムでは、例9-1に示したpipedoc.xml文書の他に、XML文書のbook.xmlおよびbook.xslを入力として受け入れます。このパイプラインの基本設計は次のとおりです。

1. 受信したbook.xml文書を解析し、DOMツリーを生成します。このタスクはDOMParserProcessによって実行されます。

2. book.xslをストリームとして解析し、XSLStylesheetオブジェクトを生成します。このタスクはXSLStylesheetProcessによって実行されます。

3. book.xmlのDOMを入力として受け取り、スタイルシート・オブジェクトを適用し、myresult.htmlに結果を書き込みます。このタスクはXSLProcessによって実行されます。

パイプライン文書で使用している処理アーキテクチャについて次に説明します。

- targetパラメータのデフォルト値およびxml:baseの設定から、ターゲット情報セットはhttp://example.org/myresult.htmlであると推定されます。

- プロセスp2の入力はbook.xslです。出力パラメータにはラベルxslstyleが使用されているため、このプロセスを実行してp3への入力を生成する必要があります。

- プロセスp3は、入力パラメータxslstyleおよび文書xmldocに依存します。

- プロセスp3の出力パラメータには、ラベルhttp://example.org/myresult.htmlが使用されているため、このプロセスを実行してターゲットを生成する必要があります。

- プロセスp1は、入力文書book.xmlに依存し、xmldocを出力します。したがって、このプロセスを実行してp3への入力を生成する必要があります。

例9-1では、複数の処理順序によってすべての依存性を満たすことができます。指定された規則から判断すると、XML Pipeline Processorはp3を最後に処理する必要がありますが、p1およびp2は、どちらの順番でも処理でき、パラレルで処理することもできます。

Pipeline Processorアプリケーションの作成

PipelineSample.javaソース・ファイルは、基本的なパイプライン・アプリケーションです。このアプリケーションでは、表9-4の任意のパイプライン文書を使用して、入力XML文書を解析および変換できます。

このプログラムの基本手順は次のとおりです。

1. 初期設定を行います。プログラムで、FileReader型(入力XMLファイル)、PipelineDoc(入力パイプライン文書)およびPipelineProcessor(プロセッサ)の参照を宣言します。第1引数はパイプライン文書であり、必須です。第2引数を受け取った場合は、文字列lognameに格納されます。次のコード部分は、この方法を示します。

public static void main(String[] args)
{
FileReader f;
PipelineDoc pipe;
PipelineProcessor proc;

if (args.length < 1)
{
System.out.println("First argument needed, other arguments are ".
"optional:");
System.out.println("pipedoc.xml <output_log> <'seq'>");
return;
}
if (args.length > 1)
logname = args[1];
...

2. 最初のコマンドライン引数をファイル名としてコンストラクタに渡し、FileReaderオブジェクトを作成します。次に例を示します。

f = new FileReader(args[0]);

3. FileReaderオブジェクトへの参照を渡し、PipelineDocオブジェクトを作成します。次の例では、FileReaderをReaderにキャストし、検証なしを指定しています。

pipe = new PipelineDoc((Reader)f, false);

4. XML Pipeline Processorをインスタンス化します。パイプライン・プロセッサをインスタンス化する文は次のとおりです。

proc = new PipelineProcessor();

5. パイプライン文書にプロセッサを設定します。次に例を示します。

proc.setPipelineDoc(pipe);

6. プロセッサの実行モードを設定し、その他の構成を行います。次のコード部分は、条件を使用して実行モードを決定します。プログラムに3つ以上の引数が渡された場合は、渡された引数に応じて、モードをシーケンシャルまたはパラレルに設定します。次に例を示します。

String execMode = null;
if (args.length > 2)
{
execMode = args[2];
if(execMode.startsWith("seq"))
proc.setExecutionMode(PipelineConstants.PIPELINE_SEQUENTIAL);
else if (execMode.startsWith("para"))
proc.setExecutionMode(PipelineConstants.PIPELINE_PARALLEL);
}

7. エラー・ハンドラをインスタンス化します。エラー・ハンドラは、PipelineErrorHandlerインタフェースを実装する必要があります。プログラムでは、PipelineSampleErrHdlr.javaに示されているPipelineSampleErrHdlerを使用しています。次のコード部分は、この方法を示します。

errHandler = new PipelineSampleErrHdlr(logname);

8. setErrorHandler()を起動することで、プロセッサに対してエラー・ハンドラを設定します。この方法を示す文は次のとおりです。

proc.setErrorHandler(errHandler);

9. パイプラインを実行します。この方法を示す文は次のとおりです。

proc.executePipeline();

関連項目:
oracle.xml.pipelineのサブパッケージの詳細は、Oracle Database XML Java APIリファレンスを参照してください

パイプライン・エラー・ハンドラの作成

XML Pipeline Processorをコールするアプリケーションは、プロセッサから受け取ったエラーを処理するPipelineErrorHandlerインタフェースを実装する必要があります。setErrorHandler()をコールしてプロセッサのエラー・ハンドラを設定します。エラー・ハンドラを作成する場合、様々なタイプのエラーに対して例外を発生させるように指定できます。

oracle.xml.pipeline.controller.PipelineErrorHandlerインタフェースは、表9-6に示すメソッドを宣言します。これらのメソッドはすべてvoidを戻します。

表9-6 PipelineErrorHandlerのメソッド

メソッド

説明

error(java.lang.String msg, PipelineException e)

PipelineExceptionエラーを処理します。

fatalError(java.lang.String msg, PipelineException e)

致命的なPipelineExceptionエラーを処理します。

warning(java.lang.String msg, PipelineException e)

PipelineException警告を処理します。

info(java.lang.String msg)

エラーに関するオプションの追加情報を出力します。

表9-6の最初の3つのメソッドは、oracle.xml.pipeline.controller.PipelineExceptionオブジェクトへの参照を受け取ります。特に実用的なPipelineExceptionクラスのメソッドを次に示します。

- getExceptionType(): 発生した例外のタイプを取得

- getProcessId(): 例外が発生したプロセスIDを取得

- getMessage(): このThrowableエラーのメッセージ文字列を戻す

PipelineSampleErrHdler.javaソース・ファイルは、PipelineSampleプログラムで使用される基本的なエラー・ハンドラを実装します。基本手順は次のとおりです。

1. コンストラクタを実装します。次に示すように、コンストラクタはログ・ファイル名を受け入れ、それをFileWriterオブジェクトの中にラップします。

PipelineSampleErrHdlr(String logFile) throws IOException
{
log = new PrintWriter(new FileWriter(logFile));
}

2. error()メソッドを実装します。この実装は、プロセスID、例外タイプおよびエラー・メッセージを出力します。また、エラー・カウントを保持する変数を増分します。次に例を示します。

public void error (String msg, PipelineException e) throws Exception
{
log.println("\nError in: " + e.getProcessId());
log.println("Type: " + e.getExceptionType());
log.println("Message: " +  e.getMessage());
log.println("Error message: " + msg);
log.flush();
errCount++;
}

3. fatalError()メソッドを実装します。この実装は、error()のパターンに従います。次に例を示します。

public void fatalError (String msg, PipelineException e) throws Exception
{
log.println("\nFatalError in: " + e.getProcessId());
log.println("Type: " + e.getExceptionType());
log.println("Message: " +  e.getMessage());
log.println("Error message: " + msg);
log.flush();
errCount++;
}

4. warning()メソッドを実装します。この実装は、errCount変数のかわりにwarnCount変数を増分することを除いて、error()の基本パターンに従います。次に例を示します。

public void warning (String msg, PipelineException e) throws Exception
{
log.println("\nWarning in: " + e.getProcessId());
log.println("Message: " +  e.getMessage());
log.println("Error message: " + msg);
log.flush();
warnCount++;
}

5. info()メソッドを実装します。このメソッドは前述のメソッドとは異なり、PipelineExceptionの参照を入力として受け取りません。次に示す実装は、メソッドが受け取ったStringを出力し、warnCount変数の値を増分します。

public void info (String msg)
{
log.println("\nInfo : " + msg);
log.flush();
warnCount++;
}

6. PrintWriterをクローズするメソッドを実装します。次に示すコードは、closeLog()メソッドを実装します。このメソッドは、エラーおよび警告の数を出力し、PrintWriter.close()をコールします。

public void closeLog()
{
log.println("\nTotal Errors: " + errCount + "\nTotal Warnings: " +
warnCount);
log.flush();
log.close();
}

関連項目:
PipelineErrorHandlerインタフェースおよびPipelineExceptionクラスの詳細は、Oracle Database XML Java APIリファレンスを参照してください

10 XDK JavaBeansの使用

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

- XDK JavaBeansの概要

- XDK JavaBeansの使用: 概要

- XDK JavaBeansによるXMLの処理

XDK JavaBeansの概要

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

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

- 前提条件

- 標準と仕様

- XDK JavaBeansの機能

前提条件

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

- JavaBeans: JavaBeansのコンポーネント(Bean)は、ビルダー・ツールでビジュアルに操作できる再利用可能なソフトウェア・コンポーネントです。

- Java Database Connectivity (JDBC): XDK JavaBeansにはデータベースへの接続性もあります。XDK JavaBeansはJDBC対応のデータベースに直接接続して、XMLファイルやXSLファイルを取得および格納できます。

- Document Object Model (DOM): DOMは、XML文書の構造を示すインメモリー・ツリー表現です。

- Simple API for XML (SAX): SAXは、イベントベースのXML解析の標準です。

- XMLスキーマ言語: 概要および関連資料へのリンクは、第7章「Schema Processor for Javaの使用」を参照してください。

標準と仕様

XDK JavaBeansには、XDKバージョン1.2以上が必要です。XDK JavaBeansは、JDK 1.2以上のすべてのバージョンで使用できます。すべてのXDK BeanはSun JavaBeans仕様に準拠し、java.beans.SimpleBeanInfoを拡張する必須のBeanInfoクラスが含まれます。

JDK 1.1のJavaBeansについて記述したJavaBeans 1.01仕様は、次のURLで入手できます。

http://www.oracle.com/technetwork/java/index.html

JavaBeansコア仕様にJava 2プラットフォームへの対応が追加され、より高度なJavaBeansコンポーネントを作成する標準手段が開発者に提供されました。Java 2のJavaBeans仕様は、次のURLで入手できます。

http://www.oracle.com/technetwork/java/index.html

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

XDK JavaBeansの機能

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

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

- DOMBuilder

- XSLTransformer

- DBAccess

- XMLDiff

- XMLCompress

- XMLDBAccess

- XSDValidator

DOMBuilder

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

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

関連項目:
「DOMBuilder JavaBeanの使用: 基本プロセス」

XSLTransformer

oracle.xml.async.XSLTransformer Beanは、非同期変換をサポートします。これはXML文書を受け入れ、XSLTスタイルシートを適用し、出力ファイルを作成します。XSLTransformer JavaBeanを使用すると、XML文書をXML、HTML、DDLなどのほぼすべてのテキストベースの形式に変換できます。このBeanは、サーバー側のアプリケーションまたはサーブレットがXML文書(問合せ結果のXML表現など)をブラウザで表示するためにHTMLでレンダリングするための基礎として使用できます。

XSLTransformer Beanの主なメリットは、複数のファイルを同時に変換できることです。DOMBuilderと同様に、このBeanをビジュアル・アプリケーションで使用すると、GUIが長い期間応答しなくなることを防止できます。XSLTransformerListenerインタフェースを実装すると、変換が完了したときにコール元のアプリケーションに通知されます。

関連項目:
「XSLTransformer JavaBeanの使用: 基本プロセス」

DBAccess

oracle.xml.dbaccess.DBAccess Beanは、複数のXML文書およびテキスト・ドキュメントを含むCLOB表をメンテナンスします。このBeanは、データベース内でXML文書を処理する必要はないが、データベースにXML文書を格納し、データベースからXML文書を取得する必要がある場合に使用できます。DBAccess Beanを使用するJavaアプリケーションは、JDBCを介してデータベースに接続します。CLOB表に格納されたXML文書がXMLType型でない場合は、エンティティが展開されません。

DBAccess Beanを使用すると、次のタスクを実行できます。

- CLOB型の表の作成および削除

- CLOB表の内容の問合せ

- CLOB表に格納されたXML文書に対するINSERT、UPDATEおよびDELETE操作の実行

XMLDBAccess

oracle.xml.xmldbaccess.XMLDBAccess Beanは、DBAccess Beanを拡張してXMLType表に格納されたXML文書をサポートします。このクラスは、XMLTypeインスタンスおよびそれらの表を表示、削除または取得するメソッドを提供します。たとえば、getXMLXPathTextData()メソッドは、XML文書からXPath式の値を取得します。

DBAccess JavaBeanは、複数のXML文書およびテキスト・ドキュメントを保持できるXMLType表をメンテナンスします。各XML文書またはテキスト・ドキュメントは、表の行として格納されます。表の作成には次のSQL文を使用します。

CREATE TABLE (FILENAME   CHAR( ) UNIQUE,
FILEDATA   SYS.XMLType);

FILENAMEフィールドには、その行を検索、更新または削除するためにキーとして使用される一意の文字列があります。文書のテキストはFILEDATAフィールドに格納されます。

XMLDBAccess Beanが実行するタスクは次のとおりです。

- XMLType表の作成および削除

- XMLType列の内容の表示

- XMLType表に格納されたXML文書に対するINSERT、UPDATEおよびDELETE操作の実行

関連項目:
「XMLDBAccess JavaBeanの使用: 基本プロセス」

XMLDiff

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

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

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

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

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

関連項目:

- 第9章「XML Pipeline Processor for Javaの使用」

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

XMLCompress

「XMLの圧縮」で説明しているように、Oracle XMLパーサーには、XML文書オブジェクトをバイナリ・ストリームとしてシリアライズできる圧縮プログラムが含まれます。便利なツールではありますが、XMLパーサーによる圧縮には次の短所があります。

- XMLデータをデシリアライズしたとき、再解析が必要になります。

- タグの中にXMLデータをカプセル化すると、サイズが大幅に増加します。

oracle.xml.xmlcomp.XMLCompress Beanは、XML圧縮機能をカプセル化したものです。これを使用してXMLをシリアライズおよびデシリアライズすると、次の利点があります。

- DOMをシリアライズするメソッドをカプセル化し、ストリーム形式にします。

- XMLプロセッサは、XMLを再解析せずに圧縮ストリームからDOMを再生成できます。

このBeanは、DOMParserまたはSAXParserによって解析された入力XMLの圧縮と解凍をサポートします。DOM圧縮は、XMLType型、CLOB型およびBLOB型の入力をサポートします。

様々な解析オプションを使用するには、入力前に文書を解析してから、XMLDocumentオブジェクトをCompressor Beanに渡します。圧縮係数は、入力XMLファイルおよび圧縮したファイルのサイズに基づく大まかな値です。圧縮係数メソッドは、java.io.Fileオブジェクトをパラメータとして使用して圧縮を行う場合にのみ使用できます。

XSDValidator

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

XDK JavaBeansの使用: 概要

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

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

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

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

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

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

- XSLTransformer JavaBeanの使用: 基本プロセス

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

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

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

DOMBuilderクラスは、W3C勧告に準拠したXML 1.0のパーサーを実装します。XML文書を解析してDOMツリーを構築します。解析は別のスレッドで行われます。ツリーが構築されたときに通知されるようにするにはDOMBuilderListenerインタフェースを使用する必要があります。

このBeanを使用するアプリケーションを開発する場合、次のサブパッケージをインポートする必要があります。

- oracle.xml.async: DOMを構築するための非同期JavaBeansを提供します。

- oracle.xml.parser.v2: SAX、DOMおよびXSLTのAPIを提供します。

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

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

クラス/インタフェース

説明

DOMBuilderクラス

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

DOMBuilderEventクラス

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

DOMBuilderListenerインタフェース

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

DOMBuildeErrorEventクラス

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

DOMBuilderErrorListenerインタフェース

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

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

図10-1 DOMBuilder JavaBeanの使用方法

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

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

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

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

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

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

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

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

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

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

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

XSLTransformer Beanは、Beanインタフェースを使用してJava XMLパーサーのXSLT処理エンジンをカプセル化し、その機能を拡張して非同期変換を可能にします。Javaアプリケーションは、リスナーを登録することによって、コール元にすぐに制御を返し、大規模または連続したドキュメントを解析できます。

このBeanを使用するアプリケーションを開発する場合、次のサブパッケージをインポートする必要があります。

- oracle.xml.async: XSLT変換のための非同期JavaBeansを提供します。

- oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。

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

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

クラス/インタフェース

説明

XSLTransformerクラス

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

XSLTransformerEventクラス

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

XSLTransformerListenerインタフェース

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

XSLTransformerErrorEventクラス

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

XSLTransformerErrorListenerインタフェース

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

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

図10-2 XSLTransformer JavaBeanの使用方法

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

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

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

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

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

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

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

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

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

XMLDBAccess Beanを使用するアプリケーションを開発する場合、次のサブパッケージを使用する必要があります。

- oracle.xml.xmldbaccess: XMLDBAccess Beanが含まれます。

- oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。

oracle.xml.parser.v2サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-3に、XMLDBAccessクラスの重要なメソッドを示します。

表10-3 XMLDBAccessのメソッド

クラス/インタフェース

説明

createXMLTypeTable()

XMLType表を作成します。

insertXMLTypeData()

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

replaceXMLTypeData()

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

getXMLTypeTableNames()

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

getXMLTypeData()

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

getXMLTypeXPathTextData()

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

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

図10-3 XMLDBAccess JavaBeanの使用方法

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

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

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

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

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

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

6. 接続を終了します。

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

XMLDiff Beanを使用するアプリケーションを開発する場合、一般的に使用するサブパッケージは次のとおりです。

- oracle.xml.xmldiff: XMLDiff Beanが含まれます。

- oracle.xml.parser.v2: XMLを解析するSAX、DOMおよびXSLTのAPIを提供します。

- oracle.xml.async: DOMを構築するための非同期JavaBeansを提供します。

oracle.xml.parser.v2サブパッケージの詳細は、第4章「XML Parsing for Java」を参照してください。表10-4に、XMLDiffクラスの重要なメソッドを示します。

表10-4 XMLDiffのメソッド

クラス/インタフェース

説明

diff()

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

generateXSL()

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

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

setFiles()

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

getDocument1()

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

getDiffPane1()

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

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

図10-4 XMLDiff JavaBeanの使用方法

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

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

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

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

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

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

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

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

XDK JavaBeansのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/transviewerディレクトリにあります。デモでは、「XDK JavaBeansの機能」で説明しているXDK Bean、および非推奨となった一部のビジュアルなBeanの使用方法を示します。デモで使用されているすべてのBeanを次に示します。

- XSLTransformer

- DOMBuilder

- DBAccess

- XMLDBAccess

- XMLDiff

- XMLCompress

- XSDValidator

- oracle.xml.srcviewer.XMLSourceView (非推奨)

- oracle.xml.treeviewer.XMLTreeView (非推奨)

- oracle.xml.transformer.XMLTransformPanel (非推奨)

- oracle.xml.dbviewer.DBViewer (非推奨)

ビジュアルなBeanは非推奨ですが、学習用として役に立ちます。非推奨のBeanはそのために$ORACLE_HOME/lib/xmldemo.jarに含まれています。推奨のBeanは$ORACLE_HOME/lib/xml.jarにあります。

表10-5に、デモ・ディレクトリにあるサンプル・プログラムを示します。表の最初の列に、非推奨のBeanがどのサンプル・プログラムで使用されているかを示します。

表10-5 JavaBeanのサンプルJavaソース・ファイル

サンプル

ファイル名

説明

sample1

(非推奨)

XMLTransformPanelSample.java

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

関連項目: 「sample1の実行」

sample2

(非推奨)

ViewSample.java

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

関連項目: 「sample2の実行」

sample3

AsyncTransformSample.java

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

関連項目: 「sample3の実行」

sample4

(非推奨)

DBViewSample.java

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

関連項目: 「sample4の実行」

DBViewClaims.java

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

DBViewFrame.java

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

sample5

XMLDBAccessSample.java

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

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

関連項目: 「sample5の実行」

sample6

(非推奨)

XMLDiffSample.java

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

関連項目: 「sample6の実行」

XMLDiffFrame.java

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

XMLDiffSrcView.java

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

sample7

(非推奨)

compviewer.java

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

関連項目: 「sample7の実行」

compstreamdata.java

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

dbpanel.java

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

filepanel.java

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

xmlcompressutil.java

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

sample8

(非推奨)

XMLSchemaTreeViewer.java

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

関連項目: 「sample8の実行」

TreeViewerValidate.java

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

sample9

(非推奨)

XMLSrcViewer.java

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

関連項目: 「sample9の実行」

XMLSrcViewPanel.java

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

sample10

XSDValidatorSample.java

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

関連項目: 「sample10の実行」

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

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

ファイル名

説明

XMLDiffData1.txt

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

XMLDiffData2.txt

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

booklist.xml

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

claim.sql

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

doc.xml

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

doc.xsl

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

emptable.xsl

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

note_in_dtd.xml

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

purchaseorder.xml

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

purchaseorder.xsd

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

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

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

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

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

- MakefileのJDKPATHを、JDKパスを指すように変更します。

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

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

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

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

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

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

sample1の実行

sample1は、XMLTransViewer Beanを使用するプログラムです。次のように手動でプログラムを実行できます。

java XMLTransformPanelSample

このプログラムを使用して、OracleデータベースのXMLファイルをインポートおよびエクスポートし、データベースにXSLT変換ファイルを格納し、XMLにスタイルシートを対話式に適用できます。このプログラムでデータベース接続機能を使用するには、データベースを実行しているコンピュータのネットワーク名、ポート(通常は1521)およびOracleインスタンスの名前(通常はorcl)を把握しておく必要があります。また、CREATE TABLE権限を持つアカウントも必要です。サンプル・スキーマをインストールした場合は、アカウントhrを使用できます。XMLTransViewerプログラムを使用して、XMLファイルにスタイルシート変換を適用し、結果を表示できます。表示されるパネルの上部および下部にはタブがあります。上部にある最初の2つのタブは、XMLバッファとXSLTバッファの切替えに使用します。3つ目のタブでは、XMLバッファに対してXSLT変換を実行し、結果を表示します。下部にある最初の2つのタブを使用して、Oracleデータベースおよびファイル・システムのデータをロードおよび保存できます。下部の残りのタブでは、現在のコンテンツの表示をツリー表示、XMLソース、編集モードまたはHTML(変換後の結果の表示の場合)に切り替えます。

sample2の実行

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

java ViewSample

sample3の実行

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

java AsyncTransformSample

sample4の実行

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

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

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

java -classpath "$(MAKE_CLASSPATH)" DBViewSample

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

sample5の実行

Sample5は、XMLDBAccess Beanの非ビジュアルなデモです。XMLTypeオブジェクトを使用して、データベースの中にXML文書を格納します。次のプログラムは、Javaシン・クライアントを使用してデータベースに接続し、XMLType表を作成し、booklist.xmlからデータをロードします。このプログラムを実行するには、次の情報をコマンドライン引数として指定する必要があります。

- ホスト名(たとえば、myhost)

- ポート番号(たとえば、1521)

- データベースのSID(たとえば、ORCL)

- 表を作成するためのデータベース・アカウント(たとえば、hr)

- データベース・アカウントのパスワード(たとえば、hr)

たとえば、次のようにプログラムを実行できます。

java XMLDBAccessSample myhost 1521 ORCL hr hr

次のテキストは、dbaccess.logからのサンプル出力です。

Demo for createXMLTypeTables():
Table +'testxmltype' successfully created.

Demo for listXMLTypeTables():
tablenamename=TESTXMLTYPE

Demo for replaceXMLTypeData() (similar to insert):
XML Data from +'booklist.xml' successfully replaced in table 'testxmltype'.

Demo for getXMLTypeData():
XMLType data fetched:
<?xml version="1.0"?>
<booklist>
<book isbn="1234-123456-1234">
<title>C Programming Language</title>
<author>Kernighan and Ritchie</author>
<publisher>EEE</publisher>
<price>7.99</price>
</book>
...
<book isbn="1230-23498-2349879">
<title>Emperor's New Mind</title>
<author>Roger Penrose</author>
<publisher>Oxford Publishing Company</publisher>
<price>15.99</price>
</book>
</booklist>

Demo for getXMLTypeXPathTextData():
Data fetched using XPath exp '/booklist/book[3]':
<book isbn="2137-598354-65978">
<title>Twelve Red Herrings</title>
<author>Jeffrey Archer</author>
<publisher>Harper Collins</publisher>
<price>12.95</price>
</book>

sample6の実行

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

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

java -mx50m XMLDiffSample XMLDiffData1.txt XMLDiffData2.txt

ファイアウォールの外側のURLにアクセスするDTDを入力XMLファイルで使用する場合は、XMLDiffSample.javaを変更して、setFiles()コールの前にプロキシ・サーバーの設定を含めます。たとえば、次のようにプログラムを変更します。

/* Set proxy to access dtd through firewall */
Properties p = System.getProperties();
p.put("proxyHost", "www.proxyservername.com");
p.put("proxyPort", "80");
p.put("proxySet", "true");
/* You will also have to import java.util.*; */

sample7の実行

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

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

java compviewer

sample8の実行

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

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

java XMLSchemaTreeViewer

sample9の実行

sample9のデモは、SourceViewer Beanの使用方法を示します。XMLSrcViewerプログラムでは、構文のハイライト表示を有効にしてXML文書またはDTDを表示できます。入力したXMLスキーマまたはDTDに対してXML文書を検証できます。内部または外部のDTDを使用できます。

検証が成功した場合は、「ソース表示」ペインでインスタンス・ドキュメントおよびXMLスキーマまたはDTDを表示できます。スキーマ検証でエラーが検出された場合は、「エラー」ペインにエラー・ログと行番号が表示されます。「ソース表示」ペインには、エラー・ノードがハイライトされた状態でXML文書が表示されます。サンプル・ファイルpurchaseorder.xmlおよびpurchaseorder.xsdをは、XMLスキーマ検証のエラーをテストするために使用できます。note_in_dtd.xmlをDTD検証モードで使用すると、検証エラーとともに内部DTDを表示できます。次のように手動でプログラムを実行できます。

java XMLSrcViewer

sample10の実行

sample10のデモは、XSDValidator Beanの使用方法を示します。XSDValidatorSampleプログラムの2つの入力引数は、XML文書とその関連XMLスキーマです。このプログラムでは、検証中に発生したエラーが、行番号を含めて表示されます。

次のプログラムでは、purchaseorder.xsdを使用してpurchaseorder.xmlの内容を検証します。

java XSDValidatorSample purchaseorder.xml purchaseorder.xsd

このXML文書は、スキーマ検証で失敗します(予定どおりの動作)。次のエラーが表示されます。

Sample purchaseorder.xml purchaseorder.xsd
<Line 2, Column 41>: XML-24523: (Error) Invalid value 'abc' for attribute: 'orderDate'
#document->purchaseOrder
<Line 7, Column 27>: XML-24525: (Error) Invalid text 'CA' in element: 'state'
#document->purchaseOrder->shipTo->state->#text
<Line 8, Column 25>: XML-24525: (Error) Invalid text 'sd' in element: 'zip'
#document->purchaseOrder->shipTo->zip->#text
<Line 14, Column 27>: XML-24525: (Error) Invalid text 'PA' in element: 'state'
#document->purchaseOrder->billTo->state->#text
<Line 17, Column 22>: XML-24534: (Error) Element 'coment' not expected.
#document->purchaseOrder->coment
<Line 29, Column 31>: XML-24534: (Error) Element 'shipDae' not expected.
#document->purchaseOrder->items->item->shipDae

XDK JavaBeansによるXMLの処理

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

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

- XMLDiff BeanによるXML文書の比較

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

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

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

- runDOMBuilders()

- runXSLTransformer()

- saveResult()

- makeXSLDocument()

- createURL()

- init()

- exitWithError()

- asyncTransform()

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

1. このプログラムは、クラスで使用されるフィールドを宣言および初期化します。入力XSLTスタイルシートは、doc.xslとしてプログラムにハードコードされています。クラスでは次のフィールドを定義します。

String        basedir = new String (".");
OutputStream  errors = System.err;
Vector        xmlfiles = new Vector();
int           numXMLDocs = 1;
String        xslFile = new String ("doc.xsl");
URL           xslURL;
XMLDocument   xsldoc

2. main()メソッドがinit()メソッドを起動して初期設定が実行されます。現在のディレクトリ内のファイルがリストされ、拡張子.xmlで終わるファイルが見つかった場合は、Vectorオブジェクトに追加されます。init()メソッドの実装は次のとおりです。

boolean init () throws Exception
{
File     directory = new File (basedir);
String[] dirfiles = directory.list();
for (int j = 0; j < dirfiles.length; j++)
{
String dirfile = dirfiles[j];

if (!dirfile.endsWith(".xml"))
continue;

xmlfiles.addElement(dirfile);
}

if (xmlfiles.isEmpty()) {
System.out.println("No files in directory were selected for processing");
return false;
}
numXMLDocs = xmlfiles.size();

return true;
}

3. main()メソッドは次のようにAsyncTransformSampleをインスタンス化します。

AsyncTransformSample inst = new AsyncTransformSample();

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

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

2. runDOMBuilders()をコールして、インスタンス・ドキュメント(変換されるドキュメント)の解析を開始し、解析後にドキュメントを変換します。

XMLの処理が開始すると、プログラムに制御が戻り、バックグラウンドで処理が実行されるまで待機します。最後のリクエストが完了すると、メソッドが終了します。

次のコードは、asyncTransform()メソッドの実装を示します。

void asyncTransform () throws Exception
{
System.err.println (numXMLDocs +
" XML documents will be transformed" +
" using XSLT stylesheet specified in " + xslFile +
" with " +  numXMLDocs + " threads");

makeXSLDocument ();
runDOMBuilders ();

// wait for the last request to complete
while (rm.activeFound())
Thread.sleep(100);
}

次の項では、makeXSLDocument()メソッドおよびrunDOMBuilders()メソッドについて説明します。

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

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

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

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

DOMParser parser = new DOMParser();

2. パーサーを構成します。次のコード部分は、空白の保持を指定します。

parser.setPreserveWhitespace(true);

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

xslURL = createURL (xslFile);

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

parser.parse (xslURL);

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

xsldoc = parser.getDocument();

XML文書の非同期処理

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

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

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

rm = new ResourceManager (numXMLDocs);
for (int i = 0; i < numXMLDocs; i++)
{
rm.getResource();
...
}

2. 入力XML文書ごとにDOMビルダーBeanをインスタンス化します。次に例を示します。

DOMBuilder builder = new DOMBuilder(i);

3. XMLファイル名からURLオブジェクトを作成します。次に例を示します。

DOMBuilder builder = new DOMBuilder(i);
URL  xmlURL = createURL(basedir + "/" + (String)xmlfiles.elementAt(i));
if (xmlURL == null)
exitWithError("File " + (String)xmlfiles.elementAt(i) + " not found");

4. DOMビルダーを構成します。次のコード部分は、空白の保持を指定し、文書のベースURLを設定します。

builder.setPreserveWhitespace(true);
builder.setBaseURL (createURL(basedir + "/"));

5. DOMビルダーのリスナーを追加します。addDOMBuilderListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、DOMBuilderListenerインタフェースを実装する必要があります。プログラムでは、domBuilderStarted()およびdomBuilderError()には何も処理が実装されませんが、XML文書の解析が完了したときにコールされるdomBuilderOver()メソッドには、実際に処理を行う実装が必要です。このメソッドは、XMLの変換を行うrunXSLTransformer()メソッドを起動します。このメソッドの詳細は、「XSLTransformer BeanによるXMLの変換」を参照してください。

次のコード部分は、リスナーを追加する方法を示します。

builder.addDOMBuilderListener
(
new DOMBuilderListener()
{
public void domBuilderStarted(DOMBuilderEvent p0) {}
public void domBuilderError(DOMBuilderEvent p0) {}
public synchronized void domBuilderOver(DOMBuilderEvent p0)
{
DOMBuilder bld = (DOMBuilder)p0.getSource();
runXSLTransformer (bld.getDocument(), bld.getId());
}
}
);

6. DOMビルダーのエラー・リスナーを追加します。addDOMBuilderErrorListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、DOMBuilderErrorListenerインタフェースを実装する必要があります。次のコード部分は、実装方法を示します。

builder.addDOMBuilderErrorListener
(
new DOMBuilderErrorListener()
{
public void domBuilderErrorCalled(DOMBuilderErrorEvent p0)
{
int id = ((DOMBuilder)p0.getSource()).getId();
exitWithError("Error occurred while parsing " +
xmlfiles.elementAt(id) + ": " +
p0.getException().getMessage());
}
}
);

7. ドキュメントを解析します。この方法を示す文は次のとおりです。

builder.parse (xmlURL);
System.err.println("Parsing file " + xmlfiles.elementAt(i));

XSLTransformer BeanによるXMLの変換

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

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

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

XSLTransformer processor = new XSLTransformer (id);

2. 新規スタイルシート・オブジェクトを作成します。次に例を示します。

XSLStylesheet  xsl       = new XSLStylesheet (xsldoc, xslURL);

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

processor.showWarnings (true);
processor.setErrorStream (errors);

4. XSLTプロセッサのリスナーを追加します。プログラムからaddXSLTransformerListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、XLSTransformerListenerインタフェースを実装する必要があります。プログラムでは、xslTransformerStarted()およびxslTransformerError()には何も処理が実装されませんが、XML文書の解析が完了したときにコールされるxslTransformerOver()メソッドには、実際に処理を行う実装が必要です。このメソッドは、変換結果をファイルに出力するsaveResult()を起動します。

次のコード部分は、リスナーを追加する方法を示します。

processor.addXSLTransformerListener
(
new XSLTransformerListener()
{
public void xslTransformerStarted (XSLTransformerEvent p0) {}
public void xslTransformerError(XSLTransformerEvent p0) {}
public void xslTransformerOver (XSLTransformerEvent p0)
{
XSLTransformer trans = (XSLTransformer)p0.getSource();
saveResult (trans.getResult(),  trans.getId());
}
}
);

5. XSLTプロセッサのエラー・リスナーを追加します。プログラムからaddXSLTransformerErrorListener()を起動することで、リスナーが追加されます。
リスナーの作成のためにインスタンス化されるクラスは、XLSTransformerErrorListenerインタフェースを実装する必要があります。次のコード部分は、実装方法を示します。

processor.addXSLTransformerErrorListener
(
new XSLTransformerErrorListener()
{
public void xslTransformerErrorCalled(XSLTransformerErrorEvent p0)
{
int i = ((XSLTransformer)p0.getSource()).getId();
exitWithError("Error occurred while processing " +
xmlfiles.elementAt(i) + ": " +
p0.getException().getMessage());
}
}
);

6. XSLTスタイルシートを使用してXML文書を変換します。この方法を示す文は次のとおりです。

processor.processXSL (xsl, xml);

XMLDiff BeanによるXML文書の比較

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

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

- showDiffs()

- doXSLTransform()

- createURL()

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

1. このプログラムは、クラスで使用されるフィールドを宣言および初期化します。XMLDiffFrame型のフィールドが1つあります。これはXMLDiffFrame.javaデモで実装されるクラスです。クラスでは次のフィールドを定義します。

protected XMLDocument doc1;   /* DOM tree for first file */
protected XMLDocument doc2;   /* DOM tree for second file */
protected static XMLDiffFrame diffFrame; /* GUI frame */
protected static XMLDiffSample dfxApp;   /* XMLDiff sample application */
protected static XMLDiff xmlDiff;        /* XML diff object */
protected static XMLDocument xslDoc;     /* parsed xsl file */
protected static String outFile = new String("XMLDiffSample.xsl"); /* output
xsl file name */

2. main()メソッドが次のようにXMLDiffSampleオブジェクトを作成します。

dfxApp = new XMLDiffSample();

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

diffFrame = new XMLDiffFrame(dfxApp);
diffFrame.addTransformMenu();

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

xmlDiff = new XMLDiff();

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

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

2. 入力文書の1つを他の文書に変換できるXSLTスタイルシートを生成し、表示します。

次のコード部分は、showDiffs()メソッド・コールを示します。

if (args.length == 3)
outFile = args[2];
if(args.length >= 2)
dfxApp.showDiffs(new File(args[0]), new File(args[1]));
diffFrame.setVisible(true);

次の項では、showDiffs()メソッドについて説明します。

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

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

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

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

xmlDiff.setFiles(file1, file2);

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

if(!xmlDiff.diff())
{
JOptionPane.showMessageDialog
(
diffFrame,
"Files are equivalent in XML representation",
"XMLDiffSample Message",
JOptionPane.PLAIN_MESSAGE
);
}

3. 2つのドキュメントの差分を示すXSLTスタイルシート用にDOMを生成します。次のコード部分は、この方法を示します。

xslDoc = xmlDiff.generateXSLDoc();

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

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

diffFrame.makeSrcPane(xmlDiff.getDocument1(), xmlDiff.getDocument2());

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

diffFrame.makeDiffSrcPane(new XMLDiffSrcView(xmlDiff.getDiffPane1()),
new XMLDiffSrcView(xmlDiff.getDiffPane2()));

3. XSLTスタイルシートのペインを作成します。次に示すように、スタイルシートのDOMを渡します。

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

11 XML SQL Utility(XSU)の使用

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

- XML SQL Utility(XSU)の概要

- XML SQL Utility(XSU)の使用: 概要

- XSU Java APIを使用したプログラミング

- XSU PL/SQL APIを使用したプログラミング

- XSUを使用したプログラミングのヒントと方法

XML SQL Utility(XSU)の概要

XML SQL Utility (XSU)は、Oracle SQL文を介したXMLデータの転送を可能にする、XDKコンポーネントの1つです。XSUを使用すると、次のタスクを実行できます。

- オブジェクト・リレーショナル・データベースの表またはビューのデータをXMLに変換します。XSUは、データベースの問合せを実行し、結果セットをXML文書として戻します。

- XML文書からデータを抽出し、正規マッピングを使用して、表またはビューへのデータの挿入、適切な列または属性の値を更新または削除できます。

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

- 前提条件

- XSUの機能

- XSUの制限

前提条件

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

- Oracle Database SQL: XSUは、SELECT文およびDMLを介して、データベースとの間でXMLを転送します。

- PL/SQL: XDKには、Java APIをミラー化するXSU用のPL/SQL APIがあります。

- Java Database Connectivity (JDBC): XSUを使用してデータベースとの間でXMLの転送を行うJavaアプリケーションには、JDBC接続が必要です。

XSUの機能

XSUの主な機能は次のとおりです。

- DTDまたはXMLスキーマを動的に生成します。

- XML文書を、文書の文字列またはDOM表現で生成します。

- 生成中、各<ROW>要素のデフォルト・タグ名の変更など、単純な変換を実行します。XSL変換を登録し、生成したXML文書に対して、XSUは必要に応じてその変換を適用できます。

- SAX2コールバックのストリームとしてXMLを生成します。

- 生成中のXML属性をサポートします。この属性のサポートにより、特定の列または列のグループが、XML要素ではなくXML属性にマップされるように指定できます。

- SQLからXMLへのタグのエスケープが可能です。列名が有効なXMLタグ名ではない場合があります。この問題を回避するには、すべての列名に別名を付けるか、またはタグをエスケープします。

- オブジェクトまたは表内のXMLType列をサポートします。

- リレーショナル・データベースの表またはビューにXMLを挿入します。XML文書を指定すると、XSUはデータベース・オブジェクトのレコードを更新または削除できます。

XSUの制限

XSUを使用する場合は、次の制限に注意してください。

- XSUは、単一表にのみデータを格納できます。ただし、Oracle XSLTプロセッサを使用して文書を複数の文書に変換し、これらの文書を別々に挿入することで、複数の表にXMLを格納できます。また、複数表にまたがるビューを定義し、ビューへの挿入を行うこともできます。このビューが更新不可能(複雑な結合などのために)な場合は、ビューにまたがってINSTEAD OFトリガーを使用して、挿入を実行できます。

- 属性に格納されたXMLデータはXSUを使用してデータベース・スキーマにロードできませんが、XSLT変換を使用して属性を要素に変更することは可能です。

- デフォルトでは、XSUには大/小文字の区別があります。正確な大/小文字を使用するか、大/小文字の区別を無視するように指定できます。

- XSUは、入力DTDからリレーショナル・データベース・スキーマを生成できません。

- XSUを使用したXMLType表への挿入はサポートされていません。XMLType列はサポートされています。

XML SQL Utility(XSU)の使用: 概要

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

- XSUの使用: 基本プロセス

- XSUのインストール

- XSUのデモ・プログラムの実行

- XSUコマンドライン・ユーティリティの使用

XSUの使用: 基本プロセス

次のインタフェースからXSUにアクセスできます。

- oracle.xml.sql.queryパッケージのOracleXMLQueryおよびOracleXMLSave Javaクラス:OracleXMLQueryクラスを使用してリレーショナル・データからXMLを生成し、OracleXMLSaveクラスを使用してDMLを実行します。

- PL/SQLパッケージDBMS_XMLQueryおよびDBMS_XMLSave: Javaクラスをミラー化します。

次のようなXSUアプリケーションを作成できます。

- データベース内で実行して内部XSU Java APIにアクセスするJavaプログラム

- クライアントで実行してクライアント側XSU Java APIにアクセスするJavaプログラム

- PL/SQLパッケージを介してXSUにアクセスするPL/SQLプログラム

XSUのJava APIを使用したXMLの生成: 基本プロセス

OracleXMLQueryクラスは、XSUのJava APIのXML生成部分を構成します。図11-1に、XSUを使用してXMLを生成するための基本プロセスを示します。

図11-1の基本手順は次のとおりです。

図11-1 XSUを使用したXMLの生成

1. データベースへのJDBC接続を作成します。通常では、JDBCドライバのセットを管理するDriverManagerクラスとの接続を確立します。JDBCドライバをロードした後、getConnection()をコールします。適切なドライバが見つかると、このメソッドは、データベース・セッションを表すConnectionオブジェクトを戻します。すべてのSQL文は、このセッションのコンテキスト内で実行されます。
次のオプションがあります。

- JDBC OCIドライバを使用して接続を作成します。次のコード部分は、この方法を示します。

// import the Oracle driver class
import oracle.jdbc.*;
// load the Oracle JDBC driver
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
// create the connection
Connection conn =
DriverManager.getConnection("jdbc:oracle:oci:@","hr","password");

前述の例では、JDBC OCIドライバのデフォルト接続を使用しています。

- シンJDBCドライバを使用して接続を作成します。シン・ドライバはPure Javaで作成されており、すべてのJavaプログラムからコールできます。次のコード部分は、この方法を示します。

Connection conn =
DriverManager.getConnection("jdbc:oracle:thin:@dlsun489:1521:ORCL",
"hr","password");

シン・ドライバにはホスト名(dlsun489)、ポート番号(1521)およびOracle SID(ORCL)が必要です。データベースにはアクティブなTCP/IPリスナーが必要です。

- サーバー側の内部JDBCドライバが使用するデフォルト接続を使用します。このドライバは、デフォルト・セッションおよびデフォルト・トランザクション・コンテキスト内で実行されます。ユーザーはすでにデータベースに接続されているため、ユーザーのSQL操作はデフォルト・トランザクションの一部です。したがって、ドライバを登録する必要はありません。Connectionオブジェクトを次のように作成します。

Connection conn = new oracle.jdbc.OracleDriver().defaultConnection ();

注意:
OracleXMLDataSetExtJdbcはOracle JDBCでのみ使用され、OracleXMLDataSetGenJdbcはOracle以外のJDBCで使用されます。これらのクラスは、oracle.xml.sql.datasetパッケージにあります。

2. XML問合せオブジェクトを作成し、SQL問合せを割り当てます。コンストラクタにSQL問合せを渡して、OracleXMLQueryクラスのインスタンスを作成します。次に例を示します。

OracleXMLQuery qry = new OracleXMLQuery (conn, "SELECT * from EMPLOYEES");

3. OracleXMLQueryのメソッドを起動して、XML問合せオブジェクトを構成します。次の例は、結果セットに20行のみ含めることを指定します。

xmlQry.setMaxRows(20);

4. OracleXMLQueryのメソッドを起動して、DOMオブジェクトまたは文字列を戻します。DOMオブジェクトを取得する例を次に示します。

XMLDocument domDoc = (XMLDocument)qry.getXMLDOM();

文字列オブジェクトを取得する場合は次のとおりです。

String xmlString = qry.getXMLString();

5. 必要に応じて、文字列またはDOMに対して追加の処理を行います。

関連項目:

- Oracle JDBCの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

- OracleXMLQueryのメソッドの詳細は、Oracle Database XML Java APIリファレンスを参照してください

XSUのJava APIを使用したDMLの実行: 基本プロセス

OracleXMLSaveクラスを使用して、データベースのXMLを挿入、更新および削除します。図11-2に、基本プロセスを示します。

図11-2 XSUを使用したデータベースへのXMLの格納

図11-2の基本手順は次のとおりです。

1. データベースへのJDBC接続を作成します。この手順は、「XSUのJava APIを使用したXMLの生成: 基本プロセス」で説明している最初の手順と同じです。

2. XML保存オブジェクトを作成し、DMLを実行するための表を割り当てます。コンストラクタに表名またはビュー名を渡します。次に例を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. 主キー列を指定します。たとえば、次のコードは、employee_idがキー列であることを指定します。

String [] keyColNames = new String[1];
keyColNames[0] = "EMPLOYEE_ID";
sav.setKeyColumnList(keyColNames);

4. OracleXMLSaveのメソッドを起動して、XML保存オブジェクトを構成します。次の例は、salaryおよびjob_id列の更新を指定します。

String[] updateColNames = new String[2];
updateColNames[0] = "SALARY";
updateColNames[1] = "JOB_ID";
sav.setUpdateColumnList(updateColNames); // set the columns to update

5. OracleXMLSaveオブジェクトに対してinsertXML()、updateXML()またはdeleteXML()メソッドを起動します。次に更新の例を示します。

// Assume that the user passes in this XML document as the first argument
sav.updateXML(sav.getURL(argv[0]));

DMLの実行中に、XSUは次のタスクを行います。

1. 入力XML文書を解析します。

2. 要素名をターゲットの表またはビューにある列名と照合します。

3. 要素をSQL型に変換し、適切な文にバインドします。

6. OracleXMLSaveオブジェクトをクローズし、関連するすべてのコンテキストを割当て解除します。次に例を示します。

sav.close();

関連項目:

- JDBCの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

- OracleXMLSaveのメソッドの詳細は、Oracle Database XML Java APIリファレンスを参照してください

XSUのPL/SQL APIを使用したXMLの生成: 基本プロセス

XSUのPL/SQL APIは、XML文書の生成およびデータベースへの格納の方法がJava APIに似ています。DBMS_XMLQueryは、OracleXMLQuery Javaクラスのメソッドが反映されたPL/SQLパッケージです。このパッケージには、パッケージに対応付けられたコンテキスト・ハンドルがあります。コンストラクタに類似したファンクションの1つをコールしてコンテキストを作成し、ハンドルを取得してそのハンドルをすべての副問合せコールに使用します。

注意:
パフォーマンス向上のため、DBMS_XMLQUERYではなく、Cで記述されデータベースに組み込まれたCベースのDBMS_XMLGENの使用を検討してください。

XSUは、XMLTypeデータ型をサポートします。XSUでのXMLTypeの使用は、オブジェクトまたは表内にXMLType列が含まれる場合などに有効です。

XMLを生成すると、XML文書を含むCLOBが生成されます。DBMS_XMLQueryおよびXSU生成エンジンを使用するための基本手順は次のとおりです。

1. XML問合せコンテキストの変数および生成されたXMLの変数を宣言します。次に例を示します。

v_queryCtx  DBMS_XMLQuery.ctxType;
v_result    CLOB;

2. DBMS_XMLQuery.newContextファンクションをコールし、CLOBまたはVARCHAR2のいずれかで問合せを指定して、コンテキスト・ハンドルを取得します。次の例では、バインド変数:EMPLOYEE_IDおよび:FIRST_NAMEを含むWHERE句を使用して、employees表から行を選択する問合せを登録します。

v_queryCtx = DBMS_XMLQuery.newContext('SELECT * FROM employees
WHERE employee_id=:EMPLOYEE_ID AND first_name=:FIRST_NAME');

3. 値を問合せにバインドします。バインドは、名前を位置にバインドすることで行われます。clearBindValuesは、すべてのバインド変数を消去し、setBindValueは、単一のバインド変数に文字列値を設定します。たとえば、employee_idおよびfirst_nameの値を次のようにバインドします。

DBMS_XMLQuery.setBindValue(v_queryCtx,'EMPLOYEE_ID',20);
DBMS_XMLQuery.setBindValue(v_queryCtx,'FIRST_NAME','John');

4. 問合せコンテキストを構成します。ROWタグ名、ROWSETタグ名、フェッチする行の数などの引数をオプションで設定します。次の例は、デフォルトのROWSET要素名をEMPSETに変更します。

DBMS_XMLQuery.setRowSetTag(v_queryCtx,'EMPSET');

5. 結果をフェッチします。getXMLファンクションを使用して、XMLをCLOBとして取得します。このファンクションをコールすると、DTDまたはXMLスキーマの有無にかかわらずXMLを生成できます。次の例は、文にバインド値を適用し、述語employee_id = 20およびfirst_name = 'John'に対応する結果を取得します。

v_result := DBMS_XMLQuery.getXML(v_queryCtx);

6. XMLの生成結果を処理します。たとえば、プログラムで次の変数を宣言するとします。

v_xmlstr VARCHAR2(32767);
v_line   VARCHAR2(2000);

v_resultに格納されたCLOBを次のように出力できます。

v_xmlstr := DBMS_LOB.SUBSTR(v_result,32767);
LOOP
EXIT WHEN v_xmlstr IS NULL;
v_line := substr(v_xmlstr,1,INSTR(v_xmlstr,CHR(10))-1);
DBMS_OUTPUT.PUT_LINE('| ' || v_line);
v_xmlstr := SUBSTR(v_xmlstr,INSTR(v_xmlstr,CHR(10))+1);
END LOOP;

7. コンテキストをクローズします。次に例を示します。

DBMS_XMLQuery.closeContext(v_queryCtx);

PL/SQL APIを使用したDMLの実行: 基本プロセス

DBMS_XMLSaveは、OracleXMLSave Javaクラスのメソッドが反映されたPL/SQLパッケージです。このパッケージには、パッケージに対応付けられたコンテキスト・ハンドルがあります。コンストラクタに類似したファンクションの1つをコールしてコンテキストを作成し、ハンドルを取得してそのハンドルをすべての副問合せコールに使用します。

DBMS_XMLSaveを使用するための基本手順は次のとおりです。

1. XML保存コンテキストの変数およびDML操作の対象となる行数のための変数を宣言します。次に例を示します。

savCtx DBMS_XMLSave.ctxType;
v_rows   NUMBER;

2. DBMS_XMLSave.newContextファンクションをコールし、DML操作に使用する表名を指定して、コンテキスト・ハンドルを作成します。

savCtx  := DBMS_XMLSave.newContext('hr.employees');

3. 実行するDMLの種類に基づいてオプションを設定します。
挿入の場合は、setUpdateColumnファンクションに挿入する列のリストを設定できます。デフォルトでは、すべての列に値が挿入されます。次の例は、employees表の5つの列を設定します。

DBMS_XMLSave.setUpdateColumn(savCtx,'EMPLOYEE_ID');
DBMS_XMLSave.setUpdateColumn(savCtx,'LAST_NAME');
DBMS_XMLSave.setUpdateColumn(savCtx,'EMAIL');
DBMS_XMLSave.setUpdatecolumn(savCtx,'JOB_ID');
DBMS_XMLSave.setUpdateColumn(savCtx,'HIRE_DATE');

更新の場合は、キー列のリストを指定する必要があります。オプションで、更新する列のリストも指定できます。この場合は、キー列名と一致するXML文書内のタグがUPDATE文のWHERE句に使用され、更新列のリストと一致するタグがUPDATE文のSET句に使用されます。次に例を示します。

DBMS_XMLSave.setKeyColumn(savCtx,'employee_id'); -- set key column
-- set list of columns to update.
DBMS_XMLSave.setUpdateColumn(savCtx,'salary');
DBMS_XMLSave.setUpdateColumn(savCtx,'job_id');

削除の場合は、デフォルトで、指定した文書の各<ROW>要素にあるすべてのタグ値と一致するWHERE句が作成されます。この動作は、キー列のリストを設定することでオーバーライドできます。この場合は、タグ名がリスト内の列と一致するタグ値のみが、削除する行の識別に使用されます(DELETE文のWHERE句に使用して有効)。次に例を示します。

DBMS_XMLSave.setKeyColumn(savCtx,'EMPLOYEE_ID');

4. insertXML、updateXMLまたはdeleteXMLファンクションのコンテキストおよびXML文書を指定します。次に例を示します。

v_rows := DBMS_XMLSave.deleteXML(savCtx,xmlDoc);

5. DMLを必要な回数のみ繰り返します。

6. コンテキストをクローズします。次に例を示します。

DBMS_XMLSave.closeContext(savCtx);

「XSUのJava APIを使用したプログラミング」に示したJavaの例をモデルとして使用してください。

XSUのインストール

XSUは、他のXDKユーティリティとともにOracle DatabaseソフトウェアCDに含まれています。XSUのコンポーネントおよび依存性の説明は、「Java XDKコンポーネントの依存性」に記載されています。

デフォルトでは、Oracle Universal Installerによって、XSUがディスク上にインストールされ、データベースにロードされます。ユーザーが操作する必要はありません。OracleをインストールしたときにXSUをデータベースにロードしなかった場合は、次のようにXSUを手動でインストールできます。

1. Oracle XML DBがインストールされていることを確認します。

2. xsu12.jarファイルをデータベースにロードします。このJARファイルには、XMLTypeへのアクセスに関してxdb.jarへの依存性があります。JARファイルの詳細は、表3-1を参照してください。

3. $ORACLE_HOME/rdbms/admin/dbmsxsu.sqlスクリプトを実行します。このSQLスクリプトは、XSUのPL/SQL APIを構築します。

「XSUの使用: 基本プロセス」で説明しているように、XSUを使用するために、XSUをデータベースにロードする必要はありません。XSUは、Javaをサポートする任意の層に格納できます。

次の項では、インストール・オプションについて説明します。

- データベースへのXSUのインストール

- アプリケーション・サーバーへのXSUのインストール

- WebサーバーへのXSUのインストール

データベースへのXSUのインストール

図11-3に、データベースにインストールされたXSUライブラリを使用するアプリケーションの一般的なアーキテクチャを示します。データベース内で実行するXSUが生成したXMLは、データベースのアドバンスト・キュー内に置いて、他のシステムまたはクライアントにキューさせることができます。XMLは、データベース内のストアド・プロシージャを介して内部に配信するか、Webまたはアプリケーション・サーバーを通じて外部に配信します。

図11-3では、すべての矢印が両方向です。XSUでは、データを生成および保存できるため、データベース内で実行しているXSUにXMLを配信し、それを適切なデータベース表に挿入できます。

図11-3 データベース内でのXSUの実行

アプリケーション・サーバーへのXSUのインストール

アプリケーション・アーキテクチャによっては、中間層のアプリケーション・サーバーを使用する必要がある場合もあります。このアプリケーション層には、Oracle Database、Oracle Application Server、Javaプログラムをサポートするサード・パーティ製のアプリケーション・サーバーなどがあります。

様々な理由のために(たとえば、中間層で異なるJDBCデータ・ソースを統合するために)、中間層でSQL問合せまたはResultSetsからXMLを生成できます。この場合、中間層にXSUをインストールすると、JavaプログラムでJava APIを介してXSUを使用できます。

図11-4に、中間層でXSUを実行するための一般的なアーキテクチャを示します。中間層で、JDBCソースのデータはXSUによってXMLに変換され、Webサーバーまたは他のシステムに送信されます。ここでもプロセスは両方向であるため、XSUを使用してデータを元のJDBCソース(データベース表またはビュー)に戻すことができます。Oracleデータベース自体をアプリケーション・サーバーとして使用する場合は、JavaのかわりにPL/SQLのフロントエンドを使用できます。

図11-4 中間層でのXSUの実行

WebサーバーへのXSUのインストール

図11-5に示すように、WebサーバーがJavaサーブレットをサポートする場合は、XSUをWebサーバー内で実行できます。この場合、XSUを使用するJavaサーブレットを作成できます。XSQLサーブレットは、Oracleが提供する標準のサーブレットです。これはXSUの最上位に構築され、XSUの機能へのテンプレート形式のインタフェースを提供します。WebサーバーでXML処理を実行し、サーブレットの複雑なプログラミングを避けるために、XSQLサーブレットを使用できます。

図11-5 Webサーバー内でのXSUの実行

関連項目:

- XMLTypeが含まれているXSUの使用例については、『Oracle XML DB開発者ガイド』の特にXMLの生成に関する章を参照してください。

- OracleXMLQueryおよびOracleXMLSaveクラスの詳細は、Oracle Database XML Java APIリファレンスを参照してください

- DBMS_XMLQueryおよびDBMS_XMLSaveパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

- XSQLサーブレットの詳細は、第14章「XSQLページ・パブリッシング・フレームワークの使用」を参照してください。

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

XSUのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/xsuにあります。表11-1に、XSUのテストに使用できるXMLファイルとプログラムを示します。

表11-1 XSUのサンプル・ファイル

ファイル

説明

bindSQLVariables.sql

EMPLOYEE_IDおよびFIRST_NAMEの値をemployees表の列にバインドするPL/SQLスクリプト。「XSUでの値のバインド」を参照してください。

changeElementName.sql

employees表の最初の20行をXML文書として取得するPL/SQLプログラム。「DBMS_XMLQueryを使用した要素名の指定」を参照してください。

createObjRelSchema.sql

オブジェクト・リレーショナル・スキーマを設定し、データを移入するSQLスクリプト。「オブジェクト・リレーショナル・スキーマでのXMLのマッピング」を参照してください。

createObjRelSchema2.sql

オブジェクト・リレーショナル・スキーマを設定し、データを移入するSQLスクリプト。「データベース・スキーマまたはSQL問合せの変更」を参照してください。

createRelSchema.sql

リレーショナル表を作成し、最上位にカスタマ・オブジェクトを持つカスタマ・ビューを作成するSQLスクリプト。「データベース・スキーマまたはSQL問合せの変更」を参照してください。

customer.xml

カスタマについて記述されたXML文書。「データベース・スキーマまたはSQL問合せの変更」を参照してください。

deleteEmployeeByKey.sql

主キーで従業員を削除するPL/SQLプログラム。「DBMS_XMLSaveを使用したキーによる削除: 例」を参照してください。

deleteEmployeeByRow.sql

行で従業員を削除するPL/SQLプログラム。「DBMS_XMLSaveを使用した行による削除: 例」を参照してください。

domTest.java

DOMツリーを生成し、ドキュメント内の順序でツリーを検索して、ノードを1つずつ出力するプログラム。「OracleXMLQueryを使用したDOMツリーの生成」を参照してください。

index.txt

デモ・ディレクトリのプログラムについて説明するREADME。

insProc.sql

XML文書を表に挿入するPL/SQLプログラム。「DBMS_XMLSaveを使用したすべての列への値の挿入」を参照してください。

insertClob.sql

xmldocumentという表を作成し、XML文書をCLOBとして表に格納するSQLスクリプト。「DBMS_XMLSaveを使用したすべての列への値の挿入」を参照してください。

insertClob2.sql

XML文書をxmldocument表に挿入するSQLスクリプト。「DBMS_XMLSaveを使用した列のサブセットへの挿入」を参照してください。

insertClob3.sql

XML文書をxmldocument表に挿入するSQLスクリプト。「DBMS_XMLSaveを使用したキー列による更新」を参照してください。

insertClob4.sql

XML文書をxmldocument表に挿入するSQLスクリプト。「DBMS_XMLSaveを使用した列のリストの指定: 例」を参照してください。

insertEmployee.sql

insProcストアド・プロシージャをコールし、employees表に従業員を挿入するPL/SQLスクリプト。「DBMS_XMLSaveを使用したXMLの挿入」を参照してください。

insertEmployee2.sql

hr.employees表に従業員のXMLデータを挿入するtestInsertプロシージャを起動するPL/SQLスクリプト。「DBMS_XMLSaveを使用した列のサブセットへの挿入」を参照してください。

mapColumnToAtt.sql

employees表に問合せを行って、employee_idをXML属性としてレンダリングするSQLスクリプト。「データベース・スキーマまたはSQL問合せの変更」を参照してください。

new_emp.xml

新しい従業員を記述したXML文書。「testInsertプログラムの実行」を参照してください。

new_emp2.xml

新しい従業員を記述したXML文書。「testInsertSubsetプログラムの実行」を参照してください。

noRowsTest.java

行がなくなると、例外を発生させるプログラム。「該当する行がない場合の例外の生成」を参照してください。

pageTest.java

JDBCのResultSetを使用して、一度に1ページずつXMLを生成するプログラム。「スクロール可能な結果セットの生成」を参照してください。

paginateResults.java

結果ページを区切るXMLページを生成するプログラム。「OracleXMLQueryを使用した結果ページの区切り: 例」を参照してください。

paginateResults.sql

結果ページを区切り形式にするPL/SQLスクリプト。最初の10行のバッチでskipRowsを3に設定し、残りのバッチで0に設定すると、employees表の最初の3行をスキップし、残りの行を一度に10行ずつ出力します。「DBMS_XMLQueryを使用した結果ページの区切り」を参照してください。

printClobOut.sql

CLOBを出力バッファへ出力するPL/SQLスクリプト。「DBMS_XMLQueryを使用した単純な問合せからのXMLの生成」を参照してください。

raiseException.sql

DBMS_XMLQuery.getExceptionContentプロシージャを起動するPL/SQLスクリプト。「XSUのPL/SQL APIの例外処理」を参照してください。

refCurTest.java

testRefCurファンクションで定義されたSQL問合せの結果からXMLを生成するプログラム。「カーソル・オブジェクトからのXMLの生成」を参照してください。

samp1.java

scott.emp表に問合せを行って、問合せ結果からXML文書を生成するプログラム。

samp10.java

samdoc.xmlをxmltest_tab1表に挿入するプログラム。

samp2.java

scott.emp表に問合せを行って、問合せ結果からXML文書を生成するプログラム。このプログラムは、生成されたXML文書をカスタマイズする方法を示します。

sampdoc.xml

samp10.javaによってデータベースに挿入されるサンプルXMLデータ文書。

samps.sql

samp10.javaで使用するxmltest_tab1表を作成するSQLスクリプト。

simpleQuery.sql

hr.employees表から20行を選択し、XML文書をCLOBとして取得するPL/SQLスクリプト。「DBMS_XMLQueryを使用した単純な問合せからのXMLの生成」を参照してください。

testDML.sql

同じコンテキストおよび設定を使用して、ユーザーの入力に基づいてDMLを実行するPL/SQLスクリプト。「DBMS_XMLSaveを使用したコンテキスト・ハンドルの再利用」を参照してください。

testDeleteKey.java

行の識別のために使用される要素の数を制限し、DELETE文のキャッシュおよびトランザクションのバッチによってパフォーマンスを向上させるプログラム。「OracelXMLSaveを使用したキーによる削除」を参照してください。

testDeleteKey.sql

入力XML文書のすべての<ROW>要素に対して、employees表から行を削除するPL/SQLスクリプト。「DBMS_XMLSaveを使用したキーによる削除: 例」を参照してください。

testDeleteRow.java

XML文書のファイル名を入力として受け入れ、文書内の要素に対応する行を削除するプログラム。「OracelXMLSaveを使用した行による削除」を参照してください。

testDeleteRow.sql

入力XML文書のすべての<ROW>要素に対して、employees表から行を削除するSQLスクリプト。「DBMS_XMLSaveを使用した行による削除: 例」を参照してください。

testException.java

ランタイム例外を発生させ、Exception.getParentException()を起動して親である例外を取得するサンプル・プログラム。「親である例外の取得」を参照してください。

testInsert.java

hr.employees表のすべての列にXML値を挿入するJavaプログラム。「OracleXMLSaveを使用したすべての列へのXMLの挿入」を参照してください。

testInsert.sql

XMLデータを列のサブセットに挿入するPL/SQLスクリプト。「DBMS_XMLSaveを使用した列のサブセットへの挿入」を参照してください。

testInsertSubset.java

XMLデータを列のサブセットに挿入するプログラム。「OracleXMLSaveを使用した列のサブセットへのXMLの挿入」を参照してください。

testRef.sql

REFカーソルを定義し、そのカーソルを戻すファンクションを作成するPL/SQLスクリプト。testRefCurファンクションをコールするたびに、SELECT問合せに対してカーソル・オブジェクトをオープンし、そのカーソル・インスタンスを戻します。「カーソル・オブジェクトからのXMLの生成」を参照してください。

testUpdate.java

OracleXMLSave.setKeyColumnList()メソッドを起動して、hr.employees表を更新するサンプル・プログラム。「OracelXMLSaveを使用した行の更新」を参照してください。

testUpdateKey.sql

employees表のemployee_id列を主キーとして使用するtestUpdateKeyと呼ばれるPL/SQLプロシージャを作成するPL/SQL。「DBMS_XMLSaveを使用したキー列による更新」を参照してください。

testUpdateList.java

各従業員の給与および役職名のみを更新し、他の情報を無視するとします。XML文書内のすべてのROW要素について、更新対象の要素がすべて同じである場合は、OracleXMLSave.setUpdateColumnNames()メソッドを使用して列を指定できます。「OracelXMLSaveを使用した列リストの更新」を参照してください。

testUpdateSubset.sql

プロシージャtestUpdateSubsetを作成するSQLスクリプト。このプロシージャは、employee_id列をキーとして指定し、salaryおよびjob_idを更新するように指定します。「DBMS_XMLSaveを使用した列のリストの指定: 例」を参照してください。

testXMLSQL.java

XSUを使用して、XMLをStringオブジェクトとして生成するサンプル・プログラム。このプログラムはhr.employees表に問合せを行って結果セットを標準出力に出力します。「OracleXMLQueryを使用した文字列の生成」を参照してください。

upd_emp.xml

一連の従業員の更新された給与およびその他の情報を含むXML文書。「testUpdateプログラムの実行」を参照してください。

upd_emp2.xml

一連の従業員の更新された給与およびその他の情報を含むXML文書。「testUpdateプログラムの実行」を参照してください。

updateEmployee.sql

2人の従業員の新規データを含むXML文書。「testUpdateListプログラムの実行」を参照してください。

updateEmployee2.sql

testUpdateSubsetプロシージャにXML文書を渡し、2つのUPDATE文を生成するPL/SQLスクリプト。「DBMS_XMLSaveを使用した列のリストの指定: 例」を参照してください。

デモの実行手順は次のとおりです。

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

2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。特に、XSUに対してはxsu12.jar、JDBC対してはojdbc5.jar(Java 1.5)がJavaクラスパスに含まれていることを確認してください。UTF-8、ISO8859-1またはJA16SJIS以外のマルチバイト・キャラクタ・セットを使用する場合は、クラスパスにorai18n.jarを置いて、JDBCが入力ファイルのキャラクタ・セットをデータベースのキャラクタ・セットに変換できるようにします。

3. 次の例のように、Javaプログラムをコンパイルします。

javac samp1.java samp2.java samp10.java

4. hr/hrとしてOracleデータベースに接続し、SQLスクリプトcreateRelSchemaを実行します。

CONNECT hr
@$ORACLE_HOME/xdk/demo/java/xsu/createRelSchema

次の項では、XSUのデモについて詳しく説明します。

XSUコマンドライン・ユーティリティの使用

XDKには、XSUのためのコマンドラインJavaインタフェースがあります。XSUのコマンドライン・オプションは、JavaクラスOracleXMLを介して利用できます。このAPIを使用するには、「Java XDK環境の設定」の説明に従ってJavaクラスパスが設定されていることを確認します。

XSUの使用情報を標準出力に出力するには、次のコマンドを実行します。

java OracleXML

XSUを使用するには、次のようにgetXMLまたはputXMLのいずれかのパラメータを使用します。

java OracleXML getXML options
java OracleXML putXML options

表11-2に、getXMLオプションを示します。

表11-2 getXMLオプション

getXMLオプション

説明

-user "username/password"

データベースに接続するためのユーザー名およびパスワードを指定します。このオプションを指定しないと、デフォルトでscott/tigerが指定されます。接続文字列も指定されている点に注意してください。ユーザー名およびパスワードを接続文字列の一部として指定できます。

-conn "JDBC_connect_string"

JDBCデータベースの接続文字列を指定します。デフォルトの接続文字列は"jdbc:oracle:oci:@"です。

-withDTD

XML文書とともにDTDも生成するようにXSUに指示します。

-withSchema

XML文書とともにスキーマも生成するようにXSUに指示します。

-rowsetTag tag_name

ROWSETタグを指定し、問合せによって戻されたレコードに対応するすべてのXML要素を囲みます。デフォルトのROWSETタグは、<ROWSET>です。ROWSETに空の文字列("")を指定すると、XSUはROWSET要素を省略します。

-rowTag tag_name

ROWタグを指定し、データベース行に対応するデータを囲みます。デフォルトのROWタグは<ROW>です。ROWタグに空の文字列("")を指定すると、XSUはROWタグを省略します。

-rowIdAttr row_id_attribute_name

ROW要素の属性に名前を付け、rowsの数を追跡します。デフォルトでは、この属性はnumです。rowID属性に空の文字列を指定すると、XSUは属性を省略します。

-rowIdColumn row_Id_column_name

問合せからのスカラー列の1つの値が、rowID属性の値として使用されるように指定します。

-collectionIdAttr collect_id_attr_name

XMLリスト要素の属性に名前を付け、リストの要素の数を追跡します。生成されるXMLリストは、カーソル問合せまたはコレクションのいずれかに対応します。rowID属性に空の文字列を指定すると、XSUは属性を省略します。

-useTypeForCollElemTag

column-elementタグに使用する型名を指定します。デフォルトでは、XSUはcolumn-name_itemを使用します。

-useNullAttrId

属性NULL (TRUE/FALSE)を指定して、要素がnullであるかどうかを示します。

-styleSheet stylesheet_URI

XML処理命令にスタイルシートを指定します。

-stylesheetType stylesheet_type

XML処理命令にスタイルシートの型を指定します。

-setXSLT URI

XML文書に適用するXSLTスタイルシートを指定します。

-setXSLTRef URI

XSLT外部実体参照を設定します。

-useLowerCase | -useUpperCase

小文字または大文字のタグ名を生成します。デフォルトでは、大/小文字は、タグ名の生成元のSQLオブジェクト名に一致します。

-withEscaping

SQLオブジェクト名では有効であっても、XMLタグでは無効な文字の対処方法を指定します。このような文字を検出した場合は、エスケープして例外を発生させません。

-errorTag error tag_name

XMLにフォーマットされたエラー・メッセージを囲むタグを指定します。

-raiseException

XSUがJava例外を発生させることを指定します。デフォルトでは、XSUがエラーを捕捉し、XMLエラーを発行します。

-raiseNoRowsException

行が戻されなかった場合に例外を発生させます。

-useStrictLegalXMLCharCheck

入力データに対して厳密なチェックを行います。

-maxRows maximum_rows

XMLに変換するために取得される行の最大数を指定します。

-skipRowsnumber_of_rows_to_skip

スキップされる行の数を指定します。

-encoding encoding_name

生成されるXMLのキャラクタ・セットのエンコーディングを指定します。

-dateFormat date_format

XML文書内の日付値用の書式を指定します。

-fileName SQL_query_fileName | SQL_query

問合せを含むファイル名または問合せ自体を指定します。

表11-3に、putXMLオプションを示します。

表11-3 putXMLオプション

putXMLオプション

説明

-user "username/password"

データベースに接続するためのユーザー名およびパスワードを指定します。これを指定しないと、デフォルトでscott/tigerが指定されます。接続文字列も指定されます。ユーザー名およびパスワードを接続文字列の一部として指定できます。

-conn "JDBC_connect_string"

JDBCデータベースの接続文字列を指定します。デフォルトの接続文字列は"jdbc:oracle:oci:@"です。

-batchSize batching_size

バッチ・サイズを指定します。これによって、バッチされ、一度にデータベースに挿入される行の数を制御し、パフォーマンスを改善できます。

-commitBatch commit_size

コミットが実行される挿入レコードの数を指定します。自動コミットをTRUE(デフォルト)にしている場合は、commitBatchを設定しても処理は行われません。

-rowTag tag_name

ROWタグを指定し、データベース行に対応するデータを囲みます。デフォルトのROWタグは<ROW>です。ROWタグに空の文字列を指定すると、XSUはROWタグを省略します。

-dateFormat date_format

XML文書内の日付値用の書式を指定します。

-withEscaping

文書の生成時にSQLからXMLへの名前のエスケープを使用すると、逆マッピングが有効になります。

-ignoreCase

列名とタグ名を大/小文字を区別せずに一致させます。たとえば、ignoreCaseがオンになっている場合、EmpNoとEMPNOは一致します。

-preserveWhitespace

挿入されるXML文書内の空白を保持します。

-setXSLT URI

挿入前にXML文書に適用するXSLTを指定します。

-setXSLTRef URI

XSLT外部実体参照を設定します。

-fileName file_name | -URL URL | -xmlDoc xml_document

挿入するXML文書を指定します。ローカル・ファイル、URLまたはXML文書をコマンドライン上の文字列として指定します。

table_name

値を挿入する表の名前を指定します。

XSUコマンドライン・ユーティリティを使用したXMLの生成

データベース・スキーマからXMLを生成するには、getXMLパラメータを使用します。たとえば、hrスキーマにあるemployees表に問合せを行ってXML文書を生成するには、次の構文を使用できます。

java OracleXML getXML -user "hr/password" "SELECT * FROM employees"

前述のコマンドによって次のタスクが実行されます。

1. 現在のデフォルト・データベースへの接続

2. 指定されたSELECT問合せの実行

3. SQL結果のXMLへの変換

4. 標準出力へのXMLの出力

getXMLパラメータは、表11-2に示した広範囲なオプションをサポートします。

XSUコマンドライン・ユーティリティを使用したXMLTypeデータの生成

XSUを使用して、XMLType列を持つ表からXMLを生成できます。デモ・スクリプトsetup_xmltype.sqlを実行してparts表を作成し、表にデータを挿入するとします。XSUを使用して、この表から次のようにXMLを生成できます。

java OracleXML getXML -user "hr/password" -rowTag "Part" "SELECT * FROM parts"

次にコマンドの出力を示します。

<?xml version = '1.0'?>
<ROWSET>
<Part num="1">
<PARTNO>1735</PARTNO>
<PARTNAME>Gizmo</PARTNAME>
<PARTDESC>
<Description>
<Title>Description of the Gizmo</Title>
<Author>John Smith</Author>
<Body>
The <b>Gizmo</b> is <i>grand</i>.
</Body>
</Description>
</PARTDESC>
</Part>
</ROWSET>

XSUコマンドライン・ユーティリティを使用したDMLの実行

new_employees.xmlというXML文書をhr.employees表に挿入するには、次の構文を使用します。

java OracleXML putXML -user "hr/password" -fileName "new_employees.xml" employees

前述のコマンドによって次のタスクが実行されます。

1. hrとして現在のデータベースに接続

2. new_emp.xmlというXML文書の読取り

3. タグと列名を一致させてXML文書を解析

4. employees表への値の適切な挿入

getXMLパラメータは、表11-2に示した広範囲なオプションをサポートします。

XSU Java APIを使用したプログラミング

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

- OracleXMLQueryを使用した文字列の生成

- OracleXMLQueryを使用したDOMツリーの生成

- OracleXMLQueryを使用した結果ページの区切り

- スクロール可能な結果セットの生成

- カーソル・オブジェクトからのXMLの生成

- OracleXMLSaveを使用した行の挿入

- OracleXMLSaveを使用した行の更新

- OracleXMLSaveを使用した行の削除

- XSUのJava例外の処理

OracleXMLQueryを使用した文字列の生成

testXMLSQL.javaデモ・プログラムは、XSUを使用してXMLをStringオブジェクトとして生成します。このプログラムはhr.employees表に問合せを行って結果セットを標準出力に出力します。

testXMLSQL.javaプログラムは次の手順を実行します。

1. JDBCドライバを登録し、データベース接続を作成します。次のコード部分は、OCI JDBCドライバを使用し、ユーザー名hrで接続します。

import oracle.jdbc.*;...Connection conn  = getConnection("hr","password");
...
private static Connection getConnection(String username, String password)
throws SQLException
{
// register the JDBC driver
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
// create the connection using the OCI driver
Connection conn =
DriverManager.getConnection("jdbc:oracle:oci:@",username,password);
return conn;
}

2. XML問合せオブジェクトを作成し、SQL問合せを使用して初期化します。次のコード部分は、hr.employeesに対するSELECT文を使用してオブジェクトを初期化します。

OracleXMLQuery qry = new OracleXMLQuery(conn, "SELECT * FROM employees");

3. 問合せの結果セットをStringオブジェクトとして取得します。getXMLString()メソッドは、コンストラクタで指定されたオブジェクト・リレーショナル・データをXMLに変換します。次の例に、この方法を示します。

String str = qry.getXMLString();

4. 次のコードに示すように、問合せオブジェクトをクローズしてすべてのリソースを解放します。

qry.close();

testXMLSQLプログラムの実行

次の手順に従って、testXMLSQL.javaプログラムを実行します。

1. javacを使用してtestXMLSQL.javaをコンパイルします。

2. コマンドラインでjava testXMLSQLを実行します。

Java実行可能ファイルがクラスを検索できるように、CLASSPATHがこのディレクトリを指すようにする必要があります。このプログラムのコンパイルおよび実行には、OracleのJDeveloperなどのビジュアルなJavaツールも使用できます。このプログラムを実行すると、画面にXMLファイルが出力されます。次に、いくつかの行が編集されているサンプル出力を示します。

<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<EMPLOYEE_ID>100</EMPLOYEE_ID>
<FIRST_NAME>Steven</FIRST_NAME>
<LAST_NAME>King</LAST_NAME>
<EMAIL>SKING</EMAIL>
<PHONE_NUMBER>515.123.4567</PHONE_NUMBER>
<HIRE_DATE>6/17/1987 0:0:0</HIRE_DATE>
<JOB_ID>AD_PRES</JOB_ID>
<SALARY>24000</SALARY>
<DEPARTMENT_ID>90</DEPARTMENT_ID>
</ROW>
<!-- ROW num="2" through num="107" ... -->
</ROWSET>

OracleXMLQueryを使用したDOMツリーの生成

XSUが生成したXMLからDOMツリーを生成するには、XSUにDOM文書を直接リクエストします。この方法は、XML文書の文字列表現を作成するオーバーヘッドを伴わずに、XML文書を解析してDOMツリーを生成します。

XSUは、Oracle XMLパーサーをコールしてデータ値からDOMツリーを構築します。domTest.javaデモ・プログラムは、DOMツリーを生成し、ドキュメント内の順序でツリーを検索して、ノードを1つずつ出力します。

domTest.javaプログラムの最初の2つの手順は、「OracleXMLQueryを使用した文字列の生成」のtestXMLSQL.javaプログラムの場合と同じです。プログラムは次のように続行します。

1. getXMLDOM()メソッドを起動してDOMを取得します。次の例に、この方法を示します。

XMLDocument domDoc = (XMLDocument)qry.getXMLDOM();

2. DOMツリーを出力します。標準出力に出力するためのコードは次のとおりです。

domDoc.print(System.out);

次のようにStringWriterを作成し、PrintWriterにラップすることもできます。

StringWriter s = new StringWriter(10000);
domDoc.print(new PrintWriter(s));
System.out.println(" The string version ---> \n"+s.toString());

プログラムをコンパイルした後、次のようにコマンドラインから実行します。

java domTest

OracleXMLQueryを使用した結果ページの区切り

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

- 結果セット内の行数の制限

- ユーザーのセッション期間にわたるオブジェクトのオープン状態の保持

- OracleXMLQueryを使用した結果ページの区切り: 例

結果セット内の行数の制限

testXMLSQL.javaおよびdomTest.javaで、XSUは問合せによって戻されたすべての行からXMLを生成しました。一度に100行のみ必要であるとき、1000行を含む表に問合せを行う場合を考えます。これには、1つの問合せを実行して最初の100行を取得し、別の問合せによって次の100行を取得し、100行ずつ取得していく方法があります。この方法では、問合せの最初の5行をスキップして結果を生成することはできません。この問題を回避するには、次のJavaメソッドを使用します。

- OracleXMLSave.setSkipRows()を使用すると、必要な行数を強制的にスキップして結果を生成できます。このメソッドと同等の効果を持つコマンドラインは、-skipRowsパラメータです。

- OracleXMLSave.setMaxRows()を使用すると、XMLに変換される行数を制限できます。このメソッドと同等の効果を持つコマンドラインは、-maxRowsパラメータです。

例11-1では、skipRowsの値を5に設定し、maxRowsの値を1に設定します。これによって、hr.employees表に問合せを行うと、XSUは最初の5行をスキップしてから次の行のXMLを生成します。

例11-1 コマンドラインでのskipRowsおよびmaxRowsの指定

java OracleXML getXML -user "hr/password" -skipRows 5 -maxRows 1 \
"SELECT * FROM employees"

次にサンプル出力を示します(問合せ結果セットの6行目のみが戻されます)。

<?xml version = '1.0'?>
<ROWSET>
<ROW num="6">
<EMPLOYEE_ID>105</EMPLOYEE_ID>
<FIRST_NAME>David</FIRST_NAME>
<LAST_NAME>Austin</LAST_NAME>
<EMAIL>DAUSTIN</EMAIL>
<PHONE_NUMBER>590.423.4569</PHONE_NUMBER>
<HIRE_DATE>6/25/1997 0:0:0</HIRE_DATE>
<JOB_ID>IT_PROG</JOB_ID>
<SALARY>4800</SALARY>
<MANAGER_ID>103</MANAGER_ID>
<DEPARTMENT_ID>60</DEPARTMENT_ID>
</ROW>
</ROWSET>

ユーザーのセッション期間にわたるオブジェクトのオープン状態の保持

状況によっては、問合せオブジェクトをユーザーのセッション中オープンにしておくことが必要な場合があります。maxRows()メソッドおよびkeepObjectOpen()メソッドを使用すると、このような状況に対処できます。

検索の結果をページ区切りの形式にするWeb検索エンジンについて考えてみます。これらのエンジンでは、最初のページに10個の結果、次のページに次の10個のように結果が表示されます。XSUでこのタスクを実行するには、一度に10行ずつリクエストし、ResultSetをオープン状態にしておきます。こうするとXSUは、次に追加の結果をリクエストされたときに、前回の生成が終了した箇所から生成を開始します。OracleXMLQueryでは、SQL問合せ文字列から結果セットを作成すると、それ以上の結果が必要でないと想定して、通常ではResultSetを内部的にクローズします。したがって、keepObjectOpen()を起動してカーソルをアクティブにしておく必要があります。

行数または行内の列数が多すぎる場合もオープンな問合せオブジェクトが必要になります。この場合は、1つの大きな文書を生成するのではなく、複数の小さな文書を生成できます。

関連項目:
「OracleXMLQueryを使用した結果ページの区切り: 例」

OracleXMLQueryを使用した結果ページの区切り: 例

paginateResults.javaプログラムは、結果ページを区切り形式にするXMLページの生成方法を示します。出力されるXMLでは、hr表が20行のみ表示されます。

paginateResults.javaプログラムの最初の手順では、testXMLSQL.javaの場合と同様に、接続を作成します。このプログラムの処理の続きは次のとおりです。

1. SQL文オブジェクトを作成し、SQL問合せを使用して初期化します。次のコード部分は、java.sql.ResultSetの2つのオプションを設定します。

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);

2. 問合せを文字列として作成し、Statement.executeQuery()を起動して問合せを実行します。ResultSet型のオブジェクトが戻されます。次の例に、この方法を示します。

String sCmd = "SELECT first_name, last_name FROM hr.employees";
ResultSet rs = stmt.executeQuery(sCmd);

3. 次のコードに示すような問合せオブジェクトを作成します。

OracleXMLQuery xmlQry = new OracleXMLQuery(conn, rs);

4. 問合せオブジェクトを構成します。次のコードは、セッションの期間中は問合せオブジェクトをオープンにしておくことを指定します。また、戻される行数を20行に制限しています。

xmlQry.keepObjectOpen(true);
xmlQry.setRowsetTag("ROWSET");
xmlQry.setRowTag("ROW");
xmlQry.setMaxRows(20);

5. 結果をStringとして取得し、出力します。

String sXML = xmlQry.getXMLString();
System.out.println(sXML);

プログラムをコンパイルした後、次のようにコマンドラインから実行します。

java paginateResults

スクロール可能な結果セットの生成

問合せを実行して、結果セットの中から、前のページの結果を取得することが必要になる場合があります。スクロールを使用可能にするには、Oracle.jdbc.ResultSetクラスをインスタンス化します。このスクロール可能なResultSetオブジェクトを使用して結果セット内を移動し、移動するたびにXSUを使用してXMLを生成できます。

pageTest.javaプログラムは、JDBCのResultSetを使用して一度に1ページずつXMLを生成する方法を示します。ResultSetは、バッチ・サイズの設定や値のバインドなど、XSUで直接処理されない操作のときに使用する必要があります。

pageTest.javaプログラムは、pageTestオブジェクトを作成し、SQL問合せを使用して初期化します。pageTestオブジェクトのコンストラクタは、次の手順を実行します。

1. paginateResults.javaに定義された同じgetConnection()メソッドをコールして、JDBC接続を作成します。

Connection conn;
...
conn  = getConnection("hr","password");

2. 次のように文を作成します。

Statement stmt;
...
stmt = conn.createStatement();

3. コンストラクタに渡される問合せを実行して、スクロール可能な結果セットを取得します。この方法を示すコードは次のとおりです。

ResultSet rset = stmt.executeQuery(sqlQuery);

4. 接続への参照および結果セット・オブジェクトをコンストラクタに渡して、問合せオブジェクトを作成します。次のコード部分は、この方法を示します。

OracleXMLQuery qry;
...
qry = new OracleXMLQuery(conn,rset);

5. 問合せオブジェクトを構成します。次のコードコード部分は、問合せオブジェクトをオープン状態で保持し、行がなくなったときに問合せオブジェクトに例外を発生させます。

qry.keepObjectOpen(true);
qry.setRaiseNoRowsException(true);
qry.setRaiseException(true);

6. 文字列"SELECT * FROM employees"を渡して問合せオブジェクトを作成した後、プログラムは結果セット内をループします。getResult()メソッドは、セットの開始行と終了行を指定する整数値を受け取ります。これは、受け取った値の差を計算して取得する最大行数を設定し、結果を文字列として取得します。次のwhileループは、一度に10行ずつ取得し、出力します。

int i = 0;
while ((str = test.getResult(i,i+10))!= null)
{
System.out.println(str);
i+= 10;
}

プログラムをコンパイルした後、次のようにコマンドラインから実行します。

java pageTest

カーソル・オブジェクトからのXMLの生成

OracleXMLQueryクラスは、問合せ文字列またはResultSetオブジェクトに対してのみXML変換を行います。プログラムがPL/SQLプロシージャを使用し、このプロシージャがREFカーソルを戻す場合の変換方法を考えてみます。この場合は、「スクロール可能な結果セットの生成」で説明したResultSet変換メカニズムを使用できます。

REFカーソルは、PL/SQL内のカーソル・オブジェクトへの参照です。これらのカーソル・オブジェクトは、一連の値を取得するためにプログラムで繰り返し処理されるSQL文です。これらのカーソル・オブジェクトは、JavaではOracleResultSetオブジェクトに変換されます。Javaプログラムで、CallableStatementオブジェクトを初期化し、カーソル変数を戻すPL/SQLファンクションを実行し、OracleResultSetオブジェクトを取得したら、それをOracleXMLQueryオブジェクトに送信して必要なXMLを取得できます。

testRef.sqlスクリプトで定義されたtestRef PL/SQLパッケージについて考えてみます。これは、REFカーソルを定義するファンクションを作成して戻します。testRefCur PL/SQLファンクションは、コールされるたびにSELECT問合せに対してカーソル・オブジェクトをオープンし、そのカーソル・インスタンスを戻します。オブジェクトをXMLに変換するには、次のようにします。

1. testRef.sqlスクリプトを実行してhrスキーマ内にtestRefパッケージを作成します。

2. refCurTest.javaプログラムをコンパイルおよび実行し、testRefCurファンクションに定義されたSQL問合せの結果からXMLを生成します。

スタイルシートを適用するには、applyStylesheetコマンドを使用して、出力を生成する前にスタイルシートを強制的に適用します。

OracleXMLSaveを使用した行の挿入

表またはビューに文書を挿入するには、表名またはビュー名と文書を指定します。XSUは文書(文字列が指定されている場合)を解析し、INSERT文を作成してこの文にすべての値をバインドします。デフォルトでは、XSUは値を表またはビューのすべての列に挿入します。存在しない要素は、NULL値として処理されます。次の例では、hr.employees表から生成したXML文書を表に格納する方法を示します。

OracleXMLSaveを使用したすべての列へのXMLの挿入

testInsert.javaデモ・プログラムは、hr.employees表のすべての列にXML値を挿入します。

プログラムは次の手順を実行します。

1. JDBC/OCI接続を作成します。このプログラムは、この章にある前述の例で使用しているのと同じgetConnection()メソッドをコールします。

Connection conn = getConnection("hr","password");

2. XML保存オブジェクトを作成します。Connectionの参照およびDML実行対象の表の名前を渡して、オブジェクトを初期化します。次の例に、この方法を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. 入力XML文書内のデータをhr.employees表に挿入します。次のコード部分は、コマンドラインで指定された文書ファイル名からURLを作成します。

sav.insertXML(sav.getURL(argv[0]));

4. 次のようにXML保存オブジェクトをクローズします。

sav.close();

testInsertプログラムの実行

従業員IDが7369の新しい従業員Janet Smithについてnew_emp.xml文書を作成する場合を考えます。次のように、ファイル名new_emp.xmlを引数としてtestInsertプログラムに渡します。

java testInsert "new_emp.xml"

指定した列の値を含む新しい行がemployees表に挿入されます。行要素内に存在しない要素は、NULLとして扱われます。

プログラムを実行すると、次の形式のINSERT文が生成されます。

INSERT INTO hr.employees
(employee_id, first_name, last_name, email, phone_number, hire_date,
salary, commission_pct, manager_id, department_id)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

XSUによって、列名と一致している入力XML文書内の要素タグが照合され、その値がバインドされます。

OracleXMLSaveを使用した列のサブセットへのXMLの挿入

値を挿入する必要がない列がある場合もあります。たとえば、取得する値が完全なセットではなく、残りの列のためにトリガーまたはデフォルト値を使用する必要がある場合などです。testInsertSubset.javaデモ・プログラムは、その処理の方法を示します。

プログラムは次の手順を実行します。

1. JDBC/OCI接続を作成します。このプログラムは、この章にある前述の例で使用しているのと同じgetConnection()メソッドをコールします。

Connection conn = getConnection("hr","password");

2. XML保存オブジェクトを作成します。Connectionの参照およびDMLを実行する表名を渡して、オブジェクトを初期化します。次の例に、この方法を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. 文字列の配列を作成します。配列の各要素は、値が挿入される列の名前を指定します。次のコード部分は、列の名前を5つ指定します。

String [] colNames = new String[5];
colNames[0] = "EMPLOYEE_ID";
colNames[1] = "LAST_NAME";
colNames[2] = "EMAIL";
colNames[3] = "JOB_ID";
colNames[4] = "HIRE_DATE";

4. 指定した列を更新するためのXML保存オブジェクトを構成します。次の文は、OracleXMLSave.setUpdateColumnList()メソッドに、配列への参照を渡します。

sav.setUpdateColumnList(colNames);

5. 入力XML文書内のデータをhr.employees表に挿入します。次のコード部分は、コマンドラインで指定された文書ファイル名からURLを作成します。

sav.insertXML(sav.getURL(argv[0]));

6. 次のようにXML保存オブジェクトをクローズします。

sav.close();

testInsertSubsetプログラムの実行

new_emp2.xml文書を使用して、従業員IDが7400の新しい従業員Adamsのデータを格納する場合を考えます。次のように、new_emp2.xmlを引数としてtestInsertプログラムに渡します。

java testInsert new_emp2.xml

入力ファイルに指定されていない列の値は、無視されます。入力に含まれる各ROW要素のINSERTが実行され、INSERT文はデフォルトでバッチ処理されます。

このプログラムで生成されるINSERT文は次のとおりです。

INSERT INTO hr.employees (employee_id, last_name, email, job_id, hire_date)
VALUES (?, ?, ?, ?, ?);

OracleXMLSaveを使用した行の更新

表名またはビュー名、およびXML文書を指定して、表またはビューのフィールドを更新します。XSUは文書(文字列が指定されている場合)を解析し、1つ以上のUPDATE文を作成してこの文にすべての値をバインドします。次の例に、XML文書を使用してhr.employees表を更新する方法を示します。

OracleXMLSaveを使用したキー列による更新

testUpdate.javaデモ・プログラムは、OracleXMLSave.setKeyColumnList()メソッドを起動してhr.employees表を更新します。

testUpdate.javaプログラムは次の手順を実行します。

1. JDBC/OCI接続を作成します。このプログラムは、この章にある前述の例で使用しているのと同じgetConnection()メソッドをコールします。

Connection conn = getConnection("hr","password");

2. XML保存オブジェクトを作成します。Connectionの参照およびDML実行対象の表の名前を渡して、オブジェクトを初期化します。次の例に、この方法を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. 単一要素のString配列を作成して、更新する表の主キー列の名前を保持します。次のコード部分は、employee_id列の名前を指定します。

String [] keyColNames = new String[1];
colNames[0] = "EMPLOYEE_ID";

4. XML保存オブジェクトを配列内に指定された主キーに設定します。次の文は、OracleXMLSave.setKeyColumnList()メソッドに、keyColNames配列への参照を渡します。

sav.setKeyColumnList(keyColNames);

5. 入力XML文書内に指定された行を更新します。次の文は、コマンドラインで指定されたファイル名からURLを作成します。

sav.updateXML(sav.getURL(argv[0]));

6. 次のようにXML保存オブジェクトをクローズします。

sav.close();

testUpdateプログラムの実行

XSUを使用して、表内の指定したフィールドを更新できます。例11-2のupd_emp.xmlには、追加した2人の従業員、7369および7400の更新済の給与およびその他の情報が含まれます。

例11-2 upd_emp.xml

<?xml version='1.0'?>
<ROWSET>
<ROW num="1">
<EMPLOYEE_ID>7400</EMPLOYEE_ID>
<SALARY>3250</SALARY>
</ROW>
<ROW num="2">
<EMPLOYEE_ID>7369</EMPLOYEE_ID>
<JOB_ID>SA_REP</JOB_ID>
<MANAGER_ID>145</MANAGER_ID>
</ROW>
<!-- additional rows ... -->
</ROWSET>

更新の場合は、UPDATE文のWHERE句に、キー列の名前のリストを指定します。hr.employees表では、employee_id列がキーです。

次のように、前述のプログラムにファイル名upd_emp.xmlを引数として渡します。

java testUpdate upd_emp.xml

このプログラムは、2つのUPDATE文を生成します。最初のROW要素には、SALARYフィールドを更新するためのUPDATE文が次のように生成されます。

UPDATE hr.employees SET salary = 3250 WHERE employee_id = 7400;

2番目のROW要素には、次の文が生成されます。

UPDATE hr.employees SET job_id = 'SA_REP' AND MANAGER_ID = 145
WHERE employee_id = 7369;

OracleXMLSaveを使用した列リストの更新

XML文書内の要素のサブセットのみを使用して、表を更新する場合もあります。このような更新を実行するには、列のリストを指定できます。XSUはすべてのROW要素に対してバインド変数を持つ同じUPDATE文を使用するため、列リストを指定すると処理速度が向上します。また、XML文書内にある他のタグを無視できます。

注意:
更新する列のリストを指定すると、更新する列に対応する要素が存在しない場合は、XSUによりその要素がNULLとして処理されることに注意してください。

各従業員の給与および役職名を更新し、他のデータを無視するとします。XML文書内のすべてのROW要素について、更新対象の要素がすべて同じである場合は、OracleXMLSave.setUpdateColumnNames()メソッドを使用して列を指定できます。testUpdateList.javaプログラムは、この方法を示します。

testUpdateList.javaプログラムは次の手順を実行します。

1. JDBC/OCI接続を作成します。このプログラムは、この章にある前述の例で使用しているのと同じgetConnection()メソッドをコールします。

Connection conn = getConnection("hr","password");

2. XML保存オブジェクトを作成します。Connectionの参照およびDML実行対象の表の名前を渡して、オブジェクトを初期化します。次の例に、この方法を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. String型の配列を作成して、更新する表の主キー列の名前を保持します。配列には、更新する表の主キー列の名前を持つ1つの要素のみ指定します。次のコード部分は、employee_id列の名前を指定します。

String [] colNames = new String[1];
colNames[0] = "EMPLOYEE_ID";

4. XML保存オブジェクトを配列内に指定された主キーに設定します。次の文は、OracleXMLSave.setKeyColumnList()メソッドにcolNames配列への参照を渡します。

sav.setKeyColumnList(keyColNames);

5. String型の配列を作成して、更新する列の名前を保持します。次のコード部分は、employee_id列の名前を指定します。

String[] updateColNames = new String[2];
updateColNames[0] = "SALARY";
updateColNames[1] = "JOB_ID";

6. XMLの保存オブジェクトに更新する列のリストを設定します。このタスクを実行する文は次のとおりです。

sav.setUpdateColumnList(updateColNames);

7. 入力XML文書内に指定された行を更新します。次のコード部分は、コマンドラインで指定されたファイル名からURLを作成します。

sav.updateXML(sav.getURL(argv[0]));

8. 次のようにXML保存オブジェクトをクローズします。

sav.close();

testUpdateListプログラムの実行

サンプルXML文書upd_emp2.xmlを使用して、従業員IDが100のSteven Kingおよび従業員IDが206のWilliam Gietzの新しいデータを格納する場合を考えます。次のように、upd_emp2.xmlを引数としてtestUpdateListプログラムに渡します。

java testUpdateList upd_emp2.xml

この例では、プログラムが2つのUPDATE文を生成します。最初のROW要素には、次の文が生成されます。

UPDATE hr.employees SET salary = 8350 AND job_id = 'AC_ACCOUNT'
WHERE employee_id = 100;

2番目のROW要素には、次の文が生成されます。

UPDATE hr.employees SET salary = 25000 AND job_id = 'AD_PRES'
WHERE employee_id = 206;

OracleXMLSaveを使用した行の削除

XML文書からの削除の場合は、キー列のリストを指定できます。これらの列は、DELETE文のWHERE句で使用されます。キー列名を指定しないと、XML文書の各ROW要素に対して新しいDELETE文が作成されます。DELETE文のWHERE句にある列のリストと、ROW要素にある列は一致します。

OracleXMLSaveを使用した行による削除

testDeleteRow.javaデモ・プログラムは、XML文書のファイル名を入力として受け入れ、文書内の要素に対応する行を削除します。

testDeleteRow.javaプログラムは次の手順を実行します。

1. JDBC/OCI接続を作成します。このプログラムは、この章にある前述の例で使用しているのと同じgetConnection()メソッドをコールします。

Connection conn = getConnection("hr","password");

2. XML保存オブジェクトを作成します。Connectionの参照およびDML実行対象の表の名前を渡して、オブジェクトを初期化します。次の例に、この方法を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. 入力XML文書内で指定された行を削除します。次のコード部分は、コマンドラインで指定されたファイル名からURLを作成します。

sav.deleteXML(sav.getURL(argv[0]));

4. 次のようにXML保存オブジェクトをクローズします。

sav.close();

testDeleteプログラムの実行

「OracleXMLSaveを使用した行の挿入」で追加した従業員7400および7369を削除する必要があるとします。

この例を正しく実行するには、データベースに接続し、hr.job_history表に対する制約を無効にします。

CONNECT hr
ALTER TABLE job_history
DISABLE CONSTRAINT JHIST_EMP_FK;
EXIT

次のように、testDeleteRowプログラムにupd_emp.xmlを渡します。

java testDeleteRow upd_emp.xml

XML文書内の各ROW要素にあるタグ名に基づいて、DELETE文が構成されます。次の文が実行されます。

DELETE FROM hr.employees WHERE salary = 3250 AND employee_id = 7400;
DELETE FROM hr.employees WHERE job_id = 'SA_REP' AND MANAGER_ID = 145
AND employee_id = 7369;

OracleXMLSaveを使用したキーによる削除

DELETE文の述語としてキー値のみを使用する場合は、OracleXMLSave.setKeyColumnList()メソッドを起動します。行の識別に使用する要素の数を制限するこの方法には、DELETE文をキャッシュし、トランザクションをバッチ化することによるパフォーマンス向上という利点があります。testDeleteKey.javaプログラムは、この方法を示します。

testDeleteKey.javaプログラムは次の手順を実行します。

1. JDBC/OCI接続を作成します。このプログラムは、この章にある前述の例で使用しているのと同じgetConnection()メソッドをコールします。

Connection conn = getConnection("hr","password");

2. XML保存オブジェクトを作成します。Connectionの参照およびDML実行対象の表の名前を渡して、オブジェクトを初期化します。次の例に、この方法を示します。

OracleXMLSave sav = new OracleXMLSave(conn, "employees");

3. String型の配列を作成して、表の主キー列の名前を保持します。この配列には、1つの要素のみ指定します。次のコード部分は、employee_id列の名前を指定します。

String [] colNames = new String[1];
colNames[0] = "EMPLOYEE_ID";

4. XML保存オブジェクトを配列内に指定された主キーに設定します。次の文は、OracleXMLSave.setKeyColumnList()メソッドにcolNames配列への参照を渡します。

sav.setKeyColumnList(keyColNames);

5. 入力XML文書内で指定された行を削除します。次のコード部分は、コマンドラインで指定されたファイル名からURLを作成します。

sav.deleteXML(sav.getURL(argv[0]));

6. 次のようにXML保存オブジェクトをクローズします。

sav.close();

testDeleteKetyプログラムの実行

「OracleXMLSaveを使用したキー列による更新」で追加した従業員7400および7369を削除する必要があるとします。前述の例でこれらの従業員がすでに削除されている場合は、次のように、最初にこれらの従業員を元のemployees表に追加できます。

java testInsert new_emp.xml
java testInsert new_emp2.xml

testDeleteRowプログラムに同じupd_emp.xml文書を渡して、従業員7400および7369を削除します。

java testDeleteKey upd_emp.xml

次の形式の単一のDELETE文が生成されます。

DELETE FROM hr.employees WHERE employee_id=?;

次のDELETE文が、各従業員に対して1つ実行されます。

DELETE FROM hr.employees WHERE employee_id = 7400;
DELETE FROM hr.employees WHERE employee_id = 7369;

XSUのJava例外の処理

XSUは、処理中に発生したすべての例外を捕捉し、一般的なランタイム例外であるoracle.xml.sql.OracleXMLSQLExceptionをスローします。適切な処置を実行できる場合は、コールするプログラムはこの例外を捕捉する必要がありません。例外クラスには、エラー・メッセージおよび存在する場合は親である例外も取得するためのメソッドがあります。

親である例外の取得

testException.javaデモ・プログラムは、ランタイム例外を発生させ、Exception.getParentException()を起動して親である例外を取得します。

前述のプログラムを実行すると、次のエラー・メッセージが生成されます。

Caught SQL Exception:ORA-00904: "SD": invalid identifier

該当する行がない場合の例外の生成

XSUは、処理する行がない場合はNULL文字列を戻します。ただし、プログラムが例外ハンドラを使用して例外を処理できるように、行がなくなるたびに例外を発生させることができます。OracleXMLQuery.setRaiseNoRowsException()を起動すると、XSUは、出力用に生成する行がなくなるたびに、oracle.xml.sql.OracleXMLSQLNoRowsExceptionを発生させます。これはランタイムの例外であり、捕捉する必要はありません。

noRowsTest.javaデモ・プログラムは、pageTest.javaに定義されたpageTestクラスをインスタンス化します。終了を確認する条件が、結果がnullかどうかの確認から、例外ハンドラに変更されました。

noRowsTest.javaプログラムは、pageTestオブジェクトを作成し、SQL問合せを使用して初期化します。プログラムは次のように続行します。

1. 問合せオブジェクトを構成するか、行がなくなった場合の例外を発生させます。次のコード部分は、この方法を示します。

pageTest test = new pageTest("SELECT * from employees");
...
test.qry.setRaiseNoRowsException(true);

2. 結果セット内を無限ループして、一度に10行ずつ取得します。使用可能な行がなくなると、プログラムは例外を発生させます。次のコード部分は、一度に10行ずつ結果セットをスクロールするpageTest.nextPage()をコールします。

try
{
while(true)
System.out.println(test.nextPage());
}

3. 行がなくなったときの例外を捕捉し、"END OF OUTPUT"と出力します。この方法を示すコードは次のとおりです。

catch(oracle.xml.sql.OracleXMLSQLNoRowsException e)
{
System.out.println(" END OF OUTPUT ");
try
{
test.close();
}
catch ( Exception ae )
{
ae.printStackTrace(System.out);
}
}

プログラムをコンパイルした後、次のようにコマンドラインから実行します。

java noRowsTest

XSU PL/SQL APIを使用したプログラミング

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

- DBMS_XMLQueryを使用した単純な問合せからのXMLの生成

- DBMS_XMLQueryを使用した要素名の指定

- DBMS_XMLQueryを使用した結果ページの区切り

- XSUへのスタイルシートの設定

- XSUでの値のバインド

- DBMS_XMLSaveを使用したXMLの挿入

- DBMS_XMLSaveを使用した更新

- DBMS_XMLSaveを使用した削除

- XSUのPL/SQL APIの例外処理

- DBMS_XMLSaveを使用したコンテキスト・ハンドルの再利用

注意:
パフォーマンス向上のため、DBMS_XMLQueryおよびDBMS_XMLSaveのかわりに、DBMS_XMLGenおよびDBMS_XMLStoreの使用を検討してください。前者の2つのパッケージはCで記述され、データベース・カーネルに組み込まれています。XMLElementなどのSQL/XML関数を使用して、データベースのXMLにアクセスすることもできます。

DBMS_XMLQueryを使用した単純な問合せからのXMLの生成

この項では、DBMS_XMLQueryパッケージを使用してSQL問合せからXMLを生成する方法を示します。この例を実行するには、hrとしてデータベースに接続し、printClobOut.sqlスクリプトを実行します。このスクリプトは、CLOBを出力バッファに出力する単純なプロシージャprintClobOutを作成します。SQL*PlusでprintClobOutプロシージャを実行すると、入力CLOBが画面に出力されます。結果を表示するには、サーバーの出力をONに設定します。表示バッファを増やして全出力を表示する必要がある場合があります。

simpleQuery.sqlスクリプトを実行して、hr.employees表から20行選択し、XML文書をCLOBとして取得します。プログラムは、最初に問合せを渡してコンテキスト・ハンドルを取得し、次にgetXMLファンクションをコールしてCLOB値を取得します。文書のエンコーディングは、データベース・キャラクタ・セットのエンコーディングと同じになります。このサンプル・アプリケーションでは、printClobOut.sqlを実行してprintClobOutプロシージャが作成されていることが前提になっています。

DBMS_XMLQueryを使用した要素名の指定

XSUのPL/SQL APIを使用して、デフォルトのROWおよびROWSET要素名を変更できます。これらはデフォルトの名前であり、結果の各行の先頭と末尾、および出力XML文書全体の先頭と末尾にそれぞれ置かれます。このタスクを実行するには、PL/SQLプロシージャsetRowTagNameおよびsetRowSetTagNameを使用します。

hrとして接続し、SQL*PlusでchangeElementName.sqlスクリプトを実行して、employees表の最初の20行をXML文書として取得します。無名のPL/SQLブロックによって、ROWおよびROWSET要素名がEMPおよびEMPSETに変更されます。このブロックは、printClobOut.sqlの実行によって作成されたprintClobOutプロシージャをコールすることに注意してください。

生成されるXML文書には、<EMPSET>文書要素が含まれます。各行は、<EMP>タグによって区切られています。

DBMS_XMLQueryを使用した結果ページの区切り

次のPL/SQLファンクションをコールして、問合せの結果ページを区切ることができます。

- setMaxRowsは、XMLに変換する行の最大数を設定します。この最大値は、前回の結果が生成された、現在の行の位置に関連します。

- setSkipRowsは、行の値をXMLに変換するときにスキップする行数を指定します。

paginateResult.sqlスクリプトを実行して、結果ページを区切る無名ブロックを実行します。最初の10行のバッチでskipRowsを3に設定し、残りのバッチで0に設定すると、employees表の最初の3行をスキップし、残りの行を一度に10行ずつ出力します。複数のフェッチの場合は、フェッチする行がなくなったときを確認する必要があります。これを行うには、setRaiseNoRowsExceptionをコールします。このプロシージャは、CLOBへの行の書込みがなかった場合に例外を発生させます。この例外は、終了条件として捕捉および使用できます。

XSUへのスタイルシートの設定

XSUのPL/SQL APIは、次の方法で、生成したXML文書にスタイルシートを設定する機能を提供します。

- setStylesheetHeaderプロシージャを使用して、結果にスタイルシート・ヘッダーを設定します。このプロシージャは、XML処理命令を追加して、スタイルシートを含めます。

- 生成の前に、結果のXML文書にスタイルシートを適用します。このメソッドを使用すると、パフォーマンスが大幅に向上します。このメソッドを使用しない場合は、XML文書をCLOBとして生成し、再度パーサーに送信し、スタイルシートを適用する必要があります。XSUはDOM文書を生成し、XMLパーサーをコールし、スタイルシートを適用してから結果を生成します。結果のXML文書にスタイルシートを適用するには、setXSLTプロシージャを使用します。このプロシージャは、スタイルシートを使用して結果を生成します。

XSUでの値のバインド

XSUのPL/SQL APIは、SQL文に値をバインドする機能を提供します。SQL文には、名前付きバインド変数を指定できます。このバインド変数の前には、コロン(:)を付ける必要があります。bindSQLVariables.sqlスクリプトは、無名のPL/SQLブロックを実行し、employees表の列にEMPLOYEE_IDおよびFIRST_NAMEの値をバインドします。

DBMS_XMLSaveを使用したXMLの挿入

表またはビューにXML文書を挿入するには、表名またはビュー名、およびXML文書を指定します。XSUはXML文書(文字列が指定されている場合)を解析し、INSERT文を作成してこの文にすべての値をバインドします。デフォルトでは、XSUは値を表またはビューのすべての列に挿入します。存在しない要素はNULLとして処理されます。

DBMS_XMLSaveを使用したすべての列への値の挿入

insProc.sqlデモ・スクリプトを実行して、PL/SQLストアド・プロシージャinsProcを作成します。このストアド・プロシージャは、次のパラメータを受け入れます。

- CLOBとしてのXML文書

- 文書を挿入する表の名前

insProcプロシージャを起動して、XML文書を表に挿入できます。

insertClob.sqlスクリプトを実行して、xmldocumentという表を作成し、XML文書をCLOBとして表に格納します。XML文書には、従業員7370のLiz Gardnerが記述され、この従業員をhr.employees表に挿入します。

例11-3 insertClob.sql

CREATE TABLE hr.xmldocument
(docid   NUMBER PRIMARY KEY,
xml_text CLOB);
-- insert an XML document into the CLOB column
INSERT INTO hr.xmldocument (docid,xml_text)
VALUES (1,
'<?xml version="1.0"?>
<ROWSET>
<ROW num="1">
<EMPLOYEE_ID>7370</EMPLOYEE_ID>
<FIRST_NAME>Liz</FIRST_NAME>
<LAST_NAME>Gardner</LAST_NAME>
<EMAIL>liz.gardner@business.com</EMAIL>
<PHONE_NUMBER>650-555-6127</PHONE_NUMBER>
<HIRE_DATE>12/18/2004 0:0:0</HIRE_DATE>
<SALARY>3000</SALARY>
<COMMISSION_PCT>0</COMMISSION_PCT>
<JOB_ID>SH_CLERK</JOB_ID>
<MANAGER_ID>103</MANAGER_ID>
<DEPARTMENT_ID>20</DEPARTMENT_ID>
</ROW>
</ROWSET>');

例11-4に示されたinsertEmployee.sqlスクリプトを実行して、insProcストアド・プロシージャをコールし、Liz Gardnerをemployees表に挿入します。

例11-4 insertEmployee.sql

DECLARE
v_xml_text CLOB;
BEGIN
SELECT xml_text
INTO v_xml_text
FROM hr.xmldocument
WHERE docid = 1;
insProc(v_xml_text, 'employees');
END;
/

「OracleXMLSaveを使用した行の挿入」に示したように、callinsProcプロシージャを実行すると、例11-5で示す形式のINSERT文が生成されます。

例11-5 INSERT文の形式

INSERT INTO hr.employees
(employee_id, first_name, last_name, email, phone_number, hire_date,
salary, commission_pct, manager_id, department_id)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

XSUによって、列名と一致している入力XML文書内の要素タグが照合され、その値がバインドされます。

DBMS_XMLSaveを使用した列のサブセットへの挿入

「OracleXMLSaveを使用した列のサブセットへのXMLの挿入」で説明しているように、値を挿入する必要がない列がある場合もあります。挿入処理を行う列名のリストを作成し、それをDBMS_XMLSaveプロシージャに渡すことができます。setUpdateColumnNameプロシージャを繰り返しコールし、コールするたびに更新する列名を渡すことで、これらの値を設定できます。列名の設定は、clearUpdateColumnListを起動すると消去されます。

testInsert.sqlデモ・スクリプトを実行して、testInsertというPL/SQLストアド・プロシージャを作成します。このプロシージャを使用して、CLOB型のXMLデータをhr.employees表に挿入できます。

例11-6のinsertClob2.sqlスクリプトを実行して、新しい従業員Jordanについて記述されたXML文書をxmldocument表のCLOB列に挿入します。文書には、employees表のすべての列に対応する要素が含まれていない点に注意してください。

例11-6 insertClob2.sql

-- insert an XML document into the CLOB column  of the xmldocument table with only
-- some of the possible elements
INSERT INTO hr.xmldocument (docid, xml_text)
VALUES (2,
'<?xml version="1.0"?>
<ROWSET>
<ROW num="1">
<EMPLOYEE_ID>7401</EMPLOYEE_ID>
<LAST_NAME>Jordan</LAST_NAME>
<EMAIL>jim.jordan@business.com</EMAIL>
<JOB_ID>SH_CLERK</JOB_ID>
<HIRE_DATE>12/17/2004 0:0:0</HIRE_DATE>
</ROW>
</ROWSET>');

例11-7のinsertEmployee2.sqlスクリプトを実行すると、従業員Jim Jordanのデータがhr.employees表の列のサブセットに挿入されます。

例11-7 insertEmployee2.sql

DECLARE
v_xml_text CLOB;
BEGIN
SELECT xml_text
INTO v_xml_text
FROM hr.xmldocument
WHERE docid = 2;
testInsert(v_xml_text);
END;
/

「OracleXMLSaveを使用した列のサブセットへのXMLの挿入」の場合と同様に、testInsertをコールすると、次のINSERT文が生成されます。

INSERT INTO hr.employees (employee_id, last_name, email, job_id, hire_date)
VALUES (?, ?, ?, ?, ?);

DBMS_XMLSaveを使用した更新

「OracleXMLSaveを使用した行の更新」で説明しているように、XML文書を使用して表内の指定したフィールドを更新できます。キーとして使用する列を指定するか、更新する列のリストを渡すことができます。

DBMS_XMLSaveを使用したキー列による更新

testUpdateKey.sqlスクリプトを実行して、testUpdateKeyというPL/SQLプロシージャを作成します。このプロシージャは、hr.employees表のemployee_id列を主キーとして使用します。

例11-8のinsertClob3.sqlスクリプトを実行して、xmldocument表のCLOB列にXML文書を挿入します。この文書は、従業員7400の新しい給与、および従業員7369の新しい仕事のIDおよびマネージャIDを指定します。

例11-8 insertClob3.sql

INSERT INTO hr.xmldocument (docid, xml_text)
VALUES (3,
'<?xml version="1.0"?>
<ROWSET>
<ROW num="1">
<EMPLOYEE_ID>7400</EMPLOYEE_ID>
<SALARY>3250</SALARY>
</ROW>
<ROW num="2">
<EMPLOYEE_ID>7369</EMPLOYEE_ID>
<JOB_ID>SA_REP</JOB_ID>
<MANAGER_ID>145</MANAGER_ID>
</ROW>
</ROWSET>');

例11-9のupdateEmployee.sqlスクリプトを実行して、testUpdateKeyプロシージャにXML文書を渡し、2つのUPDATE文を生成します。

例11-9 updateEmployee.sql

DECLARE
v_xml_text CLOB;
BEGIN
SELECT xml_text
INTO v_xml_text
FROM hr.xmldocument
WHERE docid = 3;
testUpdateKey(v_xml_text);
END;
/

最初のROW要素には、次のUPDATE文が生成されます。

UPDATE hr.employees SET salary = 3250 WHERE employee_id = 7400;

2番目のROW要素には、次の文が生成されます。

UPDATE hr.employees SET job_id = 'SA_REP' AND MANAGER_ID = 145
WHERE employee_id = 7369;

DBMS_XMLSaveを使用した列のリストの指定: 例

「OracleXMLSaveを使用した列リストの更新」で説明しているように、更新する列のリストを指定できます。

testUpdateSubset.sqlスクリプトを実行すると、PL/SQLプロシージャtestUpdateSubsetが作成されます。このプロシージャはemployee_id列をキーとして使用し、hr.employees表のsalaryおよびjob_id列のみを更新します。

insertClob4.sqlスクリプトを実行して、xmldocument表にXML文書を挿入します。文書内の<ROW>要素には、従業員100および206の記述があります。各<ROW>要素には、説明テキストを含む10個のサブ要素があります。

例11-10のupdateEmployee2.sqlスクリプトを実行して、testUpdateSubsetプロシージャにXML CLOBを渡し、2つのUPDATE文を生成します。

例11-10 updateEmployee2.sql

DECLARE
v_xml_text CLOB;
BEGIN
SELECT xml_text
INTO v_xml_text
FROM hr.xmldocument
WHERE docid = 4;
testUpdateSubset(v_xml_text);
END;
/

プロシージャは、従業員100および206に関して、setUpdateColumnプロシージャで指定された列、salaryおよびemailのみを更新します。

DBMS_XMLSaveを使用した削除

「OracleXMLSaveを使用した行の削除」で説明しているように、XSUが使用するキー列のリストを指定して、削除する行を決定できます。これらの列は、DELETE文のWHERE句で指定されます。

DBMS_XMLSaveを使用した行による削除: 例

testDeleteRow.sqlスクリプトを実行して、testDeleteRow PL/SQLプロシージャを作成します。プロシージャは、入力XML文書のすべての<ROW>要素に対して、hr.employees表から行を削除します。

例11-7で追加した従業員Jim Jordanを削除する必要があるとします。例11-11のdeleteEmployeeByRow.sqlスクリプトを実行して、XML文書をCLOBとしてtestDeleteRowストアド・プロシージャに渡します。

例11-11 行による削除

DECLARE
v_xml_text CLOB;
BEGIN
SELECT xml_text
INTO v_xml_text
FROM hr.xmldocument
WHERE docid = 2;
testDeleteRow(v_xml_text);
END;
/

前述のtestDeleteRowのコールは、次のDELETE文を生成します。

DELETE FROM hr.employees
WHERE employee_id = 7401 AND last_name = 'JORDAN'
AND email = 'jim.jordan@business.com' AND job_id = 'SH_CLERK'
AND hire_date = '12/17/2004 0:0:0';

プログラムは、XML文書内の各<ROW>要素にあるタグ名に基づいてDELETE文を構成します。

DBMS_XMLSaveを使用したキーによる削除: 例

「OracleXMLSaveを使用したキーによる削除」で説明したように、削除操作の主キーとして使用する列を指定できます。DBMS_XMLSave.setKeyColumnファンクションを使用してキーを指定します。

testDeleteKey.sqlを実行して作成されたtestDeleteKeyプロシージャは、入力XML文書のすべての<ROW>要素に対してemployees表から行を削除します。

例11-4で追加した従業員Liz Gardnerを削除する必要があるとします。例11-12のdeleteEmployeeByKey.sqlスクリプトを実行して、XML文書をCLOBとしてtestDeleteKeyストアド・プロシージャに渡します。

例11-12 キーによる削除

DECLARE
v_xml_text CLOB;
BEGIN
SELECT xml_text
INTO v_xml_text
FROM hr.xmldocument
WHERE docid = 1;
testDeleteKey(v_xml_text);
END;
/

前述のプロシージャ・コールで、XSUは次のような単一のDELETE文を生成します。

DELETE FROM hr.employees WHERE employee_id=?

XSUはこの文を入力XML文書のすべてのROW要素に使用します。

XSUのPL/SQL APIの例外処理

優れたPL/SQLコードは、発生可能な例外を考慮して作成されています。raiseException.sqlの無名PL/SQLブロックは、DBMS_XMLQuery.getExceptionContentプロシージャの起動方法を実例で示します。SQL*Plusでスクリプトを実行して、次のエラー・メッセージを出力します。

Exception caught 904 ORA-00904: "Z": invalid identifier

DBMS_XMLSaveを使用したコンテキスト・ハンドルの再利用

前項で示したDMLの例では、同じコンテキスト・ハンドルを複数の操作のために使用できます。saveコンテキストを作成したときに指定した同一の表に対してすべての挿入が行われる場合は、同じコンテキストを使用して複数のINSERTを実行できます。同じコンテキストを使用してDML文を混合することもできます。

testDML.sqlスクリプトは、同じコンテキストおよび設定を使用して、ユーザーの入力に基づいてDMLを実行する方法を示します。この例では、すべてのファンクション・コールで同じコンテキストが使用されるように、PL/SQLパッケージの静的変数を使用してコンテキストを格納します。

スクリプトによって作成されたtestDMLパッケージでは、パッケージ全体(セッション)のためのコンテキストを1回作成し、複数のDML操作でコンテキストを再利用します。

注意:
キー列employee_idが、行を識別する方法として更新と削除の両方に使用されることに注意してください。

スクリプトによって作成された3つのプロシージャのどれをコールしてもemployees表を更新できます。

testDML.insertXML(xmlclob);
testDML.deleteXML(xmlclob);
testDML.updateXML(xmlclob);

各プロシージャ・コールが同じコンテキストを使用することで、これらの操作が頻繁に実行される場合は特にパフォーマンスが向上します。

XSUを使用したプログラミングのヒントと方法

この項では、XSUを使用したプログラムを作成するための追加のヒントと方法を示します。内容は次のとおりです。

- XSUによるSQLとXML間のマップ方法

- XSUのSQL文の処理方法

XSUによるSQLとXML間のマップ方法

表の基本コンポーネントは列ですが、XML文書の基本コンポーネントは要素と属性です。表はどのようにXML文書にマップされるのでしょうか。たとえば、hr.employees表にlast_nameという列がある場合、この構造はXMLで、last_name属性を持つ<EMPLOYEES>要素、または異なるルート要素内の<LAST_NAME>要素として表現されますが、これはどのような方法で行われるのでしょうか。この項では、これらの疑問に答えるため、SQLからXMLおよびXMLからSQLへのマッピングについて説明します。内容は次のとおりです。

- SQLからXMLへのデフォルト・マッピング

- XMLからSQLへのデフォルトのマッピング

- 生成されるXMLのカスタマイズ

SQLからXMLへのデフォルト・マッピング

hr.employees表の列のデータをXML文書として表示する場合を想定します。次のように、コマンドラインでXSUを実行します。

java OracleXML getXML -user "hr/password" -withschema \
"SELECT employee_id, last_name, hire_date FROM employees"

XSUは、入力された問合せに基づいてXML文書を出力します。ドキュメントのルート要素は<DOCUMENT>です。次にサンプル出力を示します。関連のない行はコメントに置き換えられています。

<?xml version = '1.0'?>
<DOCUMENT xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- children of schema element ... -->
</xsd:schema>
<ROWSET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="#/DOCUMENT/xsd:schema[not(@targetNamespace)]">
<ROW num="1">
<EMPLOYEE_ID>100</EMPLOYEE_ID>
<LAST_NAME>King</LAST_NAME>
<HIRE_DATE>6/17/1987 0:0:0</HIRE_DATE>
</ROW>
<!-- additional rows ... -->
</ROWSET>
</DOCUMENT>

生成されたXMLでは、SQL問合せによって戻された行は<ROWSET>要素の子です。XML文書には、次の特徴があります。

- <ROWSET>要素には、戻された行数に応じて、0個以上の<ROW>子要素があります。問合せによって行が生成されなかった場合、<ROW>要素は含まれません。問合せによって行が1つ生成された場合は、1個の<ROW>要素が含まれます。

- 各<ROW>要素には、表の行の1つからのデータが含まれます。特に、各<ROW>要素には、SELECT文で指定されたデータベースの列と同一の名前およびコンテンツを持つ子要素が1つ以上あります。

オブジェクト・リレーショナル・スキーマでのXMLのマッピング

オブジェクト・リレーショナル・スキーマからXML文書を生成する場合を考えてみます。SQL*PlusでcreateObjRelSchema.sqlスクリプトを実行して、オブジェクト・リレーショナル・スキーマを設定し、データを挿入します。スキーマには、ユーザー定義型を使用する2つの列を持つdept1表があります。

コマンドラインからXSUを起動して、次のようにdept1表の問合せを実行できます。

% java OracleXML getXML -user "hr/password" -withschema "SELECT * FROM dept1"

XSUは、例11-13のXML文書を戻します。このXML文書では、関連のない行はコメントに置き換えられています。

例11-13 XSUにより生成されたサンプル文書

<?xml version='1.0'?>
<DOCUMENT xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<schema targetNamespace="http://xmlns.oracle.com/xdb/SYSTEM"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:SYSTEM="http://xmlns.oracle.com/xdb/SYSTEM">
<!-- children of schema element ... -->
</xsd:schema>
<ROWSET xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="#/DOCUMENT/xsd:schema[not(@targetNamespace)]">
<ROW num="1">
<DEPTNO>120</DEPTNO>
<DEPTNAME>Treasury</DEPTNAME>
<DEPTADDR>
<STREET>2004 Charade Rd</STREET>
<CITY>Seattle</CITY>
<STATE>WA</STATE>
<ZIP>98199</ZIP>
</DEPTADDR>
<EMPLIST>
<EMPLIST_ITEM>
<EMPLOYEE_ID>1</EMPLOYEE_ID>
<LAST_NAME>Mehta</LAST_NAME>
<SALARY>6000</SALARY>
<EMPLOYEE_ADDRESS>
<STREET>500 Main Road</STREET>
<CITY>Seattle</CITY>
<STATE>WA</STATE>
<ZIP>98199</ZIP>
</EMPLOYEE_ADDRESS>
</EMPLIST_ITEM>
</EMPLIST>
</ROW>
</ROWSET>
</DOCUMENT>

前述の例と同様に、この例は正規のマッピングを示しています。<ROWSET>には<ROW>子要素が含まれ、これらの子要素には、dept1の列に対応した子要素が含まれます。たとえば、<DEPTNAME>要素は、dept1.deptname列に対応しています。スカラー型の列に対応する要素は、列からのデータを含みます。

複雑な型の列からXMLへのデフォルト・マッピング

複雑な型の列に対応する要素の場合、マッピングはより複雑になります。例11-13で、<DEPTADDR>は、オブジェクト型AddressTypeのdept1.deptAddr列に対応しています。したがって、<DEPTADDR>は、AddressType型で指定された属性に対応する子要素を含みます。AddressTypeの属性streetは、子XML要素<STREET>に対応し、他の属性も同様にそれぞれの子要素に対応しています。これらのサブ要素は、対応する属性の型が単純か複雑かによって、それ自体がデータやサブ要素を含む場合があります。

XMLへのコレクションのデフォルト・マッピング

データベースのコレクションに対応する要素を処理する場合も、マッピングの方法が異なります。例11-13で、<EMPLIST>要素は、EmployeeListType型のemplist列に対応します。したがって、<EMPLIST>要素は、それぞれがコレクションの要素の1つに対応する<EMPLIST_ITEM>要素のリストを含みます。次の点に注意してください。

- <ROW>要素は、カーディナリティ属性numを含みます。

- 特定の列または属性の値がNULLの場合、その行では、対応するXML要素がすべて省略されます。

- 最上位のスカラー列の名前がアットマーク(@)で始まる場合、その列はXML要素ではなくXML属性にマップされます。

XMLからSQLへのデフォルトのマッピング

XMLからSQLへのマッピングは、SQLからXMLへのマッピングの逆の操作です。XSUを使用してXMLからSQLへのマッピングを行う場合は、次の相違点を考慮に入れてください。

- XMLからSQLへの変換では、XSUはXML属性を無視します。したがって、XML属性は実際にはSQLにマップされません。

- SQLからXMLへの変換では、XSUはSQL問合せによって作成された単一のResultSetに対してマッピングを行います。問合せは、複数のデータベース表またはビューに対して実行できます。XMLからSQLへの変換では、次の点に注意してください。

- 1つのXML文書を複数の表またはビューに挿入するには、ターゲットのスキーマにオブジェクト・リレーショナル・ビューを作成する必要があります。

- ビューが更新不可能な場合は、INSTEAD OF INSERTトリガーを使用できます。

XML文書がターゲットのデータベース・スキーマに完全にマップされない場合は、次の方法で対処できます。

- ターゲットを変更します。ターゲットのスキーマにオブジェクト・リレーショナル・ビューを作成し、そのビューを新しいターゲットにします。

- XSLTを使用してXML文書を変換して、XML文書を変更します。XSLTスタイルシートをXSUに登録すると、マッピングを試行する前に、受信したXMLを自動的に変換できます。

- XSUのXMLからSQLへのマッピングを変更します。XML要素とデータベースの列または属性の一致で大/小文字を区別するように、XSUに対して指示できます。たとえば、XSUに対して次のことを指示できます。

- ROWのかわりに、データベースの行に対応する要素名を使用

- XML文書の日付を解析するときに使用する日付書式の指定

生成されたXMLのカスタマイズ

特定の構造を持つXMLを生成する必要がある場合もあります。生成されたXML文書のデフォルトの構造が要求する構造と異なる場合があるため、このプロセスにはある程度の柔軟性が必要になります。次のいずれかの方法を使用して、生成されたXML文書の構造をカスタマイズできます。

- データベース・スキーマまたはSQL問合せの変更

- XSUの変更

データベース・スキーマまたはSQL問合せの変更

ソースのカスタマイズは、SQL問合せまたはデータベース・スキーマを変更することによって行います。最も単純で強力なソースのカスタマイズは次のとおりです。

- データベース・スキーマで、任意のXML文書構造にマップするオブジェクト・リレーショナル・ビューを作成します。

- 問合せで、次のことを行います。

- カーソル副問合せまたはキャスト多重集合構造を使用して、フラットなスキーマから取得したXML文書でネストを作成します。

- 列名および属性名に別名を付けて、任意のXML要素を取得します。

- アットマーク(@)で始まる識別子を使用して、最上位のスカラー型の列に別名を付け、これらの列をXML要素ではなくXML属性にマップします。たとえば、次の文を実行すると、<ROW>要素が属性empnoを持つXML文書が生成されます。

SELECT employee_name AS "@empno",... FROM employees;

例11-14のcustomer.xml文書について考えてみます。

例11-14 customer.xml

<?xml version = "1.0"?>
<ROWSET>
<ROW num="1">
<CUSTOMER>
<CUSTOMERID>1044</CUSTOMERID>
<FIRSTNAME>Paul</FIRSTNAME>
<LASTNAME>Astoria</LASTNAME>
<HOMEADDRESS>
<STREET>123 Cherry Lane</STREET>
<CITY>SF</CITY>
<STATE>CA</STATE>
<ZIP>94132</ZIP>
</HOMEADDRESS>
</CUSTOMER>
</ROW>
</ROWSET>

データベース表のセットを設計して、このデータを格納する必要があるとします。XMLは複数のレベルを持つネスト構造であるため、前述のXML文書に正規マッピングされるオブジェクト・リレーショナル・データベース・スキーマを使用できます。SQL*PlusでcreateObjRelSchema2.sqlスクリプトを実行して、このようなデータベース・スキーマを作成します。

スクリプトによって作成されるcustomer_tab表に、customer.xml文書のデータをロードできます。次のようにコマンドラインからXSU for Javaを起動します。

java OracleXML putXML -user "hr/password" -fileName customer.xml customer_tab

オブジェクト・リレーショナルでないデータベース・スキーマにcustomer.xmlをロードするには、標準のリレーショナル・スキーマの最上位にオブジェクトのビューを作成します。たとえば、必要な列を含むリレーショナル表を作成し、最上位にカスタマ・オブジェクトを持つカスタマ・ビューを作成できます。例11-15に、createRelSchema.sqlスクリプトを示します。

例11-15 createRelSchema.sql

CREATE TABLE hr.cust_tab
( customerid NUMBER(10),
firstname VARCHAR2(20),
lastname VARCHAR2(20),
street VARCHAR2(40),
city VARCHAR2(20),
state VARCHAR2(20),
zip VARCHAR2(20)
);

CREATE VIEW customer_view
AS
SELECT customer_type(customerid, firstname, lastname,
address_type(street,city,state,zip)) customer
FROM cust_tab;

次のようにデータをcustomer_viewにロードできます。

java OracleXML putXML -user "hr/password" -fileName customer.xml customer_view

または、XSLTを使用してXMLをフラット化し、このXMLをリレーショナル・スキーマに直接挿入することもできます。ただし、この方法は、あまりお薦めできません。

特定の列または列のグループをXML要素ではなくXML属性にマップする必要があるとします。これを達成するには、列名に別名を作成し、この別名の前にアットマーク(@)を付加します。たとえば、mapColumnToAtt.sqlスクリプトを使用してhr.employees表に問合せを行い、employee_idをXML属性としてレンダリングできます。

次のようにコマンドラインからmapColumnToAtt.sqlスクリプトを実行できます。

java OracleXML getXML -user "hr/password" -fileName "mapColumnToAtt.sql"

注意:
すべてのXML属性の列を先にマップする必要があります。

XSUの変更

XSUを使用すると、SQLデータをXMLに変換するために使用する規則を変更できます。SQLからXMLへのマッピングでは、次のように変更できます。

- <ROWSET>または<ROW>タグを変更または省略します。

- num属性を変更または省略します。これは、<ROW>要素のカーディナリティ属性です。

- 生成されたXML要素名に大/小文字を指定します。

- コレクションの要素に対応するXML要素が、カーディナリティ属性を持つように指定します。

- XML文書の日付書式を指定します。

- XML文書のnull値は、要素を省略せず、NULL属性を使用して表すように指定します。

XSUのSQL文の処理方法

この項では、XSUとデータベースの対話方法について説明します。

- XSUのデータベースへの問合せ方法

- XSUの行の挿入方法

- XSUの行の更新方法

- XSUの行の削除方法

- DML実行後のXSUのコミット方法

XSUのデータベースへの問合せ方法

XSUはSQL問合せを実行し、データベースからResultSetを取得します。次に、XSUはResultSetに関するメタデータを取得し、分析します。「SQLからXMLへのデフォルト・マッピング」で説明したマッピングを使用して、XSUはSQLの結果セットを処理し、XML文書に変換します。

XSUは、特定の種類の問合せを処理できません。特に、LONG型またはLONG RAW型の列とSELECT句のCURSOR()式が混在している場合、処理できません。LONGおよびLONG RAWは、JDBCがストリームとしてアクセスするデータ型の例で、使用は推奨されません。これらの列をCLOBに移行すると、問合せは成功します。

XSUの行の挿入方法

XML文書のコンテンツを表またはビューに挿入するとき、XSUは次の手順を実行します。

1. ターゲットの表またはビューに関するメタデータを取得します。

2. メタデータに基づいて、SQL INSERT文を生成します。たとえば、ターゲット表がdept1で、dept1からXML文書が生成されるとします。XSUは、次のようなINSERT文を生成します。

INSERT INTO dept1 (deptno, deptname, deptaddr, emplist) VALUES (?,?,?,?)

3. XML文書を解析し、各レコードに対して、適切な列または属性に適切な値をバインドします。たとえば、INSERT文に次のような値をバインドします。

deptno   <- 100
deptname <- SPORTS
deptaddr <- AddressType('100 Redwood Shores Pkwy','Redwood Shores',
'CA','94065')
emplist  <- EmployeeListType(EmployeeType(7369,'John',100000,
AddressType('300 Embarcadero','Palo Alto','CA','94056'),...)

4. 文を実行します。INSERT処理を最適化して、バッチで挿入およびコミットできます。

関連項目:

- 「SQLからXMLへのデフォルト・マッピング」

- バッチの詳細は、「OracleXMLSaveを使用した行の挿入」を参照してください。

XSUの行の更新方法

更新および削除の文は、データベース表内の2つ以上の行に影響するという点で挿入と異なります。挿入では、表にトリガーまたは制約がない場合は、XML文書の1つの<ROW>要素の影響を受けるのは表内で最大1つの行のみです。更新および削除では、一致する列が表内のキー列でない場合は、XML要素が2つ以上の行と一致する場合があります。

更新の文には、更新する行を識別するためにXSUが必要とするキー列のリストを提供する必要があります。たとえば、次のフラグメントを含むXML文書があるとします。

<ROWSET>
<ROW num="1">
<DEPTNO>100</DEPTNO>
<DEPTNAME>SportsDept</DEPTNAME>
</ROW>
</ROWSET>

DEPTNAMEの値をSportsからSportsDeptに変更します。DEPTNOをキー列として指定すると、XSUは次のUPDATE文を生成します。

UPDATE dept1 SET deptname = ? WHERE deptno = ?

XSUは、次のように値をバインドします。

deptno <- 100
deptname <- SportsDept

更新の場合は、XML文書にあるすべての要素を更新するのではなく、列の集合のみを更新するように選択できます。

関連項目:
「OracleXMLSaveを使用した行の更新」

XSUの行の削除方法

削除の場合は、削除する行をXSUが識別できるように、キー列の集合を指定するように選択できます。キー列の集合を指定しないと、DELETE文は文書にあるすべての列を一致させようとします。XSUに渡す次のような文書があるとします。

<ROWSET>
<ROW num="1">
<DEPTNO>100</DEPTNO>
<DEPTNAME>Sports</DEPTNAME>
<DEPTADDR>
<STREET>100 Redwood Shores Pkwy</STREET>
<CITY>Redwood Shores</CITY>
<STATE>CA</STATE>
<ZIP>94065</ZIP>
</DEPTADDR>
</ROW>
<!-- additional rows ... -->
</ROWSET>

XSUは、各ROW要素に対してDELETE文を構築します。

DELETE FROM dept1 WHERE deptno = ? AND deptname = ? AND deptaddr = ?

バインドは次のとおりです。

deptno   <- 100
deptname <- sports
deptaddr <- addresstype('100 redwood shores pkwy','redwood city','ca',
'94065')

関連項目:
「OracleXMLSaveを使用した行の削除」

DML実行後のXSUのコミット方法

デフォルトでは、XSUは明示的なコミットを行いません。AUTOCOMMITが、JDBC接続のデフォルトであるオンになっている場合、文の各バッチを実行した後、XSUはCOMMITを実行します。AUTOCOMMITをオフにし、setCommitBatchを使用して、XSUがコミットする前に実行する文の数を指定することで、この動作をオーバーライドできます。エラーが発生した場合、XSUは、XSUへのコール前のターゲット表の状態、またはXSUへの現在のコール中に行われた前回のコミット後の状態にロールバックします。

12 TransX Utilityの使用

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

- TransX Utilityの概要

- TransX Utilityの使用: 概要

- TransX Utilityを使用したデータのロード

関連項目:
第13章「データ・ローディング・フォーマット(DLF)仕様」

TransX Utilityの概要

TransX Utilityを使用すると、XMLをデータベースに転送できます。より具体的には、TransX Utilityは翻訳済のシード・データおよびメッセージをデータベース・スキーマにロードするXML SQL Utility(XSU)のアプリケーションです。1つのデータベースに複数言語のデータを移入する場合、TransX Utilityを使用すると、通常はXSUを使用して開発する必要がある機能を利用できます。

TransX Utilityは、多言語XMLを処理する場合に特に有用です。このユーティリティは、次のことを行います。

- 変数の変更、開始順序、および複数の挿入操作またはセッションを必要とするその他のSQL文を自動的に管理します。したがって、翻訳ベンダーは、慣れていないSQLスクリプトまたはPL/SQLスクリプトを操作する必要がありません。

- キャラクタ・エンコーディングを自動化します。したがって、データ・ファイルがXML標準に準拠しているかぎり、不適切なエンコーディングによるロード時のエラーは発生しません。

- 翻訳する文字列を準備し、翻訳し、データベースにロードすることで、グローバリゼーションのコストを削減します。

- 翻訳データ形式エラーを最小限に抑え、データベース内の事前に指定された場所に翻訳コンテンツを正確にロードします。データが事前定義済の形式であるとき、TransX Utilityはその形式を検証します。

- 様々なグローバリゼーション・サポートの設定による構文エラーが発生しません。

- ピース単位のNCHARデータに対するUNISTRコンストラクタは不要です。

注意:
TransXは認証されたユーザーとして実行されます。注意深くデータ・ファイルをレビューして、信頼されたソースからのみデータ・ファイルをロードしてください。

前提条件

TransXはXSUのアプリケーションであるため、この章ではXML SQL Utility(XSU)を十分理解していることを前提とします。

関連項目:
第11章「XML SQL Utility(XSU)の使用」

TransX Utilityの機能

この項では、TransX Utilityが持つ次の機能について説明します。

- 多言語データ・ロードの簡略化

- 簡易データ形式のサポートおよびインタフェース

- その他のTransX Utilityの機能

多言語データ・ロードの簡略化

多言語データまたはデータの翻訳をOracleデータベースに挿入またはエンコードする場合は、各XMLファイルを検証する必要があります。従来の翻訳データのロード方法では、ロードするファイルを切り替えるときにNLS_LANG環境変数の設定を変更していました。この変数では、クライアント・アプリケーションとデータベース・サーバーに使用する言語および地域を設定します。また、クライアント・プログラムによって入力または表示されるデータのキャラクタ・セットであるクライアントのキャラクタ・セットも設定されます。

従来の方法では、各ロード・ファイルは、それぞれの言語に適したキャラクタ・セットでエンコードされます。翻訳は、元のファイルと同じファイル形式(通常はSQLスクリプト)で実行する必要があるため、この操作が必要でした。NLS_LANGの設定は、ファイルが言語に対応したキャラクタ・セットに適した形でロードされると同時に変更されます。この方法は、時間がかかるだけでなく、エンコーディング・メタデータがデータ自体と区別されるため、エラーが発生しやすくなります。

TransX Utilityでは、データセットと呼ばれる事前定義済の形式を持つXML文書を使用します。データセットにはエンコーディング情報およびデータが含まれ、NLS_LANGの設定を変更せずに多言語データを転送できます。TransX Utilityを使用すると、開発グループおよび翻訳グループは、データベースへのXMLデータのロード時に正しいキャラクタ・セットを維持する必要がなくなります。

関連項目:
NLS_LANG環境変数の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

簡易データ形式のサポートおよびインタフェース

TransX Utilityには、コマンドライン・インタフェースおよびプログラム可能なAPIがあります。このユーティリティは、データベースにロードされるシード・データを表す正規の方法として定義されたデータ形式に準拠します。この形式は、直感的で、翻訳グループ用に簡略化されています。フォーマット仕様は、データのロードを可能にするための、翻訳者によるデータの記述方法を定義します。データセットの値は、スカラー値で表現するか、定数、順序および問合せなどの式を使用して表現できます。

その他のTransX Utilityの機能

表12-1に、その他の有用なTransX Utility機能を示します。

表12-1 TransX Utilityの機能

機能

TransX Utility . .

コマンドライン・インタフェース

簡単に使用できるコマンドを提供します。

ユーザーAPI

Java APIが表示されます。

検証

データ形式を検証し、エラーを報告します。

空白の処理

特に指定されていないかぎり、データセットに含まれる空白文字は有効とみなされません。

アンロード

入力された問合せに基づいて、結果を標準データ形式にエクスポートします。

翻訳交換フォーマットとの親和性

翻訳交換フォーマットとの間で変換を行うことができます。

ローカライズされたユーザー・インタフェース

多数の言語でメッセージを表示します。

TransX Utilityの使用: 概要

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

- TransX Utilityの使用: 基本プロセス

- TransX Utilityのデモ・プログラムの実行

- TransXコマンドライン・ユーティリティの使用

TransX Utilityの使用: 基本プロセス

次のAPIを介してTransXにアクセスできます。

- oracle.xml.transx.loaderクラス: このクラスには、TransXインスタンスを取得するためのgetLoader()があります。

- oracle.xml.transx.TransXインタフェース: TransXのAPIです。

図12-1に、TransX APIを使用してXMLをOracleデータベースに転送するための基本的な処理の流れを示します。

図12-1 TransXアプリケーションの基本プロセス

TransXアプリケーションの基本プロセスは、次のとおりです。

1. TransXローダー・オブジェクトを作成します。次のようにgetLoader()をコールして、TransXクラスをインスタンス化します。

TransX  transx = loader.getLoader();

2. TransX.open()を使用してデータベース接続情報を指定して、データ・ロード・セッションを開始します。セッションを作成するには、JDBC接続文字列、データベース・ユーザー名およびデータベース・パスワードを指定します。次のオプションがあります。

- JDBC OCIドライバを使用して接続を作成します。この方法を示す次のコード部分は、指定されたユーザー名とパスワードを使用して接続します。

transx.open( "jdbc:oracle:oci8:@", user, passwd );

- シンJDBCドライバを使用して接続を作成します。シン・ドライバはPure Javaで作成されており、すべてのJavaプログラムからコールできます。次のコード部分は、この方法を示して接続します。

transx.open( "jdbc:oracle:thin:@//myhost:1521/myservicename", user,passwd);

シン・ドライバにはホスト名(myhost)、ポート番号(1521)およびサービス名(myservicename)が必要です。データベースにはアクティブなTCP/IPリスナーが必要です。

注意:
検証はTransXによって実行されるため、データ形式の検証のみを行う場合はデータベース接続を確立する必要はありません。この場合は、先行するopen()コールなしでTransX.validate()メソッドを起動できます。

3. TransXローダーを構成します。表12-2に、構成メソッドを示します。

表12-2 TransXの構成メソッド

メソッド

説明

setLoadingMode()

重複に対する操作モードを設定します。このモードは、データベース内の1つ以上の既存の行で、キー列の値がロードされるデータセットの値と同じであった場合のTransXの動作を決定します。oracle.xml.transx.LoadingModeクラスの定数EXCEPTION_ON_DUPLICATES、SKIP_DUPLICATESまたはUPDATE_DUPLICATESを指定できます。デフォルトでは、ローダーは重複をスキップします。

setNormalizeLangTag()

言語タグを大文字または小文字に設定します。デフォルトで、ローダーはDLFのnormalize-langtag属性で指定されたスタイルを使用します。

setPreserveWhitespace()

ローダーでの空白の処理方法を指定します。デフォルトはFALSEです。この場合、ローダーはデータセット内の空白文字の種類を無視し、空白文字としてロードします。ローダーは、データセット内の連続する空白文字を1つの空白文字として処理します。

setValidationMode()

検証モードを設定します。デフォルトはTRUEです。この場合、各load()コールに対してローダーは正規のスキーマ定義と照合してデータセット形式の検証を実行します。データセットがすでに検証済である場合にのみ検証モードを無効にします。

次の例は、ローダーが重複する行をスキップし、データセットを検証しないことを指定します。

transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES );
transx.setValidationMode( false );

4. TransX.load()を起動してデータセットをロードします。ロード操作の反復中は同じJDBC接続を使用します。たとえば、次のように3つのデータセットをロードします。

String  datasrc[] = {"data1.xml", "data2.xml", "data3.xml"};
...
for ( int i = 0 ; i < datasrc.length ; i++ )
{
transx.load( datasrc[i] );
}

5. TransX.close()を起動してロード・セッションをクローズします。このメソッドをコールすると、データベース接続がクローズします。

transx.close();

関連項目:

- Oracle JDBCの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

- TransXのクラスおよびメソッドの詳細は、Oracle Database XML Java APIリファレンスを参照してください

TransX Utilityのデモ・プログラムの実行

TransX Utilityのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/transxにあります。表12-3に、このユーティリティのテストに使用できるXMLファイルとプログラムを示します。

表12-3 TransX Utilityのサンプル・ファイル

ファイル

説明

README

TransXのデモの設定方法が記述されたテキスト・ファイル。

emp-dlf.xml

サンプル出力ファイル。次のコマンドは、emp表のすべてのデータを含むemp.xmlファイルを生成します。

transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user
-pw emp.xml emp

emp-dlf.xmlファイルは、emp.xmlと同一である必要があります。

txclean.sql

デモのために作成された表および順序を削除するSQLファイル。

txdemo1.java

JDBC接続を作成し、データベースに3つのデータセットをロードするサンプルJavaアプリケーション。

txdemo1.sql

デモ・アプリケーションで使用する2つの表および順序を作成するSQLスクリプト。

txdemo1.xml

サンプル・データセット。

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

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

2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。環境変数$ORACLE_SID (UNIXの場合)または%ORACLE_SID%%ORACLE_SID% (Windowsの場合)をデフォルト・データベースに設定することをお薦めします。

注意:
セキュリティ上の理由から、コマンドライン・インタフェースにパスワードが表示されないようにしてください。TransXでパスワードのかわりに「-pw」と指定すると、[ パスワードの入力: ]と表示されてパスワードの入力を求められます。ユーザーがパスワードを入力してもパスワードがそのまま表示されることはなく、文字数分の「*」が表示されます。

3. txdemo1.sqlを実行して、サンプル・データベース・オブジェクトを設定します。データベースに接続し、次のようにtxdemo1.sqlスクリプトを実行します。

@txdemo1

4. コマンドラインからTransXユーティリティを実行します。たとえば、シンJavaドライバに接続する必要があり、ホストが myhost、ポートが1521、サービス名が myservicenameであるとします。トークンuserで示している場所にユーザー名を入力します。次のコマンドを実行して、データセットtxdemo1.xmlをロードできます。

transx "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw txdemo1.xml

操作が正常に実行された場合、端末への出力はありません。

5. データベースを問い合せて、ロードが正常に実行されたかどうかを確認します。次に例を示します。

SELECT * FROM i18n_messages;

6. デモ・オブジェクトを削除して、別のテストの準備をします。データベースに接続し、次のようにtxclean.sqlスクリプトを実行します。

@txclean

7. Javaのデモ・プログラムをコンパイルします。次に例を示します。

javac txdemo1.java

8. コマンドライン・インタフェースを起動したときに使用したのと同じJDBCおよびデータベース接続データを使用して、Javaプログラムを実行します。次に例を示します。

java txdemo1 "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw\
txdemo1.xml

前述と同じ問合せテスト(手順5)およびクリーンアップ操作(手順6)を実行します。

9. TransX Utilityを実行して、事前定義済のXML形式にデータをアンロードします。次に例を示します。

transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw emp.xml emp

emp.xmlのデータをemp-dlf.xmlと比較します。

注意:
この機能を明確に示すため、この例では、デプロイ済システムで通常使用されるパスワード管理手法を実行していません。本番環境では、Oracle Databaseパスワード管理ガイドラインに従い、サンプル・アカウントをすべて無効にしてください。パスワード管理ガイドラインおよびその他のセキュリティ上の推奨事項については、『Oracle Databaseセキュリティ・ガイド』を参照してください。

TransXコマンドライン・ユーティリティの使用

TransX Utilityは、Oracle Databaseにパッケージ化されています。デフォルトでは、Oracle Universal Installerを使用してディスク上にユーティリティがインストールされます。「Java XDKコンポーネントの依存性」で説明しているように、TransXライブラリは$ORACLE_HOME/lib/xml.jar(UNIXの場合)および%ORACLE_HOME%\lib\xml.jar(Windowsの場合)です。

次の構文を使用して、オペレーティング・システムのコマンドラインからTransX Utilityを実行できます。

java oracle.xml.transx.loader

XDKには、$ORACLE_HOME/bin/transx(UNIXの場合)および%ORACLE_HOME%\bin\transx.bat(Windowsの場合)というTransXのスクリプト・バージョンが含まれます。PATH変数が正しく設定されている場合、次のようにTransXを実行できます。

transx options parameters
transx.bat options parameters

たとえば、次のコマンドは有効な構文です。

transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw emp.xml emp

TransX Utilityのコマンドライン・オプション

表12-4に、TransX Utilityのオプションを示します。

表12-4 TransX Utilityのコマンドライン・オプション

オプション

意味

説明

-u

既存の行を更新します。

既存の行をスキップせず、更新します。更新操作の対象から列を除外するには、useforupdate属性をnoに設定します。

-e

行がデータベースにすでに存在する場合に例外を戻します。

重複行が検出されると例外を発生させます。デフォルトでは、TransXは重複行をスキップします。データベースおよびデータセットの検索キー列(複数可)の値が同じ場合は、行が重複しているとみなします。

-x

データベースのデータを、事前定義済の形式で出力します。

-sオプションと同様に、ユーティリティがロードと逆の操作を実行します。ただし、-sオプションとは異なり、stdoutに出力します。この出力をファイルにリダイレクトする方法はお薦めしません。オペレーティング・システムの介入によって、予想外のトランスコーディングが発生してデータが失われる可能性があります。

-s

データベースのデータを、事前定義済の形式でファイルに保存します。

アンロードを実行します。TransX Utilityはデータベースへの問合せを行って、その結果を事前定義済のXML形式にフォーマットし、指定したファイル名で格納します。

-p

ロードするXMLを出力します。

挿入するデータセットを正規のXSU形式で出力します。

-t

更新のためXMLを出力します。

更新するデータセットを正規のXSU形式で出力します。

-o

検証を省略します(デフォルトでは、データセットは解析時に検証されます)。

TransX Utilityが形式の検証(デフォルトでは実行される)をスキップします。

-v

データ形式を検証し、ロードせずに終了します。

TransX Utilityが検証を行って終了します。

-w

すべての空白を保持します。

TransX Utilityが空白文字(\t、\r、\n、' 'など)を重要であるとみなします。文字列データ要素内の連続する空白文字は、デフォルトでは1つの空白文字とみなされます。

-l

言語タグを大文字または小文字に設定します。

TransX UtilityはDLFのnormalize-langtag属性またはTransX APIのsetNormalizeLangTag()メソッドで指定された言語タグの大文字/小文字正規化スタイルをオーバーライドします。有効なオプションは、標準、大文字および小文字に対してそれぞれ-ls、-luおよび-llです。

コマンドラインオプションの例外を次に示します。

- -uと-eは、相互に排他的です。

- -vは、次の例に示すとおり、後にデータを伴う唯一のオプションです。

- -xは、次の例に示すとおり、後に接続情報およびSQL問合せを伴う唯一のオプションです。

すべての引数を省略すると、表12-4に示した使用方法の情報が表示されます。

TransX Utilityコマンドライン・パラメータ

表12-5に、TransX Utilityのコマンドライン・パラメータを示します。

表12-5 TransXユーティリティのコマンドライン・パラメータ

パラメータ

説明

connect_string

JDBC接続文字列。『Oracle Database JDBC開発者ガイドおよびリファレンス』を参照してください。

username

データベース・ユーザー名。

password

データベース・ユーザーのパスワード、または「-pw」。

datasource

XML文書をファイル名またはURLで指定します。

options

表12-4「TransX Utilityのコマンドライン・オプション」を参照してください。

関連項目:
TransXインタフェースの詳細は、Oracle Database XML Java APIリファレンスを参照してください

TransX Utilityを使用したデータのロード

TransX Utilityは、データベースに多言語データを移入する場合に特に有用です。このユーティリティを使用して、データベース・スキーマとの間でデータを送受信するには、このスキーマにマップするデータセットを作成する必要があります。この項では、TransXを使用してデータベースの翻訳済アプリケーション・メッセージを整理する一般的な使用例を示します。

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

- データベースへのメッセージの格納

- 事前定義済形式でのデータセットの作成

- データのロード

- データの問合せ

データベースへのメッセージの格納

国際化されたシステムを構築するには、ローカライズ可能なリソースをビジネス・ロジックから切り離すことが不可欠です。このようなリソースの一般的な例として翻訳済のテキスト情報があります。データが特定の地域に固有のもので、共通の言語および文化的慣習を共有する場合は、ロケール固有の情報を取得できるリソース管理機能を使用してデータを編成する必要があります。多くの場合は、メンテナンスが簡単で柔軟性が高いため、データベースを使用してこのようなデータを格納します。

例12-1のような構造およびコンテンツを持つ表を作成し、データを挿入するとします。

例12-1 表translated_messagesの構造

CREATE TABLE translated_messages
(
MESSAGE_ID       NUMBER(4)
CONSTRAINT tm_mess_id_nn NOT NULL
, LANGUAGE_ID      VARCHAR2(42)
, MESSAGE          VARCHAR2(200)
);

エンド・ユーザーの優先言語に基づいてアプリケーションでメッセージを取得できるように、この表では列language_idが定義されています。この列には、メッセージの言語を識別するための言語名の略称が含まれます。

例12-2に、表のサンプル・データを示します。

例12-2 translated_messagesの問合せ

MESSAGE_ID  LANGUAGE_ID  MESSAGE
----------  -----------  ----------------------------------
1           us           Welcome to System X
2           us           Please enter username and password

関連項目:
Oracleの言語の略称は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

事前定義済形式でのデータセットの作成

第13章「データ・ローディング・フォーマット(DLF)仕様」では、データ・ローディング・フォーマット(DLF)言語の構文について詳しく説明しています。この言語を使用して、TransXへの入力を提供するDLF文書を作成します。

正規の形式でデータセット(入力データ)を指定すると、そのデータは、TransX Utilityによってデータベース内の指定された場所にロードされます。TransXは、データベース・オブジェクトを作成しない点に注意してください。したがって、データをロードする前に、表またはビューを作成する必要があります。

例12-3に、例12-1で作成したtranslated_messages表を表すXML文書を示します。データセットは、この例ではtranslated_messagesというターゲット表の構造を反映しています。

例12-3 example.xml

<?xml version="1.0"?>
<table name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id"  type="number"/>
<column name="language_id" type="string" constant="us" translate="yes"/>
<column name="message"     type="string" translate="yes"/>
</columns>
<!-- Specify the data to be inserted -->
<dataset>
<row>
<col name="message_id">1</col>
<col name="message" translation-note="dnt'X'">Welcome to System X</col>
</row>
<row>
<col name="message_id">2</col>
<col name="message">Please enter username and password</col>
</row>
<!-- ... -->
</dataset>
</table>

入力XML文書の形式

例12-3のXML文書は、次のような宣言で開始します。

<?xml version="1.0"?>

ルート要素の<table>は、表名を指定する属性を持ち、他のすべての要素を囲みます。

<table name="translated_messages">
...
</table>

「DLFの要素」で説明しているように、<table>要素には3つのサブセクションがあります。

- 検索キーの要素

- メタデータ要素

- データ要素

前述のセクションは、次のように例12-3の要素にマップします。

<lookup-key>...</lookup-key>
<columns>...</columns>
<dataset>...</dataset>

検索キーは、行がすでにデータベースに存在する場合、行を評価するために使用する列です。メッセージと言語IDの対によって一意の文字列を識別する必要があるため、文書で対応する列をリストします。この場合、表translated_messagesのmessage_id、language_idおよびmessage列は、次のように<column>要素の属性にマップされます。

<column name="message_id"  type="number"/>
<column name="language_id" type="string" constant="us" translate="yes"/>
<column name="message"     type="string" translate="yes"/>

列セクションは、データセット・セクションのデータ・ピースと表列のマッピングを指定するため、表構造をミラー化する必要があります。列名は、XMLデータセットおよびデータベースの全体を通じて一貫している必要があります。表12-6の<column>属性を使用して、ロードするデータを記述できます。これらの属性は、「DLFの要素」で説明しているDLF属性のサブセットです。

表12-6 <column>の属性

の属性" width="100%">

属性

説明

例

type

データセットの列のデータ型を指定します。この属性は、データセットの<col>要素に含まれるテキストの種類を指定します。この型に応じて、データ・ロード・ツールはデータに対して異なるデータ型の規則を適用します。

<column name="col" type="string" />

constant

定数値を指定します。各行に固定値を持つ列では、同じ値を繰り返す必要はありません。

<column name="col" type="string" constant="us" />

language

language属性は、列が言語タグを格納する言語列であることを示します。constant属性と同様に機能します。ただし、列を宣言するロールは言語列です。

<column name="language" type="string" language="us" />

sequence

この列に値を入力するために使用されるデータベース内の順序を指定します。

<column name="id" type="number" sequence="id_sq" />

translate

この列またはパラメータのテキストを翻訳するかどうかを指定します。

<column name="msg" type="string" translate="yes"/>

<column>要素のconstant属性は、データセット・セクション内のすべての行の対応する列に格納する値を指定します。この例では元の言語を使用しているため、language_id列は値usに設定されています。

言語列の定義

別の方法として、language_id列で、constant属性でなくlanguage属性を使用することもできます。language属性を持つDLFドキュメントでは、XML名前空間でlang属性を使用できます。言語列では、プレースホルダ「%x」を使用して、ルート表要素の標準のxml:lang属性から値を取得できます。このためtranslate="yes"は不要です。値「%x」は変換する必要がありません。このDLFのロード結果は例10-3と同じです。

例12-4 language属性を持つexample.xml

<?xml version="1.0"?>
<table xml:lang="us" name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id"  type="number"/>
<column name="language_id" type="string" language="%x"/>
<column name="message"     type="string" translate="yes"/>
</columns>
<!-- Specify the data to be inserted -->
<dataset>
<row>
<col name="message_id">1</col>
<col name="message" translation-note="dnt'X'">Welcome to System X</col>
</row>
<row>
<col name="message_id">2</col>
<col name="message">Please enter username and password</col>
</row>
<!-- ... -->
</dataset>
</table>

表13-10で説明しているように、type属性の有効な値はstring、number、dateおよびdateTimeです。これらの値はXMLスキーマ標準で定義されたデータ型に対応しているため、各データ・ピースはそれぞれのデータ型の定義に準拠する必要があります。表12-7に示すように、特にdateおよびdateTimeデータ型ではISO 8601形式を使用することが重要です。

表12-7 dateおよびdateTimeの形式

データ型

形式

例

date

CCYY-MM-DD

2009-05-20

dateTime

CCYY-MM-DDThh:mm:ss

2009-05-20T16:01:37

例12-5に、TransXデータセットのdateTimeデータを持つ表の行の表現方法を示します。

例12-5 dateTime行

<row>
<col name="article_id">12345678</col>
<col name="author_id">10500</col>
<col name="submission">2002-03-09T16:01:37</col>
<col name="title">...</col>
<!-- some columns follows -->
</row>

データセットの翻訳の指定

「DLFの属性」で説明しているように、translation属性を使用して、翻訳済データが列に含まれるかどうかを指定できます。例12-3では、2つの<column>要素が異なった方法でtranslate属性を使用しています。language_id列の属性は、constant属性の値を翻訳する必要があることを指定します。

<column name="language_id" type="string" constant="us" translate="yes"/>

対照的に、次のtranslate属性は、この列と一致する名前を持つデータセット・セクション内のデータの翻訳を要求します。

<column name="message"     type="string" translate="yes"/>

たとえば、前述の要素は、データセット・セクション内の次のメッセージを翻訳する必要があることを指定します。

<col name="message" translation-note="dnt'X'">Welcome to System X</col>
<col name="message">Please enter username and password</col>

アプリケーションのメッセージを翻訳するとき、指定した語句を未翻訳のままにする必要がある場合もあります。前述の例に示したtranslation-note属性は、この目的を果します。

XSLTプロセッサは、前の形式を別の形式に変換できます。これによって、ローカライゼーション・サービス・プロバイダ間で翻訳データを交換し、XMLベースの翻訳ツールで使用できます。この変換により、開発者は、リビジョンの追跡や翻訳可能な文字列の単位としての分類などのタスクを行う必要がありません。

例12-6に、翻訳後の例12-3の文書を示します。

例12-6 example_es.xml

<?xml version="1.0"?>
<table xml:lang="es" name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id" type="number"/>
<column name="language_id" type="string" constant="es"
translate="yes"/>

例12-7に、翻訳後の例12-4の文書を示します。先ほどの例と異なり、列定義は変更されません。

例12-7 language属性を持つexample_es.xml

<?xml version="1.0"?>
<table xml:lang="es"  name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id"  type="number"/>
<column name="language_id" type="string" language="%x"/>

:
:

翻訳処理中にテキスト・エディタまたは従来のテキストベースの翻訳ツールを使用する場合は、文書のエンコーディングを保持することが重要です。翻訳後の文書は、元の文書とエンコーディングが異なる可能性があります。「DLFでのXML宣言」で説明しているように、翻訳済の文書のエンコーディングがUnicode以外の場合は、最初の行のXML宣言にエンコーディング宣言を追加します。Unicode以外のエンコーディングの宣言は、次のようになります。

<?xml version="1.0" encoding="ISO-8859-15"?>

翻訳処理で構文の整合性が損われていないことを確認するには、文書をXMLとして処理します。それ以外の場合は、コマンドライン・インタフェースの-vオプションを指定して、形式を確認できます。構文エラーが存在する場合は、エラーの場所と説明が出力されます。データ転送を正常に実行するには、エラーを修正する必要があります。

関連項目:
第13章「データ・ローディング・フォーマット(DLF)仕様」

データのロード

例12-3および例12-8のサンプル文書を例12-1で作成したtranslated_messages表にロードする場合を考えます。TransXデモ・ディレクトリにある例12-8のサンプル・プログラムを使用して、データをロードできます。

例12-8 txdemo1.java

// Copyright (c) 2001 All rights reserved Oracle Corporation

import oracle.xml.transx.*;

public class txdemo1 {

/**
* Constructor
*/
public txdemo1() {
}

/**
* main
* @param args
*
* args[0] : connect string
* args[1] : username
* args[2] : password
* args[3+] : xml file names
*/
public static void main(String[] args) throws Exception {

// instantiate a transx class
TransX  transx = loader.getLoader();

// start a data loading session
transx.open( args[0], args[1], args[2] );

// specify operation modes
transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES );
transx.setValidationMode( false );

// load the dataset(s)
for ( int i = 3 ; i < args.length ; i++ )
{
transx.load( args[i] );
}

// cleanup
transx.close();
}
}

txdemo1.javaプログラムは次の手順を実行します。

1. TransXローダー・オブジェクトを作成します。次に例を示します。

TransX  transx = loader.getLoader();

2. データ・ロード・セッションをオープンします。最初の3つのコマンドライン・パラメータは、JDBC接続文字列、データベース・ユーザー名およびデータベース・パスワードです。これらのパラメータは、TransX.open()メソッドに渡されます。プログラムには次の文が含まれます。

transx.open( args[0], args[1], args[2] );

3. TransXローダーを構成します。重複した行をスキップし、入力データセットを検証するようにローダーを構成します。プログラムには次の文が含まれます。

transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES );
transx.setValidationMode( false );

4. データをロードします。最初の3つのコマンドライン・パラメータは、接続情報を指定します。その他のパラメータは、入力XML文書を指定します。プログラムは、指定されたすべてのドキュメントに対してload()メソッドを起動します。

for ( int i = 3 ; i < args.length ; i++ )
{
transx.load( args[i] );
}

5. データ・ロード・セッションをクローズします。プログラムには次の文が含まれます。

transx.close();

javacを使用してプログラムをコンパイルした後、コマンドラインからプログラムを実行できます。次の例では、シンJavaドライバを使用して、コンピュータmyhostのポート1521でインスタンスmydbに接続します。useruserスキーマに接続し、XML文書example.xmlおよびexample_es.xmlをロードします。

java txdemo1 "jdbc:oracle:thin:@//myhost:1521/mydb" user -pw example.xml
example_es.xml

通常、多言語ソフトウェア・システムの構築では、翻訳されたメッセージは開発の後半段階で使用可能になります。また、長期間かけて徐々に改善される傾向にあります。データベースにメッセージを追加する必要がある場合は、TransX Utilityをもう一度実行して、<dataset>定義に新しい行を追加できます。TransXは新しい行を認識し、<lookup-key>セクションに指定された列に基づいて新しいメッセージのみを挿入します。一部のメッセージが更新された場合は、-uオプションを指定してTransXを実行して、XML内に指定されたデータで既存の行を更新します。

transx -u "jdbc:oracle:thin:@//myhost:1521/mydb" user -pw example.xml
example_es.xml

データの問合せ

例12-8のプログラムを使用してデータをロードした後、translated_messages表に問合せを行って結果を確認できます。次のような結果が表示されます。

MESSAGE_ID  LANGUAGE_ID  MESSAGE
----------  -----------  ----------------------------------
1           us           Welcome to System X
1           es           Bienvenido al Sistema X
2           us           Please enter username and password
2           es           Porfavor entre su nombre de usuario y su contraseña

WHERE句でlanguage_idおよびmessage_id列を使用して、アプリケーションで特定の言語のメッセージを取得できます。たとえば、次の問合せを実行できます。

SELECT message
FROM   translated_messages
WHERE  message_id = 2
AND    language_id = 'es';

MESSAGE
----------------------------------
Porfavor entre su nombre de usuario y su contraseña

13 データ・ローディング・フォーマット(DLF)仕様

この章では、データ・ローディング・フォーマット(DLF)、バージョン1.0について説明します。DLFは、TransX Utilityを使用してデータベースにロードした変換済のメッセージおよびシード・データを記述する標準形式です。内容は次のとおりです。

- DLFの概要

- DLFの一般的な構造

- DLFの仕様

- DLFの例

- DLFの参照

関連項目:
第12章「TransX Utilityの使用」

DLFの概要

DLFは、TransX Utilityを使用してロードするデータの標準形式を定義します。これは、SQLスクリプトを使用したデータ・ロードの後継となります。DLFには次の利点があります。

- 形式の検証。検証を行うことにより、変換およびロード時のエラーが減少します。

- 使いやすさ。各データ・ファイルのキャラクタ・エンコーディングを保持してデータ・ファイルで使用する言語に対応させる必要がありません。

DLFはXML 1.0仕様に基づいています。

注意:
TransXは認証されたユーザーとして実行されます。データ・ファイルをレビューして、信頼されたソースからのみデータ・ファイルをロードしてください。

DLFの命名規則

この項では、このドキュメントで使用される命名規則について説明します。

要素と属性

次の要素と属性の命名規則がこの仕様全体で使用されます。

- 標準の英文字。

- 小文字のみ。

- ハイフン(-)を連結文字として使用できます。

- 属性名の定義は全体で統一する必要があります。

- 可能なかぎり業界標準の用語を使用する必要があります。

値

値には、列名の一部の属性値を除いて、大/小文字の区別があります。すべての事前定義済の属性値は小文字です。要素の値はこの仕様では定義されていません。

ファイル拡張子

ファイル拡張子はこの仕様では推奨されていません。この仕様の今後のバージョンでは、ドキュメントで8.3標準に準拠する拡張子を使用することが推奨される可能性があります。

DLFの一般的な構造

データ・ローディング・フォーマットはXMLであるため、XML宣言で始まります。XML宣言の後に、<table>要素で囲まれたDLFドキュメントが続きます。DLFドキュメントを構成する必須のセクションは次のとおりです。

- <lookup-key>要素: データベースの既存の行が<dataset>要素に挿入されたデータセット定義の行と重複しているかどうかを判断するための列名のリストが含まれます。

- <columns>要素: <dataset>に関するメタデータ(列の名前、データ型、属性など)が含まれます。

- <dataset>要素: 各行の<row>要素が含まれ、この要素には、データベースの列にロードされるデータに対応する<col>要素が含まれます。このように、DLFドキュメントの表示は、データベースのデータを一般的な表形式で出力した場合に類似しており、編集が簡単です。

DLFには、<translation>要素で囲まれる、オプションのセクションが1つあります。このセクションを必須セクションの前に指定することもできます。

また、DLFはTransX Utilityの処理情報を提供します。提供される処理情報の一部を次に示します。

- <query>要素は、列にロードする値をSQL問合せで取得するために使用されます。

- sequence属性は、データベースの順序オブジェクトから列にロードする値を取得するために使用されます。

- constant属性は、定数値を列に指定するために使用されます。

- language属性は、列にロードする言語識別子を指定するために使用されます。

DLFのツリー構造

この項では、DLFドキュメントの有効なツリー構造を示します。各要素は<element_name>で示されます。element_nameは要素名です。属性にマークアップはありません。各要素および属性の後に、有効な出現回数を示す表記法が続きます。表13-1に、出現回数の表記法を示します。

表13-1 属性および要素の出現回数の表記法

記号

意味

1

1

+

1以上

?

0(ゼロ)または1

*

0(ゼロ)以上

(a|b|c)

a、b、cのいずれか

例13-1に、DLFドキュメントのツリー構造を示します。要素については、「DLFの要素」を参照してください。属性については、「DLFの属性」を参照してください。

例13-1 DLFのツリー構造

<table>1
|
+---- lang?
|
+---- space?
|
+---- normalize-langtag?
|
+---- <translation>?
|     |
|     +---- <target>+
|     |     |
|     |     +---- <language ID>
|     |
|     +---- <restype>+
|           |
|           +---- name1
|           |
|           +---- expansion?
|
+---- <lookup-key>1
|     |
|     +---- <column>*
|           |
|           +---- name1
|
+---- <columns>1
|     |
|     +---- <column>+
|           |
|           +---- name1
|           |
|           +---- type1
|           |
|           +---- translate?
|           |
|           +---- translation-note?
|           |
|           +---- constant?
|           |
|           +---- language?
|           |
|           +---- sequence?
|           |
|           +---- virtual?
|           |
|           +---- useforupdate?
|           |
|           +---- maxsize?
|           |
|           +---- size-unit?
|           |
|           +---- restype?
|           |
|           +---- space?
|           |
|           +---- (<query>|<sql>)?
|                 |
|                 +---- text1
|                 |
|                 +---- <parameter>*
|                       |
|                       +---- id1
|                       |
|                       +---- (col|constant)1
|                       |
|                       +---- translate?
|                       |
|                       +---- trans-key?
|                       |
|                       +---- translation-note?
|
|
+---- <dataset>1
|
+---- <row>+
|
+---- space?
|
+---- <col>*
|
+---- space?
|
+---- name1
|
+---- trans-key?
|
+---- translation-note?
|
+---- <the text element for the data>

DLFの仕様

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

- DLFでのXML宣言

- DLFでの実体参照

- DLFの要素

- DLFの属性

DLFでのXML宣言

XMLエンティティの先頭にはXML宣言があります。XML宣言は、XMLのバージョンを示し、次の例のようにファイルのエンコーディングの宣言に使用できます。

<?xml version="1.0" encoding="iso-8859-1" ?>

すべてのXMLファイルの場合と同様に、DLFファイルのデフォルト・エンコーディングはUTF-8 (7ビットのASCIIキャラクタ・セットのスーパーセット)またはUTF-16 (概念的には、65,535を超えるコード・ポイントのサロゲート・ペアを持つUCS-2)です。したがって、これらのキャラクタ・セットの場合はエンコーディング宣言は不要です。また、すべてのXMLパーサーでこれらのキャラクタ・セットがサポートされます。エンコーディングがUTF-16の場合、ファイルの最初の文字をUnicodeバイト・オーダー・マークの#xFEFFにする必要があります。

Oracle XMLパーサーでサポートされるその他のキャラクタ・セットには、すべてのOracleキャラクタ・セット、および一般的なIANAキャラクタ・セットやJavaエンコーディングなどがあります。これらのキャラクタ・セットの名前については、パーサーのドキュメントを参照してください。ドキュメントに実行環境やネットワーク・プロトコルなどのエンコーディング情報の外部ソースが存在しない場合、キャラクタ・セットの宣言にエンコーディング宣言を記述する必要があります。そのため、Unicodeキャラクタ・エンコーディングを使用して、エンコーディング宣言がなくても済むようにすることをお薦めします。UTF-8のドキュメントをエンコードして、次の宣言を使用することを推奨します。

<?xml version="1.0" ?>

DLFでの実体参照

XMLで事前定義済の5つの実体参照があります。表13-2に、これらの実体参照を示します。実体参照&lt;および&amp;は、必ず参照する文字の位置に使用する必要があります。

表13-2 実体参照

実体参照

意味

&lt;

より小さい(<)

&gt;

より大きい(>)

&amp;

アンパサンド(&)

&apos;

アポストロフィまたは一重引用符(')

&quot;

二重引用符(")

DLFの要素

例13-1のDLFの要素は、表13-3に示すカテゴリに分かれています。属性は各要素に共通です。属性については、「DLFの属性」を参照してください。

表13-3 DLF要素

要素のタイプ

タグ

最上位の表要素

<table>

変換の要素

<target>、<restype>

検索キーの要素

<lookup-key>、<column>

メタデータ要素

<columns>、<column>、<query>、<sql>、<parameter>

データ要素

<dataset>、<row>、<col>

最上位の表要素

表13-10に、最上位の表要素を示します。

表13-4 最上位の表要素

タグ

説明

必須属性

オプションの属性

内容

<表>

単一表に対応します。ドキュメント内にある他のすべての要素を囲みます。

name

lang、space、normalize-langtag

<table>内の要素の順序は次のとおりです。

1. <translation>(オプション)

2. <lookup-key>

3. <columns>

4. <dataset>

変換の要素

表13-5に、変換の要素を示します。

表13-5 変換の要素

タグ

説明

必須属性

オプションの属性

内容

<translation>

変換に関連する一般的な情報が含まれます。

サポート対象外

サポート対象外

0(ゼロ)個以上の<target>要素と0(ゼロ)個以上の<restype>要素

<target>

この文書の変換に使用する言語を指定します。

サポート対象外

サポート対象外

[IETFRFC1766]で定義された言語識別子

<restype>

リソースのタイプを宣言します。

name

expansion

空要素

検索キーの要素

表13-6に、検索キーの要素を示します。

表13-6 検索キーの要素

タグ

説明

必須属性

オプションの属性

内容

<lookup-key>

TransXが行を単一行と認識するか、重複行と認識するかの基になる<column>要素が含まれます。

name

サポート対象外

0(ゼロ)個以上の<column>要素

<column>

<lookup-key>要素の下の<column>要素は、行が単一行であるか、重複行であるかの識別に使用する列を示します。指定された列に同じ値の列が複数あれば、その他の列の値に関係なく、列は重複しているとみなされます。検索キー<column>は、<dataset>セクションの<col>に対応するか、<columns>セクションに定数式または<query>で<column>として宣言する必要があります。

name

サポート対象外

空要素

メタデータ要素

表13-7に、メタデータ要素を示します。

表13-7 メタデータ要素

タグ

説明

必須属性

オプションの属性

内容

<columns>

ロードするデータに関する情報が含まれます。

サポート対象外

サポート対象外

1つ以上の<column>要素

<column>

<dataset>要素の下の<col>要素に対応する列を指定します。<column>を定義したら、列にsequence、constant、queryのいずれかの属性が存在する場合を除き、対応する<col>要素をすべての<row>に表示する必要があります。

name、type(順序は任意)

推奨される順序は、name、type、オプションの属性の順です。

translate、constant、sequence、virtual、useforupdate、maxsize、size-unit、restype(順序は任意)

0(ゼロ)または1つの<query>要素または<sql>要素

<query>

SQL問合せを指定します。その結果はこの要素が属する列への入力に使用されます。

text

サポート対象外

0(ゼロ)個以上の<parameter>要素

<sql>

SQL文を指定します。結果があれば、この要素が属する列への入力にその結果が使用されます。

text

サポート対象外

0(ゼロ)個以上の<parameter>要素

<parameter>

<query>要素のパラメータを指定します。

idと、colまたはconstantのいずれか。

colを指定する場合、参照される列にquery、constant、sequenceの各属性を使用できません。

translate、trans-key

空

データ要素

表13-8に、データ要素を示します。

表13-8 データ要素

タグ

説明

必須属性

オプションの属性

内容

<dataset>

データベースにロードするデータが含まれます。

サポート対象外

サポート対象外

1つ以上の<row>要素

<row>

<dataset>要素にロードするデータに関する情報が含まれます。

サポート対象外

サポート対象外

0(ゼロ)個以上の<col>要素

<col>

データベースの列にロードするデータ(または、仮想列の場合は、データベース列にロードする実データの取得に使用するデータ・ピース)のインスタンスを指定します。

name

trans-key

アプリケーションで使用するデータ

DLFの属性

この項では、DLF要素の各種属性を示します。指定できる属性は各要素に1つのみです。一部の属性には推奨される属性値があります。推奨される属性の値には大/小文字の区別があります。

表13-9 属性

属性のタイプ

属性

DLFの属性

name、type、translate、constant、sequence、virtual、useforupdate、maxsize、size-unit、restype、text、id、col、trans-key、translation-note、normalize-langtag

XML名前空間の属性

xml:space

DLFの属性

表13-10に、DLF属性を示します。

表13-10 DLF属性

属性

説明

値の説明

デフォルト値

この属性を使用する要素

lang

文書の言語を指定します。

これはxml:lang属性と同等です。

この属性の値は[IETFRFC4646]で定義される言語識別子です。

この属性はデータ・ロード操作に影響しません。

なし。存在しない場合は"en"とみなされます。

<表>

normalize-langtag

言語タグの大文字/小文字をどのように正規化するかを指定します。

"none、standard、uppercase、lowercaseのいずれか

それぞれの説明を次に示します。

none: 正規化なし。DLFの言語列の値がそのまま使用されます。

standard: 標準により推奨されているスタイル。

* 2文字の言語コードは小文字

* 2文字の国名コードは大文字

* 4文字のスクリプト・コードは単語の最初の文字を大文字

* その他は小文字

uppercase: すべて大文字

lowercase: すべて小文字

なし

<表>

space

空白(ASCIIのスペース、タブ、改行)の処理方法を指定します。

"default"または"preserve"

値"default"は、アプリケーションのデフォルトの空白処理モードが適用されることを示します。値"preserve"は、アプリケーションですべての空白が保持されることを示します。この属性をルート表要素で宣言すると、ドキュメント全体のすべての文字列データ要素が適用対象とみなされます。列レベルで宣言すると、各行の指定された列が適用対象とみなされます。この属性をdatasetセクションで宣言すると、直接のテキスト・データのみが適用対象になります。ドキュメント・レベルまたは列レベルで宣言すると、space属性の別のインスタンスでオーバーライドされる場合があります。

"default"

<table>、<column>、<col>

name

オブジェクト名(table、column、restypeなど)を指定します。

文字列: <table>要素の場合はデータベース表名、<column>または<col>要素の場合は列名です。

適用外

<table>、<column>、<col>

type

データセットの列のデータ型。この属性は、データセットの<col>要素に含まれるテキストの種類を指定します。このデータ型に応じて、TransXで適用されるデータ処理方法は異なります。

XSUおよびJDBCで暗黙的なデータ型変換が行われるため、TransXではこのデータ型情報に基づく独自の解析は行われません。この属性を使用して、date型またはdateTime型の列に対して適切なJavaの中間データ型が選択されます。この場合、標準の日付書式が受け入れられます。

文字列: 有効値は"number"、"string"、"date"、"dateTime"または"binary"です。

現行のロケールに関係なく、数値型の値の字句表示をSQL言語の構文に指定する必要があります。このSQL構文では、桁区切り記号(通常はカンマ)を使用せず、小数点区切り記号(通常はドット)を使用します。バイナリ・データ型の場合、colタグで囲まれたテキスト・フィールドに指定されたデータの値は、実際のバイナリ・データが格納されたファイルの名前を示します。RAWデータをテキスト・フィールドに埋め込むことはできません。その他のデータ型(string、dateおよびdateTime)の表示は、対応するXMLスキーマ仕様のデータ型で制約されます。簡素化のため、DLFで受け入れられるXMLスキーマの標準日付書式は、"CCYY-MM-DDThh:mm:ss" (dateTime)または"CCYY-MM-DD" (date)のみとなります。その他の日付書式は認識されません。

TransXでは、この属性を次の用途で使用します。

- 仮想列を問合せのパラメータにバインドする

- 問合せの結果を対応する列にバインドする

適用外

<column>

translate

この列のテキストまたはパラメータを変換するかどうかを示します。

"yes"または"no"のいずれか。

"no"

<column>、<parameter>

constant

この列またはパラメータの定数値を指定します。

各行のこの列の値。

適用外

<column>、<parameter>

language

この列の言語識別子を指定します。

言語識別子またはプレースホルダ。「%x」はルート表要素のxml:lang属性から値を取得します。

適用外

<column>

sequence

この列に値を入力するために使用されるデータベース内の順序を指定します。

文字列: データベースの順序名。

適用外

<column>

virtual

この列に、別のデータの構成に使用するデータが指定されていることを示します。このデータがデータベースにロードされます。仮想列はデータベースに存在しません。これは通常、パラメータの値を問合せに指定するために使用します。仮想列を参照キー列にすることはできません。問合せを使用した仮想列では、結果は破棄されます。

"yes"または"no"のいずれか。

"no"

<column>

useforupdate

シード・データをアップロードするときに、この列の値を更新に使用するかどうかを示します。この属性が適用されるのは、TransXが重複行を更新するモードになっている場合のみです。仮想列でこの属性をyesに設定することはできません。

"yes"または"no"のいずれか。この属性を"no"に設定すると、更新操作後も列の値は変わりません。

"yes"

<column>

maxsize

この列のデータの最大サイズを指定します。

size-unit属性で指定した単位の数値。この属性を設定し、size-unitを設定しない場合、サイズは文字と解釈されます。

サポート対象外

<column>

size-unit

maxsize属性で指定したサイズの単位を指定します。

単位。推奨される値は、文字の場合は"char"、バイトの場合は"byte"です。

追加文字がある場合、2つの"char"単位を指定します。

"char"

<column>

restype

この列に取得されるデータのタイプを指定します。

リソース・タイプ。値は<restype>要素の名前と一致している必要があります。

サポート対象外

<column>

expansion

このリソース・タイプに対して、変換された文字列の長さの延長を許可する最大サイズを指定します。

増加率(パーセント)を表す数値。

0%

<restype>

text

問合せが属する列に入力する値を取得するためのSQL問合せ文を指定します。

SQL文。識別子の前にコロンを付けて、0(ゼロ)個以上のパラメータを指定できます。単一の値が1行で戻されます。余分な結果は破棄されます。

適用外

<query>

id

SQL問合せ文に使用するプレースホルダをパラメータで指定します。兄弟関係のcol属性で指定された列の値が問合せのパラメータとして関連付けられます。

文字列: 親のquery要素のtext属性に表示される識別子。

空の文字列

<parameter>

col

兄弟関係のid属性で指定された問合せのプレースホルダに関連付ける列を指定します。

文字列: 列名。この属性の一部となる列以外の列を指定する必要があります。

適用外

<parameter>

trans-key

変換のキーを指定します。

文字列: 変換キー。値は変換ドメイン内で一意である必要があります。

適用外

<col>、<parameter>

translation-note

変換の注意を指定します。

文字列: 変換の注意。

適用外

<col>、<column>、<parameter>

XML名前空間の属性

表13-11に、XML名前空間の属性を示します。

表13-11 XML名前空間の属性

属性

説明

値の説明

デフォルト値

この属性を使用する要素

xml:space

空白(ASCIIのスペース、タブ、改行)の処理方法を指定します。

"default"または"preserve"

値"default"は、この要素に対してアプリケーションのデフォルトの空白処理モードが適用されることを示します。値"preserve"は、アプリケーションですべての空白が保持されることを示します。xml:space属性の別のインスタンスでオーバーライドしないかぎり、この属性を指定した要素のコンテンツ内のすべての要素が適用対象とみなされます。

"default"

サポート対象外

xml:lang

コンテンツの言語を指定します。

RFC 4646で定義されている言語タグ。

適用外

table

DLFの例

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

- 最小のDLFドキュメント

- 一般的なDLFドキュメント

- ローカライズしたDLFドキュメント

最小のDLFドキュメント

例13-2 に、最小のDLFドキュメントを示します。

例13-2 最小のDLFドキュメント

<?xml version="1.0" ?>
<table name="dual">
<lookup-key/>
<columns>
<column name="DUMMY" type="string">
</columns>
<dataset>
<row>
<col name="DUMMY">X</col>
</row>
</dataset>
</table>

一般的なDLFドキュメント

例13-3に、CLK_STATUS_L表のシード・データを含むDLFドキュメントのサンプルを示します。

例13-3 サンプルDLF文書

<!--
- $Header: $
-
- Copyright (c) 2001 Oracle Corporation. All Rights Reserved.
-
- NAME
-   status.xml - Seed file for the CLK_STATUS_L table
-
- DESCRIPTION
-   This file contains seed data for the Status level table.
-
- NOTES
-
- MODIFIED   (MM/DD/YY)
-   dchiba    06/11/01 - Adaption to enhancements of data loading tool
-   dchiba    05/23/01 - Adaption to generic data loading tool
-   rbolsius  05/07/01 - Created
-->

<table name="clk_status_l" xml:space="preserve">
<lookup-key>
<!--column name="status_id" /-->
<column name="status_code" />
</lookup-key>

<columns>
<column name="status_id"          type="number" sequence="clk_status_seq" useforupdate="no"/>
<column name="status_code"        type="number" />
<column name="status_name"        type="string" translate="yes" />
<column name="status_description" type="string" translate="yes" />
<column name="version_created"    type="number" constant="0" />
<column name="version_updated"    type="number" constant="0" />
<column name="status_type_code"   type="string" virtual="yes" />
<column name="status_type_id"     type="number" >
<query text="select status_type_id from clk_status_type_l where status_type_code = :1" >
<parameter id="1" col="status_type_code" />
</query>
</column>
</columns>

<dataset>

<row>
<col name="status_code" >100</col>
<col name="status_name" trans-key="stts-name-1" >Continue</col>
<col name="status_description" trans-key="stts-desc-1" >
The client should continue with its request.</col>
<col name="status_type_code" >INFO</col>
</row>

<row>
<col name="status_code" >101</col>
<col name="status_name" trans-key="stts-name-2" >Switching Protocols</col>
<col name="status_description" trans-key="stts-desc-2" >
The server understands and is willing to comply with the client''s
request (via the Upgrade message header field) for a change in the
application protocol being used on this connection.</col>
<col name="status_type_code" >INFO</col>
</row>

<row>
<col name="status_code" >200</col>
<col name="status_name" trans-key="stts-name-3" >OK</col>
<col name="status_description" trans-key="stts-desc-3" >
The request has succeeded.</col>
<col name="status_type_code" >SUCCESS</col>
</row>

<row>
<col name="status_code" >201</col>
<col name="status_name" trans-key="stts-name-4" >Created</col>
<col name="status_description" trans-key="stts-desc-4" >
The request has been fulfilled and resulted in a new resource being
created.</col>
<col name="status_type_code" >SUCCESS</col>
</row>

<row>
<col name="status_code" >202</col>
<col name="status_name" trans-key="stts-name-5" >Accepted</col>
<col name="status_description" trans-key="stts-desc-5" >
The request has been accepted for processing, but the processing has
not been completed.</col>
<col name="status_type_code" >SUCCESS</col>
</row>

<row>
<col name="status_code" >203</col>
<col name="status_name" trans-key="stts-name-6" >Non-Authoritative Information</col>
<col name="status_description" trans-key="stts-desc-6" >
The returned metainformation in the entity-header is not the
definitive set as available from the origin server, but is gathered
from a local or a third-party copy.</col>
<col name="status_type_code" >SUCCESS</col>
</row>

<row>
<col name="status_code" >204</col>
<col name="status_name" trans-key="stts-name-7" >No Content</col>
<col name="status_description" trans-key="stts-desc-7" >
The server has fulfilled the request but does not need to return an
entity-body, and might want to return updated metainformation.</col>
<col name="status_type_code" >SUCCESS</col>
</row>

<!-- ... -->

</dataset>
</table>

ローカライズしたDLFドキュメント

例13-4に、要素および属性のローカライゼーションの例を示します。

例13-4 DLFのローカライゼーション

<?xml version="1.0"?>
<table name="table_name" xml:lang="en" xml:space="preserve">

<translation>
<target>ar</target>
<target>bs</target>
<target>es</target>
<restype name="alt" expansion="50%"/>
<restype name="foo" expansion="50%"/>
<restype name="bar" expansion="30%"/>
</translation>

<lookup-key><column name="resid" /></lookup-key>

<columns>
<column name="resid" type="number" sequence="seq_foo" useforupdate="no"/>
<column name="image" type="binary"/>
<column name="alt_text" type="string" translate="yes" maxsize="30"
size-unit="byte" restype="alt"/>

</columns>

<dataset>
<col name="image">foo1.gif</col>
<col name="alt_text">Hello world</col>
</dataset>

</table>

DLFの参照

詳細は、次の情報を参照してください。

[IETFRFC4646] Tags for the Identification of Languages
http://www.ietf.org/rfc/rfc4646

14 XSQLページ・パブリッシング・フレームワークの使用

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

- XSQLページ・パブリッシング・フレームワークの概要

- XSQLページ・パブリッシング・フレームワークの使用: 概要

- XSQLサーブレットでのXMLの生成および変換

- JavaプログラムでのXSQLの使用

- XSQLページのヒントと使用方法

XSQLページ・パブリッシング・フレームワークの概要

Oracle XSQLページ・パブリッシング・フレームワークは、XMLを複数の形式で公開できる拡張可能なプラットフォームです。このフレームワークの中心となるJavaベースのXSQLサーブレットは、リレーショナル・データに基づく動的Webコンテンツを動的に公開するための宣言インタフェースです。

XSQLフレームワークはSQL、XML、XSLTの機能を組み合せたものです。このフレームワークでXSQLページと呼ばれる宣言テンプレートを作成して、次の操作を行うことができます。

- パラメータ化されたSQL問合せに基づいて、動的XMLデータグラムを作成します。

- XSLTを使用してデータグラムを変換し、XML、HTMLまたはテキストベース形式の文書を生成します。

XSQLページとは、XSQLサーブレットの命令が記述されたXMLファイルであり、デフォルト拡張子が.xsqlであることからこのように名付けられています。例14-1に、単純なXSQLページを示します。アクション・ハンドラ要素<xsql:query>を使用して、hr.employees表に問合せを行います。

例14-1 サンプルXSQLページ

<?xml version="1.0">
<?xml-stylesheet type="text/xsl" href="emplist.xsl"?>
<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql">
SELECT * FROM employees
</xsql:query>

ブラウザ・クライアントに例14-1の問合せで戻されたデータを表示できます。公開する情報の作成および変換には、プログラミングは必要ありません。多くの操作を宣言方式で実行できます。ただし、いずれかの組込み機能が要件に合わない場合は、Javaを使用してカスタム情報ソースを統合したり、サーバー側でカスタム処理を実行できます。

XSQLページ・フレームワークでは、公開する情報の作成工程と表示工程を分離できます。このアーキテクチャには次のメリットがあります。

- リクエストの発信元であるクライアント・デバイス(ブラウザ、携帯電話、PDAなど)の種類に合せて適切に表示を調整するなど、同じ情報を複数の方法で表示できます。

- 既存のページを新しいページに集計して、情報を簡単に再利用できます。

- コンテンツを変更することなく、表示を修正および改善できます。

前提条件

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

- Oracle Database SQL: XSQLフレームワークでは、データベースのデータにアクセスします。

- PL/SQL: XDKには、Java APIをミラー化するXSU用のPL/SQL APIがあります。

- Java Database Connectivity (JDBC): XSQLページ・フレームワークでは、データベース接続にJDBCドライバを使用します。

- eXtensible Stylesheet Language Transformation (XSLT): XSLTでデータを適切な形式に変換してユーザーに提供できます。

- XML SQL Utility (XSU): XSQLページ・フレームワークでは、データベースの問合せにXSUを使用します。

XSQLページ・パブリッシング・フレームワークの使用: 概要

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

- XSQLページ・フレームワークの使用: 基本プロセス

- XSQLページ・フレームワークの設定

- XSQLページのデモ・プログラムの実行

- XSQLページ・コマンドライン・ユーティリティの使用

XSQLページ・フレームワークの使用: 基本プロセス

XSQL Page Processor Engineは、XSQLページのコンテンツを解析、キャッシュおよび処理します。図14-1に、XSQLページ・パブリッシング・フレームワークの基本アーキテクチャを示します。XSQL Page Processorにアクセスするには、次のエントリ・ポイントがあります。

- XSQLコマンドライン・ユーティリティを使用して、コマンドラインから、またはバッチ・モードで実行します。oracle.xml.xsql.XSQLCommandLineクラスはコマンドライン・インタフェースです。

- 任意のWebサーバーにインストールしたXSQLサーブレットを使用して、Web上で実行します。oracle.xml.xsql.XSQLServletクラスはサーブレット・インタフェースです。

- <jsp:include>を使用してテンプレートを挿入するか、<jsp:forward>を使用してテンプレートを転送し、JSPアプリケーションの一部として実行します。

- oracle.xml.xsql.XSQLRequest Javaクラスを使用して、プログラム的に実行します。

図14-1 XSQLページ・フレームワークのアーキテクチャ

同一のXSQLページを図14-1に示すアクセス・ポイントのいずれかから実行できます。どの方法を選択しても、XSQL Page Processorでは次の処理が行われ、結果が生成されます。

1. XSQLページの処理リクエストを受信します。リクエストはコマンドライン・ユーティリティから送信されるか、XSQLRequestオブジェクトを使用してプログラム的に送信されます。

2. 1つ以上のSQL問合せの結果を使用して、XMLデータグラムを作成します。問合せはXSQLページの<xsql:query>要素に指定します。

3. このXMLデータグラムをリクエスタに戻します。

4. オプションで、データグラムをXML、HTMLまたは他のテキスト形式に変換します。

図14-2に、WebサーバーがPage.xsqlのHTTPリクエストを受信する一般的なWebベースの使用例を示します。このリクエストには、Style.xslというXSLTスタイルシートへの参照が含まれています。このXSQLページにはデータベースへの問合せも含まれます。

図14-2 XSQLページへのWebアクセス

図14-2に示すXSQLページでは、次の手順が実行されます。

1. XSQLサーブレットからのリクエストを受信し、Page.xsqlを処理します。

2. Oracle XML ParserでPage.xsqlを解析してキャッシュします。

3. ドキュメント要素の接続属性の値に基づいてデータベースに接続します。

4. 各XSQLアクション・ハンドラ要素(<xsql:query>など)を組込みアクション・ハンドラによって戻されたXML結果に変更して、XMLデータグラムを生成します。

5. Style.xslスタイルシートを解析してキャッシュします。

6. データグラムとStyle.xslスタイルシートをOracle XSLT Processorに渡してデータグラムを変換します。

7. XMLまたはHTMLの文書をリクエスタに戻します。

この処理の変換手順中に、W3CのXSLT 1.0または2.0標準に準拠するスタイルシートを使用して、作成されたデータグラムを次のようなドキュメント形式に変換できます。

- HTML - ブラウザ表示用

- WML - 無線デバイス用

- Scalable Vector Graphics(SVG)- データ・ドリブン・チャート、グラフおよびダイアグラム用

- eXtensible Stylesheet Language Formatting Object(XSLFO)- Adobe PDF形式へのレンダリング用

- テキスト・ドキュメント(電子メール、SQLスクリプト、Javaプログラムなど)

- 任意のXMLベースのドキュメント形式

XSQLページ・フレームワークの設定

XSQLページは、様々な方法で開発し、様々な用途に使用できます。この項の内容は次のとおりです。

- Oracle JDeveloperでのXSQLページの作成およびテスト

- XSQLページのCLASSPATHの設定

- XSQLサーブレット・コンテナの構成

- 接続定義の設定

Oracle JDeveloperでのXSQLページの作成およびテスト

XSQLページを処理する最も簡単な方法は、Oracle JDeveloper 10gを使用することです。このIDEでは次の機能がサポートされています。

- 色分けされた構文ハイライト表示

- XML構文チェック

- 有効なXSQLタグ名や、オートコンプリートのタグ名および属性名を選択するコンテキスト依存のドロップダウン・リスト

- XSQLページのデプロイとテスト

- デバッグ・ツール

- XSQLアクション作成ウィザード

XSQLページをOracle JDeveloper 10gプロジェクトで作成するには、次の手順を実行します。

1. プロジェクトを作成するか、既存プロジェクトを開きます。

2. 「ファイル」→「新規」を選択します。

3. 「新規ギャラリ」ダイアログ・ボックスで「一般」カテゴリを選択し、「XML」を選択します。

4. 「項目」ウィンドウでXSQLページを選択し、「OK」をクリックします。JDeveloperで新しいXSQLページのタブが中央のウィンドウにロードされます。

<xsql:query>などのXSQLアクション・ハンドラ要素をXSQLページに追加するには、新しい要素を挿入する位置にカーソルを置き、コンポーネント・パレットの項目をクリックします。ウィザードが開いたら、そこに示された手順に従って、使用するXSQLアクションおよび必要な属性を選択します。

XSQLページの構文をチェックするには、対象ページにカーソルを置き、「XML構文のチェックを右クリックします。XML構文エラーが存在する場合、JDeveloperでそのエラーが表示されます。

XSQLページをテストするには、ナビゲータ内でページを選択し、「実行」を右クリックします。JDeveloperは、XSQLページを実行できるように適切に構成されたローカルのWebサーバーを自動的に起動し、ページをリクエストする適切なURLを指定したデフォルトのブラウザを起動してそのページをテストします。XSQLページを実行した後、引き続きIDEでそのページ(およびそのページが関連付けられているすべてのXSLTスタイルシート)に変更を加えることができます。IDEでファイルを保存した後、すぐにブラウザで再表示して反映された変更を確認できます。

CLASSPATHが適切に設定されるように、XSQLランタイム・ライブラリをプロジェクトのライブラリ・リストに追加する必要があります。IDEでは、ユーザーが「新規ギャラリ」ダイアログ・ボックスを使用して新しいXSQLページを作成するときに自動的にこのエントリを追加しますが、次の方法によりエントリを手動でプロジェクトに追加することもできます。

1. アプリケーション・ナビゲータでプロジェクトを右クリックします。

2. 「プロジェクト・プロパティ」を選択します。

3. ナビゲーション・ツリーで「プロファイル」→「ライブラリ」を選択します。

4. XSQL Runtimeを「使用可能なライブラリ」ペインから「選択済のライブラリ」に移動します。

XSQLページのCLASSPATHの設定

JDeveloper以外の環境では、XSQL Page Processor Engineが適切に構成されていることを確認する必要があります。

XSQLページを処理するJVMのCLASSPATHに、適切なjarファイルが含まれていることを確認します。XDK JARファイルの詳細は、表3-1「XDKコンポーネントのJavaライブラリ」を参照してください。XSQLフレームワークには、次のJARファイルが含まれます。

- xml.jar(XSQL Page Processor)

- xmlparserv2.jar(Oracle XML Parser)

- xsu12.jar(Oracle XML SQL Utility)(XSU)

- ojdbc5.jarまたはojdbc6.jar(Oracle JDBC Driver)

注意:
XSQLサーブレットはJDBCをサポートするすべてのデータベースに接続できます。XSQL構成ファイルの接続定義に適切なJDBCドライバ・クラスと接続URLを指定してください。ただし、オブジェクト・リレーショナル機能は、OracleをOracle JDBC Driverとともに使用する場合にのみ機能します。

また、「Java XDK環境の設定」の説明に従ってCLASSPATHを構成している場合は、構成ファイルが格納されているXSQLページをディレクトリに追加するだけで済みます。XDKのデータベース・インストールのXSQLConfig.xmlのディレクトリは$ORACLE_HOME/xdk/adminです。

Windowsの%CLASSPATH%変数には、次のエントリを指定する必要があります。

%ORACLE_HOME%\lib\ojdbc5.jar;%ORACLE_HOME%\lib\xmlparserv2.jar;
%ORACLE_HOME%\lib\xsu12.jar;C:\xsql\lib\xml.jar;%ORACLE_HOME%\xdk\admin

UNIXの$CLASSPATH変数には、次のエントリを指定する必要があります。

$ORACLE_HOME/lib/ojdbc5.jar:$ORACLE_HOME/lib/xmlparserv2.jar:
$ORACLE_HOME/lib/xsu12.jar:$ORACLE_HOME/lib/xml.jar:$ORACLE_HOME\xdk\admin

注意:
XSQLページをJ2EE WARファイルでデプロイする場合、XSQL jarファイルをWARファイルの./WEB-INF/libディレクトリに配置できます。

XSQLサーブレット・コンテナの構成

XSQLサーブレットは、OC4JやJakarta Tomcatなどの多様なWebサーバーにインストールできます。サーブレットの詳細なインストール方法については、OTNからダウンロードしたXDKのリリース・ノートを参照してください。

次のように、設定手順にナビゲートします。

1. OTNにログオンし、次のURLにナビゲートします。

http://www.oracle.com/technology/tech/xml/xdk/doc/production10g/readme.html

2. 「Getting Started with XDK Java Components」をクリックします。

3. 「Introduction」項の箇条書きリストでXSQL Servletにスクロール・ダウンし、「Release Notes」をクリックします。

4. 「Contents」項の「Downloading and Installing the XSQL Servlet」をクリックします。

5. 「Setting Up Your Servlet Engine to Run XSQL Pages」項までスクロール・ダウンして、目的のWebサーバーを探します。

接続定義の設定

XSQLページは、XSQL構成ファイルに定義されている接続用の短縮名を使用して、データベース接続を指定します。この構成ファイルのデフォルト名は$ORACLE_HOME/xdk/admin/XSQLConfig.xmlです。

注意:
XSQLページをJ2EE WARファイルでデプロイする場合、XSQLConfig.xmlをWARファイルの./WEB-INF/classesディレクトリに配置できます。

例14-1のサンプルXSQLページには、次の接続情報が含まれます。

<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql">

接続名は、XSQL構成ファイルの<connectiondefs>セクションに定義されています。例14-2に、データベースに付属するサンプル構成ファイルの関連セクションを示します。hr接続は太字で表示されています。

例14-2 XSQLConfig.xmlの接続定義セクション

<connectiondefs>
...
<connection name="hr">
<username>hr</username>
<password>hr_password</password>
<dburl>jdbc:oracle:thin:@localhost:1521:ORCL</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<autocommit>false</autocommit>
</connection>
...
</connectiondefs>

データベース接続ごとに次の要素を指定できます。

- <username>(データベース・ユーザー名)

- <password>(データベース・パスワード)

- <dburl>(JDBC接続文字列)

- <driver>(使用するJDBCドライバの完全修飾クラス名)

- <autocommit>(オプションでAUTOCOMMITをTRUEまたはFALSEに設定)

<autocommit>子要素を指定して、接続のJDBC自動コミットの設定を制御します。<connection>に対して<autocommit>子要素が設定されていない場合、XSQL Connection Managerで自動コミットは設定されません。この場合の設定は、JDBCドライバのデフォルトの自動コミット設定になります。

任意の数の<connection>要素をXSQL構成ファイルに配置して、データベース接続を定義できます。個々のXSQLページは、ページ内の最上位の要素(ドキュメント要素)にconnection="xxx"属性を挿入して、使用する接続を参照します。

注意:
XSQLConfig.xmlファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれているため、データベース・サーバーの安全な場所に格納する必要があります。手順については、「XSQLページのセキュリティ上の注意事項」を参照してください。

XSQLページのデモ・プログラムの実行

XSQLサーブレットのデモ・プログラムは$ORACLE_HOME/xdk/demo/java/xsqlにあります。表14-1に、デモのサブディレクトリとデモの内容を示します。デモの名前の列は、XSQLページとXSQLサーブレットのホームページに表示されているデモ・タイトルを示しています。ホームページのアクセス方法については、「XSQLデモの実行」を参照してください。

表14-1 XSQLサーブレットのデモ

ディレクトリ

デモの名前

説明

home/

XSQL Pages & XSQL Servlet

タブを使用したXSQLデモのホームページと、このページからアクセス可能なオンラインXSQLヘルプを表示するページが含まれます。「XSQLデモの実行」の説明に従って、index.htmlページからXSQLホームページを起動できます。

helloworld/

Hello World Page

最も簡単なXSQLページの例を示します。

emp/

Employee Page

hr.employees表のXMLデータを表示するXSQLページ。XSQLページ・パラメータを使用して、戻される従業員およびデータベースのソートに使用する列を制御します。

関連付けられたXSLTスタイルシートを使用して、フォーム・アクションとしてemp.xsqlページを含むHTMLフォームに結果をフォーマットします。そのため、ユーザーは検索基準を絞り込むことができます。

insclaim/

Insurance Claim Page

豊富な構造のInsurance Claimオブジェクト・ビューに対するサンプル問合せの実例を示します。insclaim.sqlは、INSURANCE_CLAIM_VIEWオブジェクト・ビューを設定し、サンプル・データを移入します。

classerr/

Invalid Classes Page

invalidclasses.xslを使用して、スキーマ内で発生した現在のJavaクラスのコンパイル・エラーの最新リストをフォーマットします。付属のSQLスクリプトは、デモ用のXSQLJavaClassesViewオブジェクト・ビューを設定します。オブジェクト・ビューからのマスター情報/ディテール情報は、サーバー内のinvalidclasses.xslスタイルシートによってHTMLにフォーマットされます。

doyouxml/

Do You XML?Site

XSQLページを使用して単純なデータ・ドリブンのWebサイトを構築する方法を示します。問合せにSQL、XSQLの置換変数を使用し、サイトの形式にXSLTを使用します。

(ステートレスな方法で問合せ結果をページングするための)表示およびスキップするレコード数の制御に、<xsql:query>タグ内のSQL問合せ文の本体と<xsql:query>タグの属性内の両方で置換パラメータを使用した実例を示します。

empdept/

Emp/Dept Object Demo

オブジェクト・ビューを使用して、scott.empやscott.deptなどの2つの既存フラット表からのマスター情報/ディテール情報をグループ化する実例を示します。empdeptobjs.sqlスクリプトが、オブジェクト・ビューを作成します(INSTEAD OF INSERTトリガーも作成し、マスター・ビュー/詳細ビューをxsql:insert-requestの挿入ターゲットとして使用できるようにします)。

empdept.xslスタイルシートは、最上位に余分なxsl:stylesheetまたはxsl:transformのないHTMLページのように見える形式のXSLTスタイルシートの例を示します。これは、リテラル結果要素をスタイルシートとして使用するXSLT 1.0仕様の一部です。生成されたHTMLが、coolcolors.cssファイル内にある、集中化されたHTMLスタイルの情報用のCSSを十分に使用できるように、<link rel="stylesheet">を含むHTMLページを生成する実例も示します。

airport/

Airport Code Validation

3文字の空港コードに基づいて、空港情報のデータグラムを戻します。最初の問合せが行を戻さない場合、代替の問合せとして<xsql:no-rows-query>を使用します。XSQLページは、渡された空港コードの一致検索を試みた後、空港の説明に基づいて、あいまい一致検索を試みます。

airport.htmページは、JavaScriptによってInternet Explorerの組込みDOM機能を使用して、Webページからのairport.xsqlページのXML結果を使用する方法を実例で示します。

Webページ上で3文字の空港コードを入力すると、JavaScriptは、XSQLサーブレットからXMLデータグラムをフェッチします。このデータグラムは入力したコードに対応します。戻り値が、一致するものがなかったことを示す場合、プログラムは、XSQLサーブレットからXMLデータグラム形式で戻された情報に基づいて、一致する可能性があるもののリストを生成します。

airport/

Airport Code Display

Airport Code Validationの例と同じXSQLページを使用して実例を示しますが、ここでは、リクエストでXSLTスタイルシート名を指定します。これによって、空港情報は、未加工のXMLとして戻されるのではなく、HTMLフォームにフォーマットされます。

airport/

Airport Soap Service

空港情報をSOAPサービスとして戻す実例を示します。

adhocsql/

Adhoc Query Visualization

パラメータとして使用するSQL問合せおよびXSLTスタイルシートをサーバーに渡す実例を示します。

document/

XML Document Demo

XML文書をリレーショナル表に挿入する実例を示します。docdemo.sqlスクリプトが、XMLDOCFRAGという、CLOB型の属性を含むユーザー定義型を作成します。

文書のテキストを./xsql/demo/xml99.xmlに挿入し、スタイルシートとしてxml99.xslという名前を指定します。./xsql/demo/JDevRelNotes.xmlにも挿入し、スタイルシートとしてrelnotes.xslという名前を指定します。

docstyle.xsqlページは、クライアントが提供するスタイルシート名を使用して最終出力を変換する前に、doc.xsqlページの出力を独自のページに挿入するためのアクション・ハンドラ要素である<xsql:include-xsql>の例を示します。

デモは、Internet Explorer 5.0のクライアント側XML機能を使用して、文書がサーバーにポストされる前に、その文書が整形式であるかどうかを確認します。

insertxml/

XML Insert Request Demo

クライアントからのXMLをXSQLページにポストする実例を示します。このXSQLページは、<xsql:insert-request>アクション要素を使用して、ポストされたXMLデータをデータベース表に挿入します。このデモは、moreover.comが提供するXMLベースのニュース形式のXML文書を受け入れます。

この場合、XMLをポストするプログラムは、Internet Explorer 5.0およびJavaScriptからXMLHttpRequestオブジェクトを使用するクライアント側のWebページです。insertnewsstory.xsqlページのソースを見ると、このページが表名およびXSLT変換名を指定していることがわかります。moreover-to-newsstory.xslスタイルシートは、受信したXML情報をOracleXMLSaveユーティリティが挿入方法を判断できる正規の形式に変換します。

<article>要素の例を<moreovernews>要素内に数回コピーおよび貼付けして、数個の新しいニュース記事を一度に挿入します。

newsstory.sqlスクリプトは、受信データの処理方法、主キーのデフォルト値などをカスタマイズするために、XSQLページにデータを挿入させる挿入先のデータベース・ビューでINSTEAD OFトリガーを使用する方法を示します。

svg/

Scalable Vector Graphics Demo

deptlist.xsqlページが、SalChart.xsqlページへのハイパーリンクを使用して、単純な部門リストを表示します。SalChart.xsqlページは、パラメータとして渡された特定の部門の従業員を問い合せ、SalChart.xsqlスタイルシートを使用して、問合せの結果をその部門内の従業員の給与を比較する棒グラフのSVGにフォーマットします。

fop/

PDF Demo

emptable.xsqlページが、単純な従業員リストを表示します。emptable.xslスタイルシートは、データ・ページをXSLFOに変換します。XSLFOは、組込みFOPシリアライザと組み合されて、結果をAdobe PDF形式にレンダリングします。

cursor/

Cursor Demo

ネストしたCURSOR式の使用例を示します。これは、デフォルトの<xsql:query>要素で、ネストした要素を生成する3種類の方法のうちの1つです。

actions/

2つのサンプル・カスタム・アクションのソース・コードを示します。

XSQLデモの設定

XSQLデモを設定するには、次の手順を実行します。

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

2. SQL*Plusを起動し、Oracle Textパッケージのスキーマ所有者であるctxsysとしてデータベースに接続して、次のコマンドを発行します。

GRANT EXECUTE ON ctx_ddl TO scott;

3. DBAとしてデータベースに接続し、次のコマンドを発行します。

GRANT QUERY REWRITE TO scott;

これによって、scottは、デモの1つが空港の説明に基づく大/小文字を区別しない問合せを実行するために必要とするファンクション索引を作成できるようになります。

4. scottとしてデータベースに接続します。パスワードの入力を求められます。

5. SQLスクリプトinstall.sqlを現在のディレクトリで実行します。このスクリプトは、すべてのデモ用のすべてのSQLスクリプトを実行します。

@install.sql

1. ディレクトリを./doyouxmlサブディレクトリに変更し、次のコマンドを実行して、Do You XML?デモ用のサンプル・データをインポートします(パスワードの入力を求められます)。

imp scott file=doyouxml.dmp

1. SVGのデモンストレーションを実行するには、Adobe社製のSVG Plug-inなどのSVGプラグインをブラウザにインストールします。

XSQLデモの実行

XSQLデモの起動にはWebブラウザを使用します。「XSQLサーブレット・コンテナの構成」の説明に従ってXSQLサーブレットをWebサーバーに設定している場合は、次のURLからデモを起動できます。yourserverとportは適切な値に変更してください。

http://yourserver:port/xsql/index.html

図14-3に、XSQLホームページのセクションをInternet Explorerで表示した場合を示します。バージョン5以上のブラウザを使用する必要があります。

図14-3 XSQLホームページ

デモはわかりやすく作成されています。「Hello World Page」、「Employee Page」などのデモ・タイトルをクリックし、画面の指示に従います。

XSQLページ・コマンドライン・ユーティリティの使用

動的なページのコンテンツは、頻繁に変更されないデータに基づいていることがほとんどです。Webパブリッシングのパフォーマンスを最適化するには、オペレーティング・システムの機能を使用してXSQLページのオフライン処理をスケジューリングします。これによって、処理結果がWebサーバーによって静的に提供されます。

XDKには、XSQL Page Processorを実行するコマンドラインJavaインタフェースがあります。XSQLコマンドライン・ユーティリティを使用して、任意のXSQLページを処理できます。

$ORACLE_HOME/xdk/bin/xsqlおよび%ORACLE_HOME%\xdk\bin\xsql.batシェル・スクリプトはoracle.xml.xsql.XSQLCommandLineクラスを実行します。クラスを起動する前に、環境が「XSQLページ・フレームワークの設定」の説明に従って構成されていることを確認してください。ユーティリティの起動方法に応じて、構文は次のいずれかになります。

java oracle.xml.xsql.XSQLCommandLine xsqlpage [outfile] [param1=value1 ...]
xsql xsqlpage [outfile] [param1=value1 ...]

outfileを指定した場合、xsqlpageの処理結果がその出力ファイルに書き込まれます。outfileを指定しない場合、結果が標準出力されます。任意の数のパラメータをXSQL Page Processorに渡すことができます。また、リクエストの一部として処理中のXSQLページはそれらのパラメータを参照できます。ただし、次のパラメータ名はコマンドライン・ユーティリティによって認識され、事前定義済の動作を行います。

- xml-stylesheet=stylesheetURL
これは、リクエストに使用するスタイルシートの相対URLまたは絶対URLを指定します。また、文字列noneを指定すると、デバッグ操作のためにXSLTスタイルシートの処理を抑制することもできます。

- posted-xml=XMLDocumentURL
これは、リクエストの一部としてポストされたときと同様に処理するXMLリソースの相対URLまたは絶対URLを指定します。

- useragent=UserAgentString
これは、そのユーザー・エージェント・タイプに適切なスタイルシートがページのコマンドライン処理の一部として選択されるように、コマンドラインから特定のHTTPのユーザー・エージェント文字列をシミュレーションします。

XSQLサーブレットでのXMLの生成および変換

この項では、サーバー側のXSQLページ・テンプレートで実行可能な基本機能について説明します。

- XSQLページの作成

- SQL問合せからのデータグラムの生成

- 別のXML形式へのXMLデータグラムの変換

- 表示用のHTMLへのXMLデータグラムの変換

XSQLページの作成

XSQLページを使用して、XML形式のデータベース情報をWeb上で提供できます。次に、今日JFK空港に到着するすべてのフライトのリアルタイムのXMLデータグラムをOracleから提供する例を示します。例14-3に、AvailableFlightsToday.xsqlファイルのサンプルXSQLページを示します。

例14-3 AvailableFlightsToday.xsql

<?xml version="1.0"?>
<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">
SELECT    Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') AS Due
FROM      FlightSchedule
WHERE     TRUNC(ExpectedTime) = TRUNC(SYSDATE)
AND       Arrived = 'N'
AND       Destination = ?   /* The "?" represents a bind variable bound */
ORDER BY  ExpectedTime      /* to the value of the City parameter.      */
</xsql:query>

このXSQLページは、静的XMLコンテンツとXSQLアクション・ハンドラ要素の組合せを含むXMLファイルです。任意の拡張子を使用可能ですが、XSQLページのデフォルト拡張子は.xsqlです。「XSQLサーブレット・コンテナの構成」で説明している方法に従ってサーブレット・エンジンの構成設定を変更し、別の拡張子を関連付けることができます。サーブレット拡張子のマッピングは、J2EE WARファイルの./WEB-INF/web.xmlファイル内に構成します。

例14-3のXSQLページは次の宣言で始まります。

<?xml version="1.0"?>

XSQLページの最初の、一番外側にある要素はドキュメント要素です。AvailableFlightsToday.xsqlには、静的XML要素は含まれず、単一のXSQLアクション・ハンドラ要素<xsql:query>のみが含まれています。この場合、<xsql:query>要素がドキュメント要素です。例14-3に、最も単純で有用な、単一の問合せを含むXSQLページを示します。XSQLページの<xsql:query>セクションが問合せの結果に置き換えられます。

注意:
第30章「XSQLページ・リファレンス」では、組込みアクション・ハンドラ要素の詳細を説明しています。

<xsql:query>アクション・ハンドラ要素には、名前空間の接頭辞xsqlをOracle XSQL名前空間識別子urn:oracle-xsqlのシノニムとして宣言するxmlns属性が含まれています。

<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">

この要素にも、connection属性が含まれています。この属性の値は、XSQL構成ファイル内にある事前定義済接続の1つの名前です。

<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">

demo接続に使用する、ユーザー名、パスワード、データベースおよびJDBCドライバの詳細は、構成ファイルにすべて記載されます。

ページに複数の問合せを挿入する場合は、独自のXML要素を作成して他の要素をラップする必要があります。例14-4に、その方法を示します。

例14-4 <xsql:query>要素のラップ

<?xml version="1.0"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query bind-params="City">
SELECT   Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') AS Due
FROM     FlightSchedule
WHERE    TRUNC(ExpectedTime) = TRUNC(SYSDATE)
AND      Arrived = 'N'
AND      Destination = ?   /* The ? is a bind variable bound       */
ORDER BY ExpectedTime      /* to the value of the City parameter.  */
</xsql:query>
<!-- Other xsql:query actions can go here inside <page> and </page> -->
</page>

例14-4では、connection属性およびxsql名前空間宣言は常にドキュメント要素に指定されますが、bind-paramsは<xsql:query>アクションに固有です。

バインド・パラメータの使用

例14-3の<xsql:query>要素には、bind-params属性が含まれています。この属性は、リクエスト内のパラメータの値を<xsql:query>タグに含まれるSQL文のバインド変数に関連付けます。SQL文のバインド・パラメータは疑問符で示されます。

SQLバインド変数を使用すると、表30-1「組込みXSQLアクション・ハンドラ要素およびアクション・ハンドラ・クラス」に示されている、SQL文を使用可能なアクションの結果をパラメータ化できます。バインド変数を使用すると、XSQLページ・テンプレートで、リクエストで渡されたパラメータの値に基づいて結果を生成できます。

バインド変数を使用するには、SQLによってバインド変数が許可されている文内の任意の場所に疑問符を挿入します。このアクション・ハンドラ要素のbind-params属性を指定すると、ページ内のSQL文が実行されるたびに、パラメータ値がXSQLエンジンによってバインド変数にバインドされます。

例14-5に、バインド変数をページ・リクエストでcustidパラメータ値にバインドするXSQLページを示します。

例14-5 CustomerPortfolio.xsql

<portfolio connnection="prod" xmlns:xsql="urn:oracle-xsql">
<xsql:query bind-params="custid">
SELECT s.ticker as "Symbol", s.last_traded_price as "Price"
FROM latest_stocks s, customer_portfolio p
WHERE p.customer_id = ?
AND s.ticker = p.ticker
</xsql:query>
</portfolio>

次のようなリクエストで顧客IDパラメータを渡すと、顧客IDが101のXMLデータをリクエストできます。

http://yourserver.com/fin/CustomerPortfolio.xsql?custid=1001

bind-params属性の値は、空白で区切られたパラメータ名のリストです。これらのパラメータ名の左から右への順序は、その値がバインドされるバインド変数の文内での位置を示します。そのため、SQL文内に5つの疑問符がある場合、bind-params属性には空白で区切られた5つのパラメータ名のリストを指定する必要があります。1つのバインド変数が複数回出現し、それに同一のパラメータ値をバインドする必要がある場合は、そのパラメータ名をbind-params属性値の適切な位置に繰り返します。問合せ結果と同数のパラメータ名がbind-params属性に挿入されていない場合は、ページの実行時にエラーが発生します。

変数は、SQL文またはPL/SQLブロックを必要とするすべてのアクションで使用できます。例14-6のページに、この方法を示します。このXSQLページでは、3つのアクション・ハンドラ要素が使用されています。

- <xsql:dml>は、useridCookieをlog_user_hitプロシージャの引数にバインドします。

- <xsql:query>は、パラメータcustidをWHERE句の変数にバインドします。

- <xsql:include-owa>は、パラメータcustidおよびuserCookieをhistorical_dataプロシージャの2つの引数にバインドします。

例14-6 CustomerPortfolio.xsql

<portfolio connnection="prod" xmlns:xsql="urn:oracle-xsql">
<xsql:dml commit="yes" bind-params="useridCookie">
BEGIN log_user_hit(?); END;
</xsql:dml>
<current-prices>
<xsql:query bind-params="custid">
SELECT s.ticker as "Symbol", s.last_traded_price as "Price"
FROM latest_stocks s, customer_portfolio p
WHERE p.customer_id = ?
AND s.ticker = p.ticker
</xsql:query>
</current-prices>
<analysis>
<xsql:include-owa bind-params="custid userCookie">
BEGIN portfolio_analysis.historical_data(?,5 /* years */, ?); END;
</xsql:include-owa>
</analysis>
</portfolio>

字句置換パラメータの使用

すべてのXSQLアクション・ハンドラ要素で、任意の属性の値または含まれるSQL文のテキストを字句置換パラメータに置き換えることができます。これによって、アクションの動作をパラメータ化したり、アクションが実行するSQL文の一部を置き換えることができます。字句置換パラメータは、構文{@ParameterName}を使用して参照されます。

例14-7に、2つの字句置換パラメータの使用方法を示します。<xsql:query>要素の1つのパラメータはパラメータとして渡すことができる行の最大数を指定し、もう1つのパラメータはソートする列のリストを制御します。

例14-7 DevOpenBugs.xsql

<!-- DevOpenBugs.xsql -->
<open-bugs connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query max-rows="{@max}" bind-params="dev prod">
SELECT bugno, abstract, status
FROM   bug_table
WHERE  programmer_assigned = UPPER(?)
AND    product_id          = ?
AND    status < 80
ORDER BY {@orderby}
</xsql:query>
</open-bugs>

例14-7でも2つのバインド・パラメータ、devとprodを使用します。ここでは、製品817に対する開発者smuenchのオープン・エラーを取得することにします。10行のみを取得し、バグ番号順にソートします。パラメータ値を次のように指定して、エラー・リストのXMLをフェッチします。

http://server.com/bug/DevOpenBugs.xsql?dev=smuench&prod=817&max=10&orderby=bugno

次のように、XSQLコマンドライン・ユーティリティでリクエストを実行することもできます。

xsql DevOpenBugs.xsql dev=smuench prod=817 max=10 orderby=bugno

字句パラメータは、XSQLページ接続をパラメータ化したり、ページを処理するためのスタイルシートをパラメータ化する場合にも使用できます。例14-8に、その方法を示します。スタイルシートtest.xsqlとprod.xslとを切り替えるには、名前と値の組合せをsheet=testおよびsheet=prodと指定します。

例14-8 DevOpenBugs.xsql

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="{@sheet}.xsl"?>
<!-- DevOpenBugs.xsql -->
<open-bugs connection="{@conn}" xmlns:xsql="urn:oracle-xsql">
<xsql:query max-rows="{@max}" bind-params="dev prod">
SELECT bugno, abstract, status
FROM bug_table
WHERE programmer_assigned = UPPER(?)
AND product_id          = ?
AND status < 80
ORDER BY {@orderby}
</xsql:query>
</open-bugs>

バインド・パラメータおよび置換パラメータのデフォルト値の指定

バインド変数または置換パラメータのデフォルト値はページで直接指定できます。これによって、リクエスタで各リクエストのすべての値を明示的に渡さなくても、ページをパラメータ化できます。

パラメータのデフォルト値を挿入するには、そのパラメータと同じ名前のXML属性をアクション・ハンドラ要素または任意の祖先クラス要素に追加します。任意のパラメータの値がリクエスト内に挿入されていない場合、XSQL Page Processorは現行のアクション・ハンドラ要素で同じ名前の属性を検索します。検索されなかった場合は、ページのドキュメント要素に到達するまで、現行のアクション・ハンドラ要素の各祖先クラス要素で該当する属性が検索されます。

例14-9のページでは、ページ内の2つの<xsql:query>アクションのmaxパラメータのデフォルト値は10に設定されています。

例14-9 デフォルト値の設定

<example max="10" connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query max-rows="{@max}">SELECT * FROM TABLE1</xsql:query>
<xsql:query max-rows="{@max}">SELECT * FROM TABLE2</xsql:query>
</example>

例14-10のこのページでは、1つ目の問合せではmaxのデフォルト値を5に、2つ目の問合せではmaxのデフォルト値を7に、3つ目の問合せではmaxのデフォルト値を10に指定します。

例14-10 複数のデフォルト値の設定

<example max="10" connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query max="5" max-rows="{@max}">SELECT * FROM TABLE1</xsql:query>
<xsql:query max="7" max-rows="{@max}">SELECT * FROM TABLE2</xsql:query>
<xsql:query max-rows="{@max}">SELECT * FROM TABLE3</xsql:query>
</example>

すべてのデフォルト値は、次の例のようなリクエストでmaxパラメータの値を指定すると、オーバーライドされます。

http://yourserver.com/example.xsql?max=3

バインド変数のデフォルト値を指定する場合も、同じ規則に従います。例14-11に、valパラメータのデフォルト値を10に設定する方法を示します。

例14-11 バインド変数のデフォルト

<example val="10" connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query tag-case="lower" bind-params="val val val">
SELECT ? AS somevalue
FROM DUAL
WHERE ? = ?
</xsql:query>
</example>

例14-11のページをパラメータなしでリクエストすると、次のXMLデータグラムが戻されます。

<example>
<rowset>
<row>
<somevalue>10</somevalue>
</row>
</row>
</example>

または、次のURLを指定してページをリクエストしたとします。

http://yourserver.com/example.xsql?val=3

前述のURLを指定すると、次のデータグラムが戻されます。

<example>
<rowset>
<row>
<somevalue>3</somevalue>
</row>
</row>
</example>

valパラメータのデフォルト値をページから削除するには、val属性を削除します。例14-12に、その方法を示します。

例14-12 デフォルト値なしのバインド変数

<example connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query tag-case="lower" bind-params="val val val">
SELECT ? AS somevalue
FROM DUAL
WHERE ? = ?
</xsql:query>
</example>

名前と値の組合せを指定しないでページのURLリクエストを行うと、次のデータグラムが戻されます。

<example>
<rowset/>
</example>

デフォルト値またはリクエストで指定された値のどちらも設定されていないパラメータにバインドされているバインド変数がNULLにバインドされるため、例14-12のWHERE句は行を戻しません。

XSQL Page Processorによる各種パラメータの処理方法

XSQLページでは、リクエストで指定されるパラメータの他に、ページのプライベート・パラメータを使用できます。ページのプライベート・パラメータの名前および値は、ページ内のアクションが決定します。アクションがbind-params属性または字句パラメータ参照内でparamという名前のパラメータへの参照を検出すると、paramパラメータの値が次の順序で解決されます。

1. paramという名前の、ページのプライベート・パラメータの値(設定されている場合)

2. paramという名前のリクエスト・パラメータの値(指定されている場合)

3. 現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparamという名前の属性によって指定されているデフォルト値

4. 前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列

XSQLサーブレットを使用してHTTP経由で処理されるXSQLページでは、HTTPセッション・レベル変数やHTTP Cookieパラメータを設定して参照することもできます。

XSQLサーブレットを使用して処理されるXSQLページでは、パラメータ値paramは次の順序で解決されます。

1. paramという名前の、ページのプライベート・パラメータの値(設定されている場合)

2. paramという名前のCookieの値(設定されている場合)

3. paramという名前のセッション変数の値(設定されている場合)

4. paramという名前のリクエスト・パラメータの値(指定されている場合)

5. 現行のアクション・ハンドラ要素またはその祖先クラス要素の1つにparamという名前の属性によって指定されているデフォルト値

6. 前述の値が設定されていない場合は、バインド変数に対してはNULL値、および字句パラメータに対しては空の文字列

この解決順序では、ユーザーがリクエストにパラメータ値を指定して、HTTPセッションで設定されている同じ名前のパラメータをオーバーライドすることはできません。また、ブラウザ・セッション中存続するCookieとして設定することもできません。

SQL問合せからのデータグラムの生成

XSQLサーブレットがWebサーバー上に正しくインストールされている場合、次の基本手順でXSQLページにアクセスできます。

1. XSQLファイルをWebサーバーの仮想階層内のディレクトリにコピーします。例14-3に、サンプル・ページAvailableFlightsToday.xsqlを示します。
XSQLページを標準のJ2EE WARファイルでデプロイすることもできます。それには、Oracle JDeveloper 10gを使用してページを開発し、Oracle Application Serverにデプロイします。

2. ページをブラウザにロードします。たとえば、ルートURLがyourcompany.comの場合、Webブラウザで次のURLをリクエストしてAvailableFlightsToday.xsqlページにアクセスできます。

http://yourcompany.com/AvailableFlightsToday.xsql?City=JFK

XSQLページでの問合せの結果は、XSQL Page Processorで自動的にXMLとして生成され、リクエスタに戻されます。このXMLベースのデータグラムは、通常、他のサーバー・プログラムで処理するためにリクエストされます。ただし、Internet Explorerなどのブラウザを使用する場合、図14-4に示すようなXMLでの結果を直接表示できます。

図14-4 XSQLページ(AvailableFlightsToday.xsql)問合せのXML結果

別のXML形式へのXMLデータグラムの変換

図14-4に示す正規の<ROWSET>および<ROW>出力が必要なXML形式ではない場合は、XSLTスタイルシートを任意のXSQLページ・テンプレートと関連付けることができます。また、このXMLデータグラムをサーバー内で変換してからデータを戻すことができます。

他のプログラムとデータを交換する場合は、通常、交換するXML形式を記述するDTDをとり決めておきます。flight-list.dtdの定義が指定され、そのDTDに準拠した形式で到着フライトのリストを生成する必要があるとします。XML Authorityなどのビジュアル・ツールを使用して、図14-5に示すようなflight-list DTDの構造を参照できます。

図14-5 XML Authorityを使用したflight-list.dtdの表示

図14-5は、フライト・リスト用の標準のXML形式が、次の要素を含むことを示します。

- <flight-list>要素は、1つ以上の<flight>要素を含みます。

- <flight>要素には属性airlineおよびnumberがあり、これらの属性には<arrives>要素があります。

- テキストを含む<arrives>要素

例14-13に、XSLTスタイルシートflight-list.xslを示します。このスタイルシートをXSQLページと関連付けると、デフォルト形式である<ROWSET>および<ROW>を、業界標準の<flight-list>および<flight>に変換できます。

例14-13 flight-list.xsl

<!-- XSLT Stylesheet to transform ROWSET/ROW results into flight-list format
-->
<flight-list xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xsl:version="1.0">
<xsl:for-each select="ROWSET/ROW">
<flight airline="{CARRIER}" number="{FLIGHTNUMBER}">
<arrives><xsl:value-of select="DUE"/></arrives>
</flight>
</xsl:for-each>
</flight-list>

このXSLTスタイルシートは、結果として生成されたドキュメント内に、<flight-list>、<flight>、<arrives>などの必要なリテラル要素が生成されているテンプレートです。これらのリテラル要素は、次の操作を可能にするXSLTアクション・ハンドラ要素とともにテンプレート内に配置されます。

- <xsl:for-each>を使用して、ソース・ドキュメント内の一致する要素に対するループを行います。

- <xsl:value-of>を使用して、必要に応じてソース・ドキュメント要素の値をプラグインします。

- {some_parameter}表記法を使用して、ソース・ドキュメント要素の値を属性値にプラグインします。

例14-13のスタイルシートでは、次の項目が最上位の<flight-list>要素に追加されています。

- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
この属性は、xslという名前のXML名前空間を定義し、XSLT仕様を一意に識別するURL文字列を識別します。これは、URLのように見えますが、文字列http://www.w3.org/1999/XSL/Transformを、XSLT 1.0仕様で定義されている要素セット用のグローバル主キーとして考えます。名前空間を定義すると、スタイルシートで<xsl:XXX>アクション・ハンドラ要素を使用し、必要に応じて値をループおよびプラグインできます。

- xsl:version="1.0"
この属性は、ドキュメントをXSLT 1.0スタイルシートとして識別します。version属性は、すべてのXSLTスタイルシートが、妥当であると識別され、XSLTプロセッサによって認識されるために必要です。

例14-3のflight-list.xslスタイルシートとAvailableFlightsToday.xsqlを関連付けるには、<?xml-stylesheet?>命令をページ上部に追加します。例14-14に、その方法を示します。

例14-14 flight-list.xsl

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="flight-list.xsl"?>
<xsql:query connection="demo" bind-params="City" xmlns:xsql="urn:oracle-xsql">
SELECT Carrier, FlightNumber, Origin, TO_CHAR(ExpectedTime,'HH24:MI') AS Due
FROM FlightSchedule
WHERE TRUNC(ExpectedTime) = TRUNC(SYSDATE) AND Arrived = 'N'
AND Destination = ?   /* The ? is a bind variable being bound */
ORDER BY ExpectedTime  /* to the value of the City parameter   */
</xsql:query>

XSLTスタイルシートをXSQLページに関連付けると、リクエスト側プログラムまたはブラウザによって、提供されたflight-list.dtdで指定された形式でXMLを参照できます。図14-6に、サンプル・ブラウザの表示を示します。

図14-6 XML形式のXSQLページ

表示用のHTMLへのXMLデータグラムの変換

同じXMLデータを別のXML形式ではなくHTMLで戻すには、別のXSLTスタイルシートを使用します。たとえば、<flight-list>や<flight>などの要素を生成するのではなく、<table>、<tr>、<td>などのHTML要素を生成するスタイルシートを記述できます。動的に問い合されたデータの結果は、図14-7に示すHTMLページの表示に類似しています。XSQLページは、未加工のXMLデータを戻すのではなく、サーバー側でのXSLTによる変換を使用して、ブラウザに送信するために情報をHTMLとしてフォーマットします。

図14-7 XSLTスタイルシートを使用したHTMLのレンダリング

例14-15のflight-list.xslスタイルシートは、flight-display.xslスタイルシートの構文と同様に、テンプレートのHTMLページの表示に類似しています。これには、<xsl:for-each>、<xsl:value-of>、および<ROWSET>と<ROW>で構成された基礎となるXML問合せ結果の動的な値をプラグインするための{DUE}などの属性値テンプレートが含まれます。

例14-15 flight-display.xsl

<!-- XSLT Stylesheet to transform ROWSET/ROW results into HTML -->
<html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0">
<head><link rel="stylesheet" type="text/css" href="flights.css" /></head>
<body>
<center><table border="0">
<tr><th>Flight</th><th>Arrives</th></tr>
<xsl:for-each select="ROWSET/ROW">
<tr>
<td>
<table border="0" cellspacing="0" cellpadding="4">
<tr>
<td><img align="absmiddle" src="images/{CARRIER}.gif"/></td>
<td width="180">
<xsl:value-of select="CARRIER"/>
<xsl:text> </xsl:text>
<xsl:value-of select="FLIGHTNUMBER"/>
</td>
</tr>
</table>
</td>
<td align="center"><xsl:value-of select="DUE"/></td>
</tr>
</xsl:for-each>
</table></center>
</body>
</html>

注意:
このスタイルシートは、整形式のHTMLを生成します。それぞれの開始タグは適切にクローズされ(<td>…</td>など)、空のタグに、<br/>ではなく空のXML要素構文<br/>が使用されています。

次の機能を組み合せることによって、有益な結果を迅速に得ることができます。

- Oracleデータベースから情報を選択するためのパラメータ化されたSQL文

- 移植可能な中間データ交換形式としての業界標準のXML

- XMLベースのデータグラムを任意のXMLベースまたはHTMLベースの形式に変換するためのXSLT

JavaプログラムでのXSQLの使用

oracle.xml.xsql.XSQLRequestクラスを使用すると、XSQL Page Processorを独自のJavaプログラム内で使用できます。XSQL Java APIを使用するには、次の基本手順に従います。

1. XSQLRequestのインスタンスを作成し、処理するXSQLページを次のいずれかのオブジェクトとしてコンストラクタに渡します。

- ページへのURLを含むString

- ページのURLオブジェクト

- インメモリーのXMLDocument

2. 次のオブジェクト・メソッドのどちらかを起動して、ページを処理します。

- process() - 結果をPrintWriterまたはOutputStreamに書き込む場合

- processToXML() - 結果をXML文書として戻す場合

XSQL構成ファイルの定義に基づいてJDBC接続プーリングを実装する組込みXSQL Connection Managerを使用する場合、コンストラクタに渡す必要があるものはXSQLページのみです。また、オプションでXSQLConnectionManagerFactoryインタフェース用のカスタム実装を渡すこともできます。

XSQLページをインメモリーのXMLDocumentオブジェクトとして渡す機能を使用すると、有効なXSQLページを動的に生成して処理できます。その後、そのページをXSQLエンジンに渡して評価できます。

ページの処理時に、次の追加操作をリクエストの一部として実行できます。

- 一連のパラメータをリクエストに渡す操作。
この操作は、Dictionaryインタフェースを実装する任意のオブジェクトをprocess()メソッドまたはprocessToXML()メソッドに渡すことによって実行できます。パラメータを含むHashTableを渡すことは、一般的な方法の1つです。

- ページがXML文書をポストされたXMLメッセージの本体として処理するように設定する操作。
この操作は、XSQLResquest.setPostedDocument()メソッドで実行できます。

例14-16に、XSQLRequestを使用したページの処理方法を示します。

例14-16 XSQLRequestSampleクラス

import oracle.xml.xsql.XSQLRequest;
import java.util.Hashtable;
import java.io.PrintWriter;
import java.net.URL;
public class XSQLRequestSample {
public static void main( String[] args) throws Exception {
// Construct the URL of the XSQL Page
URL pageUrl = new URL("file:///C:/foo/bar.xsql");
// Construct a new XSQL Page request
XSQLRequest req = new XSQLRequest(pageUrl);
// Set up a Hashtable of named parameters to pass to the request
Hashtable params = new Hashtable(3);
params.put("param1","value1");
params.put("param2","value2");
/* If needed, treat an existing, in-memory XMLDocument as if
** it were posted to the XSQL Page as part of the request
req.setPostedDocument(myXMLDocument);
**
*/
// Process the page, passing the parameters and writing the output
// to standard out.
req.process(params,new PrintWriter(System.out),
new PrintWriter(System.err));
}
}

関連項目:
XSQL Java APIの詳細は、第15章「XSQLページ・パブリッシング・フレームワークの使用: 高度なトピック」を参照してください。

XSQLページのヒントと使用方法

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

- XSQLページの制限事項

- XSQLサーブレットの使用ヒント

- 一般的なXSQL接続エラーの解決

- XSQLページのセキュリティ上の注意事項

XSQLページの制限事項

マルチバイト名を持つHTTPパラメータ(漢字表記の名前を持つパラメータなど)は、<xsql:include-request-params>要素を使用してXSQLページに挿入すると、適切に処理されます。<xsql:query>タグの問合せ文内でマルチバイト名を持つパラメータの参照を試みると、パラメータの値に対して空の文字列が戻されます。

パラメータに非マルチバイト名を使用してください。このパラメータは、引き続きマルチバイト値を持つことができ、このマルチバイト値は正しく処理できます。

XSQLサーブレットの使用ヒント

この項では、XSQLサーブレットのヒントを示します。

- XSQL出力をWMLドキュメントに変換中にDTDを指定する方法

- XSQLページ内の条件のテスト

- 問合せ結果を別の問合せのWHERE句に渡す方法

- 複数値のHTMLフォーム・パラメータを処理する方法

- PL/SQLラッパー・プロシージャを起動してXMLデータグラムを生成する方法

- ポストされたXMLコンテンツへのアクセス

- データベース接続を動的に変更する方法

- 現行のXSQLページから名前を取得する方法

XSQL出力をWMLドキュメントに変換中にDTDを指定する方法

XSQL出力をワイヤレス・アプリケーション用のWMLドキュメントに変換中に、DTDを指定できます。それには、<xsl:output>というXSLTスタイルシートの組込み機能を使用します。次の例に、この方法を示します。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output type="xml" doctype-system="your.dtd"/>
<xsl:template match="/">
</xsl:template>
...
</xsl:stylesheet>

前述のスタイルシートでは、次のコードを含むXML結果が生成されます。"your.dtd"には、任意の有効な絶対URLまたは相対URLを指定できます。

<!DOCTYPE xxxx SYSTEM "your.dtd">

XSQLページ内の条件のテスト

XSQLページにif-thenロジックを使用できます。例14-17に、パラメータ値のテストに基づいて問合せを実行する方法を示します。

例14-17 XSQLページの条件文

<xsql:if-param name="security" equals="admin">
<xsql:query>
SELECT ....
</xsql:query>
</xsq:when>
<xsql:if-param name="security" equals="user">
<xsql:query>
SELECT ....
</xsql:query>
</xsql:if-param>

関連項目:
<xsql:if-param>アクションの詳細は、第30章「XSQLページ・リファレンス」を参照してください。

問合せ結果を別の問合せのWHERE句に渡す方法

1つのXSQLページ内に問合せが2つ存在する場合、ページ・パラメータを使用して、1つ目の問合せのSELECT構文のリスト項目の値を2つ目の問合せで使用できます。例14-18に、その方法を示します。

例14-18 SQL問合せ間で値を渡す方法

<page xmlns:xsql="urn:oracle-xsql" connection="demo">
<!-- Value of page param "xxx" will be first column of first row -->
<xsql:set-page-param name="xxx">
SELECT one FROM table1 WHERE ...
</xsl:set-param-param>
<xsql:query bind-params="xxx">
SELECT col3,col4 FROM table2
WHERE col3 = ?
</xsql:query>
</page>

複数値のHTMLフォーム・パラメータを処理する方法

<input name="choices" type="checkbox">に必要な複数値のHTMLの<form>パラメータを処理できます。パラメータ名でパラメータ配列表記(たとえば、choices[])を使用し、選択したチェック・ボックスからの値の配列を参照します。

ここでは、複数値のパラメータguyを使用するとします。例14-19に示すように、XSQLページにパラメータ配列表記を使用できます。

例14-19 複数値のパラメータの処理

<page xmlns:xsql="urn:oracle-xsql">
<xsql:set-page-param name="guy-list" value="{@guy[]}"
treat-list-as-array="yes"/>
<xsql:set-page-param name="quoted-guys" value="{@guy[]}"
treat-list-as-array="yes" quote-array-values="yes"/>
<xsql:include-param name="guy-list"/>
<xsql:include-param name="quoted-guys"/>
<xsql:include-param name="guy[]"/>
</page>

このページが、複数値の属性を生成するために同じ名前の複数のパラメータを含む次のURLによってリクエストされたと想定します。

http://yourserver.com/page.xsql?guy=Curly&guy=Larry&guy=Moe

戻されるページは次のように表示されます。

<page>
<guy-list>Curly,Larry,Moe</guy-list>
<quoted-guys>'Curly','Larry','Moe'</quoted-guys>
<guy>
<value>Curly</value>
<value>Larry</value>
<value>Moe</value>
</guy>
</page>

また、例14-20のコードを使用して、複数値のページ・パラメータの値をSQL文のWHERE句に使用することもできます。

例14-20 複数値のページ・パラメータをSQL文に使用する方法

<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:set-page-param name="quoted-guys" value="{@guy[]}"
treat-list-as-array="yes"
quote-array-values="yes"/>
<xsql:query>
SELECT *
FROM   sometable
WHERE  name IN ({@quoted-guys})
</xsql:query>
</page>

PL/SQLラッパー・プロシージャを起動してXMLデータグラムを生成する方法

<xsql:dml>を使用してOUT変数の位置にパラメータ値をバインドしても、パラメータ値を設定できません。バインディングは、INパラメータに対してのみサポートされます。ただし、HTTPパッケージを使用してXML要素を作成するラッパー・プロシージャを作成できます。XSQLページでは、<xsql:include-owa>を使用してそのラッパー・プロシージャを起動できます。

例14-21に、2つのINパラメータを受け取り、これらのパラメータを乗算した結果を1つのOUTパラメータの値に設定し、加算した結果をもう1つのOUTパラメータに設定するPL/SQLプロシージャを示します。

例14-21 addmult PL/SQLプロシージャ

CREATE OR REPLACE PROCEDURE addmult(arg1        NUMBER, arg2        NUMBER,
sumval  OUT NUMBER, prodval OUT NUMBER)
IS
BEGIN
sumval := arg1 + arg2;
prodval := arg1 * arg2;
END;

例14-22のPL/SQLプロシージャを記述して、例14-21のプロシージャをラップできます。addmultwrapperプロシージャでは、前述のaddmultプロシージャに必要なIN引数を受け入れて、OWAページ・バッファに出力するXMLデータグラムとしてOUT値をエンコーディングします。

例14-22 addmultwrapper PL/SQLプロシージャ

CREATE OR REPLACE PROCEDURE addmultwrapper(arg1 NUMBER, arg2 NUMBER)
IS
sumval  NUMBER;
prodval NUMBER;
xml     VARCHAR2(2000);
BEGIN
-- Call the procedure with OUT values
addmult(arg1,arg2,sumval,prodval);
-- Then produce XML that encodes the OUT values
xml := '<addmult>'||
'<sum>'||sumval||'</sum>'||
'<product>'||prodval||'</product>'||
'</addmult>';
-- Print the XML result to the OWA page buffer for return
HTP.P(xml);
END;

例14-23のXSQLページでは、PL/SQLラッパー・プロシージャのコールを追加して、XML文書を作成します。

例14-23 addmult.xsql

<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:include-owa bind-params="arg1 arg2">
BEGIN addmultwrapper(?,?); END;
</xsql:include-owa>
</page>

ここでは、ブラウザに次のようにURLを入力して、addmult.xsqlを起動することにします。

http://yourserver.com/addmult.xsql?arg1=30&arg2=45

サーブレットによって戻されるXMLデータグラムには、OUTの値が次のように反映されます。

<page>
<addmult><sum>75</sum><product>1350</product></addmult>
</page>

ポストされたXMLコンテンツへのアクセス

XSQL Page Processorで、ポストされたXMLのコンテンツを表示できます。XSQLがサポートする機能を使用して、任意のXML文書をポストおよび処理できます。

たとえば、XSQLページでは、<xsql:set-page-param>アクションのxpath="XpathExpression"属性を使用して受信SOAPメッセージのコンテンツにアクセスできます。また、getPageRequest().getPostedDocument()をコールして、カスタム・アクション・ハンドラでSOAPメッセージ本体に直接アクセスすることもできます。クライアントに戻すSOAPレスポンス本体を作成するには、XSLTスタイルシートまたはカスタム・シリアライザの実装を使用して、XMLレスポンスを適切なSOAPエンコーディング形式で書き出します。

関連項目:
Airport SOAPデモに含まれる、XSQLページを使用してSOAPベースのWebサービスを実装する例

データベース接続を動的に変更する方法

XSQLページの起動時にデータベース接続を動的に選択することにします。たとえば、テスト・データベースと本番データベースを切り替える場合があります。このためには、XSQLページのconnection属性にXSQLパラメータを追加します。接続名のデフォルト値に必ず同じ名前の属性を定義してください。

XSQL構成ファイルにデータベースtestdbおよびproddbの接続を定義することにします。そのために、次の<xsql:query>要素を使用してXSQLページを作成します。

<xsql:query conn="testdb" connection="{@conn}" xmlns:xsql="urn:oracle-xsql">
...
</xsql:query>

パラメータを指定せずにこのページをリクエストする場合、connパラメータの値はtestdbとなり、このページはXSQL構成ファイルに定義されたtestdbという接続を使用します。この方法のかわりにconn=proddbを使用してページをリクエストすると、proddbという接続が使用されます。

現行のXSQLページから名前を取得する方法

現行ページへのリンクを作成するために、実行時にXSQLページからそのページの名前にアクセスする、一般的で効率的な方法があります。例14-24のようなヘルパー・メソッドを使用すると、カスタム・アクション・ハンドラ内のページの名前を取得できます。

例14-24 現行のXSQLページから名前を取得する方法

private String curPageName(XSQLPageRequest req) {
String thisPage = req.getSourceDocumentURI();;
int pos = thisPage.lastIndexOf('/');
if (pos >=0) thisPage = thisPage.substring(pos+1);
pos = thisPage.indexOf('?');
if (pos >=0) thisPage = thisPage.substring(0,pos-1);
return thisPage;
}

一般的なXSQL接続エラーの解決

この項では、XSQLエラーに対処するためのヒントを示します。

- 接続不能エラーの原因

- HTTP POST使用時に「処理対象の文書がポストされていません」というエラーが発生する原因

接続不能エラーの原因

データベースに接続できず、helloworld.xsqlサンプル・プログラムの実行中に次のようなエラーが戻されたとします。

Oracle XSQL Servlet Page Processor
XSQL-007: Cannot acquire a database connection to process page.
Connection refused(DESCRIPTION=(TMP=)(VSNNUM=135286784)(ERR=12505)
(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))

前述のエラーは、helloworld.xsqlデモ・ページが変更されていないことを前提に、XSQLサーブレットがdemoという名前の接続の<connectiondef>情報に基づいてJDBC接続を試みていることを示しています。

XSQLConfig.xmlファイルには、デフォルトで次のようなdemo接続のエントリが含まれています(正しいパスワードを使用してください)。

<connection name="demo">
<username>scott</username>
<password>password</password>
<dburl>jdbc:oracle:thin:@localhost:1521:ORCL</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>

次のいずれかが原因でエラーが発生している可能性が高いと考えられます。

- データベースがlocalhostで指定されたローカル・ホスト・マシン上にない。

- データベースのSIDがORCLではない。

- TNSリスナー・ポートが1521ではない。

HTTP POST使用時に「処理対象の文書がポストされていません」というエラーが発生する原因

XML情報を処理するためにXSQLページにポストする場合は、HTTP POSTメソッドで送信する必要があります。この送信は、HTTP POSTによって送信されたHTML形式またはXML文書の影響を受ける可能性があります。HTTP GETを使用すると、ポスト済の文書が存在しないため、「処理対象の文書がポストされていません」というエラーが発生します。正しく動作させるには、HTTP POSTを使用してください。

XSQLページのセキュリティ上の注意事項

この項では、XSQLサーブレットの、推奨されるセキュリティ管理方法について説明します。

- 安全なディレクトリへのXSQL構成ファイルのインストール

- クライアントによるスタイルシートのオーバーライドをデフォルトで不可にする設定

- 置換パラメータの不正使用に対する予防措置

安全なディレクトリへのXSQL構成ファイルのインストール

XSQLConfig.xml構成ファイルには機密事項であるデータベースのユーザー名およびパスワード情報が含まれています。このファイルの格納場所は、Webサーバーの仮想パスにマップされるディレクトリおよびそのサブディレクトリ以外である必要があります。この構成ファイルに必要な権限は、サーブレット・エンジンを所有するUNIXアカウントの読取り権限のみです。この推奨事項に従わない場合、構成ファイルの内容がサイトのユーザーによって参照され、データベース・アカウントのパスワードが取得される可能性が生じます。

クライアントによるスタイルシートのオーバーライドをデフォルトで不可にする設定

XSQL Page Processorのデフォルト設定では、ユーザーが、リクエストで特殊なxml-stylesheetパラメータの値を渡すことによって、スタイルシートを指定できるようになっています。サーバー側のXSQLページ内で参照しているスタイルシートのみを有効なスタイルシートにするには、そのページのドキュメント要素にallow-client-style="no"属性を挿入します。また、XSQLConfig.xmlファイルのデフォルト設定をグローバルに変更し、クライアントによるスタイルシートのオーバーライドを禁止することもできます。どちらの方法を選択しても、クライアントによるスタイルシートのオーバーライドが許可されるのは、ドキュメント要素にallow-client-style="yes"属性が挿入されているページのみとなります。

置換パラメータの不正使用に対する予防措置

特に、SQL問合せにおいて字句置換変数の使用をサポートする製品では、開発者側の問題となる場合があります。SQL文の一部を字句パラメータで置換するXSQLページをデプロイするときは、必ず不正使用に対する予防措置をとる必要があります。

たとえば、XSQLページに付属しているデモの1つにAdhoc Query Demoがあります。このデモでは、<xsql:query>アクション・ハンドラのSQL文全体が、パラメータとしてどのように提供されているかが記述されています。この方法は適正に使用する場合は非常に有用ですが、同じようなページを本番システムにデプロイする場合、ユーザーはこのページに関連付けられている接続に指定されたデータベース・セキュリティ権限の範囲内で任意の問合せを実行できます。たとえば、Adhoc Query Demoは、scottアカウントにマップされた接続を使用するように設定されています。したがって、ユーザーは、scottがSQL*Plusから問合せできる任意のデータを問合せ可能です。

次の方法で、ページの不正使用を防ぐことができます。

- ページに関連付けるデータベース・ユーザー・アカウントには、ユーザーに参照を許可する表およびビューの読取り権限のみを付与します。

- SELECT文で単一の値を置換する場合は、字句バインド変数ではなくバインド変数を使用します。SQL文の構文部分をパラメータ化する必要がある場合にのみ、字句パラメータを使用します。それ以外の場合は、バインド変数を使用することをお薦めします。バインド変数を使用すると、無効な値が渡された場合はエラーが生成され、予想外の結果が生成されることはありません。

15 XSQLページ・パブリッシング・フレームワークの使用: 高度なトピック

この章では、XSQLページに関する次の高度なトピックについて説明します。

- XSQL構成ファイル名のカスタマイズ

- スタイルシートの処理方法の制御

- 配列値パラメータの使用

- 組込みアクションでのエラー・パラメータの設定

- XMLType問合せ結果のXSQLページへの反映

- ポストされたXMLコンテンツの処理

- FOPシリアライザを使用したPDF出力の生成

- XSQLのカスタマイズの実行

XSQL構成ファイル名のカスタマイズ

デフォルトでは、XSQLページ・フレームワークの構成ファイルの名前はXSQLConfig.xmlです。開発用、テスト用、本番用というように、使用する環境に応じてXSQL構成ファイルのバージョンを簡単に切り替えられることができます。XSQL Page Processorで読み取る構成ファイルの名前をオーバーライドするには、Javaシステム・プロパティxsql.configを設定します。

サーブレット初期化パラメータxsql.configを定義することで、-Dxsql.config=MyConfigFile.xmlなどのJVMコマンドライン・フラグを指定するのが最も簡単な方法です。この設定を行うには、次に示すように、XSQLサーブレットを定義する<servlet>タグの一部として<init-param>要素をweb.xmlファイルに追加します。

<servlet>
<servlet-name>XSQL</servlet-name>
<servlet-class>oracle.xml.xsql.XSQLServlet</servlet-class>
<init-param>
<param-name>xsql.config</param-name>
<param-value>MyConfigFile.xml</param-value>
<description>
Please Use MyConfigFile.xml instead of XSQLConfig.xml
</description>
</init-param>
</servlet>

サーブレット初期化パラメータを使用できるのは、XSQLエンジンをサーブレット・ベースで使用する場合のみです。XSQLCommandLineまたはXSQLRequestプログラム・インタフェースを使用する場合は、かわりにSystemパラメータを使用してください。

注意:
構成ファイルは、常にCLASSPATHから読み取られます。たとえば、MyConfigFile.xmlという名前のカスタム構成パラメータ・ファイルを指定すると、XSQL ProcessorはこのXMLファイルをCLASSPATHからのリソースとして読み取ろうとします。したがって、J2EE形式のサーブレット環境では、MyConfigFile.xmlを.\WEB-INF\classesディレクトリ(またはCLASSPATHで検出される最上位ディレクトリ)に格納する必要があります。サーブレット初期化パラメータとSystemパラメータの両方が指定されている場合は、サーブレット初期化パラメータの値が使用されます。

スタイルシートの処理方法の制御

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

- クライアントのスタイルシートでのオーバーライド

- 戻されたドキュメントのコンテンツ・タイプの制御

- スタイルシートの動的割当て

- クライアントでのXSLTスタイルシートの処理

- 複数のスタイルシートの提供

クライアントのスタイルシートでのオーバーライド

リクエスト中の現行のXSQLページが許可する場合、リクエストでXSLTスタイルシートのURLを指定できます。この方法で、デフォルトのスタイルシートをオーバーライドしたり、デフォルトでスタイルシートが適用されない場合にスタイルシートを適用できます。クライアントが起動するスタイルシートURLは、xml-stylesheetパラメータをリクエストの一部として指定することによって、指定されます。このパラメータの有効値は次のとおりです。

- 処理中のXSQLページに対して相対的に解析されるすべての相対URL。

- HTTPプロトコル・スキームを使用し、XSQL構成ファイルの定義に従ってトラステッド・ホストを参照するすべての絶対URL。

- リテラル値none。xml-stylesheet=noneの設定は、開発中、XSLTスタイルシートの処理を一時的に短絡させてスタイルシートが実際に参照しているXMLデータグラムを確認する場合に有用です。この方法は、スタイルシートで期待した結果が生成されない場合の理由確認に使用できます。

クライアントによるXSQLページ用スタイルシートのオーバーライドは、次の方法で行います。

- XSQL構成ファイルでallow-client-style構成パラメータをnoに設定します。

- XSQLページのドキュメント要素に対して、allow-client-style="no"属性を明示的に挿入します。

XSQL構成ファイルでクライアントによるスタイルシートのオーバーライドがデフォルトでグローバルに使用禁止にされている場合でも、すべてのページで、そのページのドキュメント要素に対してallow-client-style="yes"属性を挿入することによって、クライアントによるオーバーライドを明示的に使用可能にできます。

戻されたドキュメントのコンテンツ・タイプの制御

提供するデータのコンテンツ・タイプを設定することにより、リクエスト側クライアントは、戻されたデータを正しく解析できます。スタイルシートで<xsl:output>要素を使用する場合、XSQL Page Processorは、<xsl:output>のmedia-type属性およびencoding属性から、戻されたドキュメントのメディア・タイプおよびエンコーディングを推測します。

例15-1のスタイルシートでは、<xsl:output>に対してmedia-type="application/vnd.ms-excel"属性を使用します。この命令により、hr.employees表に対する標準の問合せを含むXSQLページの結果をMicrosoft Excel形式に変換します。

例15-1 empToExcel.xsl

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" media-type="application/vnd.ms-excel"/>
<xsl:template match="/">
<html>
<table>
<tr><th>Id</th><th>Email</th><th>Salary</th></tr>
<xsl:for-each select="ROWSET/ROW">
<tr>
<td><xsl:value-of select="EMPLOYEE_ID"/></td>
<td><xsl:value-of select="EMAIL"/></td>
<td><xsl:value-of select="SALARY"/></td>
</tr>
</xsl:for-each>
</table>
</html>
</xsl:template>
</xsl:stylesheet>

次のXSQLページでは、例15-1のスタイルシートを使用します。

<?xml version="1.0"?>
<?xml-stylesheet href="empToExcel.xsl" type="text/xsl"?>
<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql">
SELECT   employee_id, email, salary
FROM     employees
ORDER BY salary DESC
</xsql:query>

スタイルシートの動的割当て

<?xml-stylesheet?>処理命令を.xsqlファイルの最上部に挿入すると、XSQL Page Processorは結果として生成されるXMLデータグラムの変換にそれを使用することを検討します。例15-2のemp_test.xsqlページについて考えてみます。

例15-2 emp_test.xsql

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="emp.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query>
SELECT   *
FROM     employees
ORDER BY salary DESC
</xsql:query>
</page>

例15-2のページは、emp.xslスタイルシートを使用して、リクエスタにレスポンスを戻す前にemployees問合せの結果をサーバー層で変換します。このスタイルシートは、<?xml-stylesheet?>処理命令に対するhref擬似属性で指定されるURLによってアクセスされます。

XSLTスタイルシートを、XSQLサーブレットに渡す引数に基づいて動的に変更するとします。これを行うには、次のサンプル命令に示すように、xml-stylesheet処理命令のhref属性に字句パラメータを使用します。

<?xml-stylesheet type="text/xsl" href="{@filename}.xsl"?>

これで、filenameパラメータの値をURLリクエストの一部としてXSQLサーブレットに渡すことができます。

XSQLページの<xsql:set-page-param>要素を使用して、SQL問合せに基づいてパラメータの値を設定することもできます。たとえば、例15-3のXSQLページでは、ページのプライベート・パラメータの値を割り当てることによって、使用するスタイルシートの名前を表から選択します。

例15-3 emp_test_dynamic.xsql

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="{@sheet}.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:set-page-param bind-params="UserCookie" name="sheet">
SELECT stylesheet_name
FROM   user_prefs
WHERE  username = ?
</xsql:set-page-param>
<xsql:query>
SELECT   *
FROM     employees
ORDER BY salary DESC
</xsql:query>
</page>

クライアントでのXSLTスタイルシートの処理

一部のブラウザは、クライアントでのXSLTスタイルシートの処理をサポートします。これらのブラウザは、<?xml-stylesheet?>処理命令を使用して、XML文書用に処理されるスタイルシートを認識します。この目的に<?xml-stylesheet?>を使用することは、1999年6月29日に公開されたW3C勧告「Associating Stylesheets with XML Documents, Version 1.0」の一部です。

デフォルトでは、XSQL Page ProcessorはXSLT変換をサーバーで実行します。ただし、client="yes"をXSQLページの<?xml-stylesheet?>処理命令に追加することにより、クライアントに対するXSLT処理を遅延できます。ドキュメントの最上部に現行の<?xml-stylesheet?>要素が挿入された状態で未加工のXMLデータグラムが提供されます。

複数のスタイルシートの提供

複数の<?xml-stylesheet?>処理命令をXSQLページの最上部に挿入できます。この命令にはオプションのmedia擬似属性を指定できます。media擬似属性に値を指定すると、その値は大/小文字を区別してHTTPヘッダーのユーザー・エージェント文字列の値と比較されます。media擬似属性の値がユーザー・エージェント文字列の一部と一致した場合、プロセッサは現行の<?xml-stylesheet?>処理命令を選択して使用します。一致しなかった場合は、その処理命令を無視して、検索を続けます。ドキュメント内の順序で最初に一致した処理命令が使用されます。media擬似属性がない処理命令は、すべてのユーザー・エージェントと一致します。

例15-4に、XSQLファイルの最上部に複数の処理命令がある場合を示します。処理には、Lynxブラウザの場合はdoyouxml-lynx.xslを、Internet Explorer 5.0または5.5ブラウザの場合はdoyouxml-ie.xslを、および他のすべてのブラウザの場合はdoyouxml.xslを使用します。

例15-4 複数の<?xml-stylesheet?>処理命令

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" media="lynx" href="doyouxml-lynx.xsl" ?>
<?xml-stylesheet type="text/xsl" media="msie 5" href="doyouxml-ie.xsl" ?>
<?xml-stylesheet type="text/xsl" href="doyouxml.xsl" ?>
<page xmlns:xsql="urn:oracle-xsql" connection="demo">

表15-1に、<?xml-stylesheet?>処理命令に対して使用可能な、サポートされる擬似属性の概要を示します。

表15-1 <?xml-stylesheet?>の擬似属性

の擬似属性 " width="100%">

属性名

説明

type = "string"

対応付けられたスタイルシートのMIMEタイプを指定します。XSLTスタイルシートの場合、この属性は文字列text/xslに設定する必要があります。

serializer属性を使用する場合、この属性は、そのシリアライザをコールする前にXSLTスタイルシートを実行する必要があるかどうかによって、存在する場合と存在しない場合があります。

href = "URL"

使用するXSLTスタイルシートへの相対URLまたは絶対URLを指定します。httpプロトコル・スキームを使用する絶対URLを指定する場合は、リソースのIPアドレスがXSQL構成ファイル(デフォルト名XSQLConfig.xml)に示されているトラステッド・ホストである必要があります。

media = "string"

リクエスト側デバイスが送信したHTTPヘッダーのUser-Agent文字列に対する大/小文字を区別しない一致検索を実行します。この属性はオプションです。現行の<?xml-stylesheet?>処理命令は、User-Agent文字列にmedia属性の値が含まれている場合にのみ使用されます。含まれていない場合は、無視されます。

client = "boolean"

yesに設定すると、関連付けられた、クライアントに対するXSLTスタイルシートの処理が遅延します。ドキュメントの最上部に現行の<?xml-stylesheet?>処理命令が挿入された状態で、未加工のXMLデータグラムがクライアントに送信されます。値を指定しない場合、デフォルトでは、変換がサーバーで実行されます。

serializer = "string"

デフォルトでは、XSQL Page Processorは次のシリアライザを使用します。

- XML DOMシリアライザ(XSLTスタイルシートを使用しない場合)

- XSLTプロセッサのシリアライザ(XSLTスタイルシートを使用する場合)

この擬似属性を指定すると、前述のコードのかわりにカスタム・シリアライザの実装を使用する必要があります。

有効値は、XSQL構成ファイルの<serializerdefs>セクションで定義されるカスタム・シリアライザの名前、または文字列java:fully.qualified.Classnameです。XSLTスタイルシートとserializer属性の両方が存在する場合は、まずXSLT変換が実行され、次にカスタム・シリアライザがコールされて最終結果がOutputStreamまたはPrintWriterにレンダリングされます。

配列値パラメータの使用

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

- 配列値パラメータの値のサポート

- 文字列からの配列値ページまたはセッション・パラメータの設定

- SQL文およびPL/SQL文での配列値パラメータのバインド

配列値パラメータの値のサポート

リクエスト・パラメータ、セッション・パラメータおよびページのプライベート・パラメータで、値に文字列の配列を使用できます。パラメータの値を配列として処理するには、パラメータの名前の最後に一対の空の大カッコを追加します。たとえば、productidという名前の入力コントロールが4回出現するHTMLフォームをポストする場合、配列値であるproductidパラメータを参照するにはproductid[]という表記を使用します。配列値パラメータを、配列を示すカッコを付けずに参照すると、XSQLプロセッサにより最初の配列エントリの値が値として使用されます。

注意:
XSQLプロセッサでは、配列を示すカッコ内での数値の使用はサポートされていません。つまり、productidまたはproductid[]を参照することはできますが、productid[2]は参照できません。

アクション・ハンドラ属性値内またはアクション・ハンドラ要素のコンテンツ内のいずれかで、配列値パラメータを字句置換パラメータとして参照するとします。値は配列内での出現順序に従って、配列内でNULL以外の文字列および空以外の文字列のカンマ区切りのリストにXSQLページ・プロセッサにより変換されます。例15-5に、配列値パラメータを使用したXSQLページを示します。

例15-5 XSQLページでの配列値パラメータの使用

<page xmlns:xsql="urn:oracle-xsql">
<xsql:query>
SELECT description
FROM product
WHERE productid in ( {@productid[]} )  /* Using lexical parameter */
</xsql:query>
</page>

XSQLコマンドライン・ユーティリティを起動して、次の方法でPage.xsqlのproductidパラメータに複数の値を指定できます。

xsql Page.xsql productid=111 productid=222 productid=333 productid=444

前述のコマンドで、productid[]配列値パラメータの値を{"111","222","333","444"}に設定します。XSQL Page Processorによって、問合せの{@productid[]}式が文字列"111,222,333,444"に置き換えられます。

複数値のパラメータをプログラムで渡すには、名前付きパラメータのjava.util.Dictionaryを受け入れるXSQLRequest APIを使用します。リクエストにString値パラメータを追加するには、Hashtableを使用し、そのput(name,value)メソッドをコールします。複数値のパラメータを追加する場合は、String型の値ではなくString[]型の値を使用します。

注意:
リクエスト・パラメータ、ページのプライベート・パラメータおよびセッション・パラメータでのみ、文字列配列を使用できます。<xsql:set-stylesheet-param>および<xsql:set-cookie>アクションでは、単一の文字列値であるパラメータのみの使用をサポートしています。XSLTスタイルシートで複数値のパラメータを参照するには、<xsql:include-param>を使用してXSQLデータページに複数値のパラメータを挿入し、次に同じスタイルシート内でXPath式を使用してデータページからの値を参照します。

文字列からの配列値ページまたはセッション・パラメータの設定

次のように、配列を示すカッコを名前に使用することで、ページのプライベート・パラメータまたはセッション・パラメータの値を文字列配列値に設定できます。

<!-- param name contains array brackets -->
<xsql:set-page-param name="names[]" value="Tom Jane Joe"/>

次の例に示すように、セッション・パラメータの値を同様に設定します。

<xsql:set-session-param name="dates[]" value="12-APR-1962 15-JUL-1968"/>

デフォルトでは、パラメータの名前に配列を示すカッコが追加されていると、XSQLプロセッサにより値は空白またはカンマ区切りのリストとして処理され、トークン化されます。

結果として得られる文字列配列値には、これらの区切られたトークンが含まれています。前述の例では、names[]パラメータは文字列配列{"Tom",Jane", "Joe"}で、dates[]パラメータは文字列配列{"12-APR-1962", "15-JUL-1968"}です。

空白を含む文字列を処理するために、トークン化アルゴリズムはまず文字列を調べてカンマが存在するかどうかを確認します。文字列内にカンマが1つ以上見つかった場合は、そのカンマをトークン・デリミタとして使用します。たとえば、次のアクションは、names[]パラメータの値を文字列配列{"Tom Jones", "Jane York"}に設定します。

<!-- param name contains array brackets -->
<xsql:set-page-param name="names[]" value="Tom Jones,Jane York"/>

デフォルトでは、名前の最後に配列を示すカッコがないパラメータを設定すると、文字列のトークン化は実行されません。したがって、次のアクションでは、namesパラメータをリテラル文字列"Tom Jones,Jane York"に設定します。

<!-- param name does NOT contain array brackets -->
<xsql:set-page-param name="names" value="Tom Jones,Jane York"/>

<xsql:set-page-param>アクションまたは<xsql:set-session-param>アクションにtreat-list-as-array="yes"属性を挿入し、文字列を強制的にトークン化することもできます。この属性を設定すると、パラメータにカンマ区切りのトークン化された値の文字列が割り当てられます。たとえば、次のアクションでは、namesパラメータをリテラル文字列"Tom,Jane,Joe"に設定します。

<!-- param name does NOT contain array brackets -->
<xsql:set-page-param name="names" value="Tom Jane Joe"
treat-list-as-array="yes"/>

単一の文字列値パラメータの値を設定し、treat-list-as-array="yes"を使用して値をトークン化するときに、quote-array-values="yes"属性を挿入してカンマ区切りの値を一重引用符で囲むという方法があります。したがって、次のアクションでは、namesパラメータにリテラル文字列値"'Tom Jones','Jane York','Jimmy'"を割り当てます。

<!--  param name does NOT contain array brackets -->
<xsql:set-page-param name="names" value="Tom Jones,Jane York,Jimmy"
treat-list-as-array="yes"
quote-array-values="yes"/>

SQL文およびPL/SQL文での配列値パラメータのバインド

文字列値のスカラー型バインド変数がサポートされているXSQLページでは、配列値パラメータをバインドすることもできます。それには、bind-params属性に指定するパラメータ名のリスト内で配列パラメータ名(たとえば、myparam[])を使用します。この方法で、SQL文およびPL/SQLプロシージャ内で配列値パラメータを処理できます。

配列値パラメータは、XSQL_TABLE_OF_VARCHARという名前のネストした表のオブジェクト型としてバインドされます。このオブジェクト型は、次のDDL文を使用して現行のスキーマ内に作成する必要があります。

CREATE TYPE xsql_table_of_varchar AS TABLE OF VARCHAR2(2000);

型の名前をxsql_table_of_varchar以外に変更することはできませんが、VARCHAR2文字列の次元は必要に応じて変更できます。その場合は、配列値文字列のパラメータを扱う文字列値と同じ長さにする必要があります。

例15-6のPL/SQLファンクションについて考えてみます。

例15-6 testTableFunction

FUNCTION testTableFunction(p_name  XSQL_TABLE_OF_VARCHAR,
p_value XSQL_TABLE_OF_VARCHAR)
RETURN VARCHAR2 IS
lv_ret     VARCHAR2(4000);
lv_numElts INTEGER;
BEGIN
IF p_name IS NOT NULL THEN
lv_numElts := p_name.COUNT;
FOR j IN 1..lv_numElts LOOP
IF (j > 1) THEN
lv_ret := lv_ret||':';
END IF;
lv_ret := lv_ret||p_name(j)||'='||p_value(j);
END LOOP;
END IF;
RETURN lv_ret;
END;

例15-7のXSQLページに、testTableFunctionを使用するSQL文内で、2つの配列値パラメータをバインドする方法を示します。

例15-7 配列値パラメータを使用したXSQLページ

<page xmlns:xsql="urn:oracle-xsql" connection="demo"
someNames="aa,bb,cc" someValues="11,22,33">
<xsql:query bind-params="someNames[] someValues[]">
SELECT testTableFunction(?,?) AS example
FROM dual
</xsql:query>
</page>

例15-7のXSQLページを実行すると、次のデータグラムが生成されます。

<page someNames="aa,bb,cc" someValues="11,22,33">
<ROWSET>
<ROW num="1">
<EXAMPLE>aa=11:bb=22:cc=33</EXAMPLE>
</ROW>
</ROWSET>
</page>

この方法は、配列値パラメータのsomeNames[]およびsomeValues[]が表のコレクション型としてバインドされていることを示します。値が繰り返され、連結された結果、PL/SQLファンクションの戻り値である"aa=11:bb=22:cc=33"文字列値が生成されます。

bind-paramsの文字列に、通常のパラメータと配列値パラメータを必要な数のみ混合して指定することができます。配列としてバインドするパラメータには、配列を示すカッコを追加します。

注意:
前述のXSQL_TABLE_OF_VARCHAR型を作成せずに例15-7のページを実行すると、次のようなエラーが戻されます。

<page someNames="aa,bb,cc" someValues="11,22,33">
<xsql-error code="17074" action="xsql:query">
<statement>
select testTableFunction(?,?) as example from dual
</statement>
<message>
invalid name pattern: SCOTT.XSQL_TABLE_OF_VARCHAR
</message>
</xsql-error>
</page>

配列パラメータはネストされた表のコレクション型としてXSQLプロセッサによりバインドされるため、SQL文内でTABLE()演算子とCAST()演算子を組み合せて使用し、ネストされた表のバインド変数値を値の表として扱うことができます。この表に問合せを行えます。この方法は、副問合せに特に有効です。例15-8のページは、従業員IDを含む配列値パラメータを使用して、行の問合せ先をhr.employeesに制限した例です。

例15-8 配列値パラメータによる行の制限

<page xmlns:xsql="urn:oracle-xsql" connection="hr">
<xsql:set-page-param name="someEmployees[]" value="196,197"/>
<xsql:query bind-params="someEmployees[]">
SELECT first_name||' '||last_name AS name, salary
FROM employees
WHERE employee_id IN (
SELECT * FROM TABLE(CAST( ? AS xsql_table_of_varchar))
)
</xsql:query>
</page>

例15-8のXSQLページを実行すると、次のようなデータグラムが生成されます。

<page>
<ROWSET>
<ROW num="1">
<NAME>Alana Walsh</NAME>
<SALARY>3100</SALARY>
</ROW>
<ROW num="2">
<NAME>Kevin Feeny</NAME>
<SALARY>3000</SALARY>
</ROW>
</ROWSET>
</page>

例15-7および例15-8では、<xsql:query>でのbind-paramsの使用方法を説明しましたが、これらの機能は<xsql:dml>、<xsql:include-owa>、<xsql:ref-cursor-function>、およびSQL文またはPL/SQL文を使用できるその他のアクションでも使用できます。

PL/SQLの索引付き表は、OCI JDBCドライバでは使用できますが、シンJDBCドライバでは使用できません。ネストした表のコレクション型であるXSQL_TABLE_OF_VARCHARを使用すると、配列値パラメータを両方のドライバで使用できます。これにより、PL/SQL内で値の配列を使用するというプログラム上の柔軟性が保たれます。

組込みアクションでのエラー・パラメータの設定

XSQL Page Processorでは、アクションの実行中に、致命的ではないエラーが発生したかどうかが判別されます。たとえば、行の挿入またはストアド・プロシージャのコールがデータベース例外で失敗することがあります。これは、<xsql-error>要素としてXSQLデータページに挿入することができます。

組込みXSQLアクションで致命的でないエラーが報告された場合、そのアクションにページのプライベート・パラメータを設定できます。この機能を有効にするには、アクションでerror-param属性を使用します。たとえば、<xsql:dml>アクション内の文でデータベース・エラーが発生した場合にパラメータ"dml-error"を設定するには、例15-9の方法を使用します。

例15-9 エラー・パラメータの設定

<xsql:dml error-param="dml-error" bind-params="val">
INSERT INTO yourtable(somecol)
VALUES(?)
</xsql:dml>

<xsql:dml>アクションを実行したときにエラーが発生すると、dml-errorという名前のページのプライベート・パラメータが文字列"Error"にXSQLプロセッサにより設定されます。実行が成功した場合、XSQLプロセッサはエラー・パラメータに値を割り当てません。例15-9では、ページのプライベート・パラメータdml-errorがすでに存在する場合、現行の値が維持されます。存在しない場合、このパラメータが出現することはありません。

エラー・パラメータでの条件付きロジックの使用

このエラー・パラメータを<xsql:if-param>と組み合せて使用することで、XSQLページ・テンプレート内で条件付き動作を実行できます。たとえば、XSQL構成ファイル内で、接続demoの接続定義のAUTOCOMMITフラグをfalseに設定したとします。例15-10のXSQLページに、先行するアクションにおいて行った変更を、後続のアクションでエラーが発生した場合にどのようにロールバックするかを示します。

例15-10 エラー・パラメータでの条件付き動作の実行

<!-- NOTE: Connection "demo" must not set to autocommit! -->
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:dml error-param="dml-error" bind-params="val">
INSERT INTO yourtable(somecol)
VALUES(?)
</xsql:dml>
<!-- This second statement will commit if it succeeds -->
<xsql:dml commit="yes" error-param="dml-error" bind-params="val2">
INSERT INTO anothertable(anothercol)
VALUES(?)
</xsql:dml>
<xsql:if-param name="dml-error" exists="yes">
<xsql:dml>
ROLLBACK
</xsql:dml>
</xsql:if-param>
</page>

カスタム・アクション・ハンドラを作成済で、カスタム・アクションがreportMissingAttribute()、reportError()またはreportErrorIncludingStatement()をコールして致命的でないアクション・エラーを通知する場合、この機能も自動的に使用されます。

XSQLアクション・ハンドラ・エラーのフォーマット

XSQLアクション・ハンドラ要素の処理によって発生したエラーは、XML要素として決まった方法で通知されます。そのため、XSLTスタイルシートはエラーの存在を検出し、オプションでそれらをフォーマットして表示できます。

エラーが発生したアクション・ハンドラ要素は、ページ内で次の要素に置き換えられます。

<xsql-error action="xxx">

エラーによっては、<xsql-error>要素に次のものが含まれます。

- ネストした<message>要素

- 違反SQL文を含む<statement>要素

例15-11では、次の情報を使用してエラー情報を画面上に表示するXSLTスタイルシートの例を示します。

例15-11 XSLTスタイルシート

<xsl:if test="//xsql-error">
<table style="background:yellow">
<xsl:for-each select="//xsql-error">
<tr>
<td><b>Action</b></td>
<td><xsl:value-of select="@action"/></td>
</tr>
<tr valign="top">
<td><b>Message</b></td>
<td><xsl:value-of select="message"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:if>

XMLType問合せ結果のXSQLページへの反映

Oracle Databaseでは、XMLベースのデータベース・コンテンツの格納および問合せに、XMLTypeを使用できます。データベースXML機能を使用して、XSQLページに挿入するXMLを生成できます。その方法は次のいずれかです。

- <xsql:query>: XMLType型の列を含む問合せを処理します。ただし、CLOB列およびVARCHAR2列内のXMLマークアップはリテラル・テキストとして処理されます。

- <xsql:include-xml>: 問合せから取得した1つのCLOBまたは文字列ベースのXML文書を解析し、挿入します。

前述の2つの方法には1つの相違点があります。<xsql:include-xml>は、CLOBまたは文字列値内のリテラルXMLを解析し、すぐに要素および属性のツリーとして表現します。これに対し、<xsql:query>は、CLOBまたは文字列の値列内のXMLマークアップをリテラル・テキストのままにしておく点が異なります。

もう1つの相違点は、<xsql:query>は任意の数の列および行の問合せ結果を処理しますが、<xsql:include-xml>は、1つの行の1つの列を処理するという点です。このため、<xsql:include-xml>を使用すると、そこに含まれるSELECT文は、1つの列を含む1つの行を戻します。この列は、整形式のXML文書を含むCLOBまたはVARCHAR2値です。このXML文書は、XSQLエンジンによって解析され、XSQLページに挿入されます。

例15-12では、ネストしたXmlAgg()関数を使用して、部門およびネストした従業員を含む動的に作成されたXML文書の結果を集計します。この関数は、結果を<DepartmentList>要素でラップして1つの結果文書に集計します。

例15-12 動的に作成されたXML文書の集計

<xsql:query connection="hr" xmlns:xsql="urn:oracle-xsql">
SELECT XmlElement("DepartmentList",
XmlAgg(
XmlElement("Department",
XmlAttributes(department_id AS "Id"),
XmlForest(department_name AS "Name"),
(SELECT XmlElement("Employees",
XmlAgg(
XmlElement("Employee",
XmlAttributes(employee_id AS "Id"),
XmlForest(first_name||' '||last_name AS "Name",
salary   AS "Salary",
job_id   AS "Job")
)
)
)
FROM employees e
WHERE e.department_id = d.department_id
)
)
)
) AS result
FROM departments d
ORDER BY department_name
</xsql:query>

別の例として、moviesというXMLTypeの表に多数の<Movie>というXML文書が格納されているとします。それぞれの文書は、例15-13のようになっているとします。

例15-13 Movie XML文書

<Movie Title="The Talented Mr.Ripley" RunningTime="139" Rating="R">
<Director>
<First>Anthony</First>
<Last>Minghella</Last>
</Director>
<Cast>
<Actor Role="Tom Ripley">
<First>Matt</First>
<Last>Damon</Last>
</Actor>
<Actress Role="Marge Sherwood">
<First>Gwyneth</First>
<Last>Paltrow</Last>
</Actress>
<Actor Role="Dickie Greenleaf">
<First>Jude</First>
<Last>Law</Last>
<Award From="BAFTA" Category="Best Supporting Actor"/>
</Actor>
</Cast>
</Movie>

組込みXPath問合せ機能を使用すると、データベースに含まれるすべての映画から、アカデミー賞を受賞したすべての出演者の集計リストを抽出できます。例15-14に、サンプルの問合せを示します。

例15-14 XPathを使用した集計リストの抽出

SELECT XMLELEMENT("AwardedActors",
XMLAGG(EXTRACT(VALUE(m),
'/Movie/Cast/*[Award[@From="Oscar"]]')))
FROM movies m

このXMLTypeの問合せ結果をXSQLページに挿入するには、<xsql:query>要素の中に問合せを貼り付けます。例15-15のように、必ず問合せ式の別名を挿入します。

例15-15 XMLTypeの問合せ結果の挿入

<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT XMLELEMENT("AwardedActors",
XMLAGG(EXTRACT(VALUE(m),
'/Movie/Cast/*[Award[@From="Oscar"]]'))) AS result
FROM movies m
</xsql:query>

XmlElement()とXmlAgg()を組み合せて使用すると、データベースで、問合せで検出されたすべてのXMLフラグメントを1つの整形式XML文書に集計できます。この2つの関数を使用すると、次のような整形式の結果が生成されます。

<AwardedActors>
<Actor>...</Actor>
<Actress>...</Actress>
</AwardedActors>

バインド変数を式に連結する場合は、XPath式の途中で標準のXSQLバインド変数機能を使用することもできます。たとえば、値Oscarをaward-fromという名前のパラメータにするには、XSQLページを例15-16のように使用します。

例15-16 XPath式でのXSQLバインド変数の使用

<xsql:query connection="orcl92" xmlns:xsql="urn:oracle-xsql"
award-from="Oscar"  bind-params="award-from">
/* Using a bind variable in an XPath expression */
SELECT XMLELEMENT("AwardedActors",
XMLAGG(EXTRACT(VALUE(m),
'/Movie/Cast/*[Award[@From="'|| ? ||'"]]'))) AS result
FROM movies m
</xsql:query>

ポストされたXMLコンテンツの処理

XSQLページ・フレームワークは、XMLコンテンツの作成および変換のみでなく、ポストされたXMLコンテンツの処理も簡単にします。組込みアクションの利点は次のとおりです。

- XML文書形式およびHTML形式のポストされたデータの処理が簡単になります。

- XSUを使用してデータをデータベース表に直接ポストできます。

XSUは、ターゲット表またはビューに必要な正規の形式のXML文書のコンテンツに基づいて、データベースの挿入、更新および削除機能を実行します。特定のデータベース表では、そのデータの正規のXML形式は、SELECT *問合せからのXML出力の1行によって指定されます。この形式のXML文書では、XSUはDML操作を自動化できます。

XSUとXSLTを組み合せると、すべての形式のXMLを特定の表に対して適切な正規の形式に変換できます。変換後、結果として戻る正規のXMLに対してXSUでDMLを実行できます。

次の組込みXSQLアクションを使用すると、この機能をXSQLページ内から使用できます。

- <xsql:insert-request>
リクエストでポストされ、オプションで変換されたXML文書を表に挿入します。

- <xsql:update-request>
リクエストでポストされ、オプションで変換されたXML文書を表またはビューに更新します。

- <xsql:delete-request>
リクエストでポストされ、オプションで変換されたXML文書を表またはビューから削除します。

- <xsql:insert-param>
リクエスト・パラメータの値としてポストされ、オプションで変換されたXML文書を表またはビューに挿入します。

データベース・ビューを挿入のターゲットにする場合、そのビューに対するINSTEAD OF INSERTトリガーを作成し、ポストされた情報の処理をさらに自動化することができます。たとえば、ビューのINSTEAD OF INSERTトリガーは、PL/SQLを使用してレコードの有無を確認し、その確認結果に応じてINSERTまたはUPDATEのどちらを実行するかを効果的に選択できます。

XMLポスト・オプションの理解

XSQLページ・フレームワークでは、ポストされたデータを次のように処理できます。

- クライアント・プログラムは、XSQLページをターゲットとするHTTP POSTメッセージを送信します。リクエストの本体にはXML文書を含み、HTTPヘッダーに"text/xml"のContentTypeを指定します。
この場合、<xsql:insert-request>、<xsql:update-request>または<xsql:delete-request>を使用して、ポストされたXMLのコンテンツをターゲット表で挿入、更新または削除できます。XSLT変換を使用してポストされたXML文書を変換する場合、ポストされた文書がこの変換のソース・ドキュメントです。

- クライアント・プログラムは、パラメータの1つにXML文書を含む、XSQLページに対するHTTP GETリクエストを送信します。
この場合、<xsql:insert-param>アクションを使用して、ポストされたXMLパラメータ値のコンテンツをターゲット表に挿入できます。XSLTを使用してポストされたXML文書を変換する場合、パラメータ値内のXML文書がこの変換のソース・ドキュメントです。

- ブラウザは、アクションがXSQLページをターゲットとする、method="POST"が設定されたHTMLフォームを送信します。HTTP POSTメッセージのリクエスト本体は、エンコードされたフォーム・フィールドおよびその値を含み、ContentTypeを"application/x-www-form-urlencoded"に指定します。
この場合、このリクエストはXML文書を含まず、エンコードされたフォーム・パラメータを含みます。ただし、これらの3つの場合を同等にするために、XSQL Page Processorは(必要に応じて)リクエストに含まれるフォーム・パラメータ、セッション変数およびCookieからXML文書を生成します。この動的マテリアライズドXML文書は、<xsql:insert>、<xsql:update-request>または<xsql:delete-request>を使用して、DML用に正規の形式に変換されます。

ポストされたHTMLフォームを使用する場合、動的マテリアライズドXML文書は例15-17に示す形式になります。

例15-17 HTMLフォームから生成されたXML文書

<request>
<parameters>
<firstparamname>firstparamvalue</firstparamname>
...
<lastparamname>lastparamvalue</lastparamname>
</parameters>
<session>
<firstparamname>firstsessionparamvalue</firstparamname>
...
<lastparamname>lastsessionparamvalue</lastparamname>
</session>
<cookies>
<firstcookie>firstcookievalue</firstcookiename>
...
<lastcookie>firstcookievalue</lastcookiename>
</cookies>
</request>

複数のパラメータが同じ名前でポストされた場合、複数の<row>要素が自動的に作成され、それ以降の処理が簡単になります。次のパラメータおよび値をポストまたは挿入するリクエストを想定します。

- id = 101

- name = Steve

- id = 102

- name = Sita

- operation = update

XSQLページ・プロセッサによって、次のパラメータが作成されます。

<request>
<parameters>
<row>
<id>101</id>
<name>Steve</name>
</row>
<row>
<id>102</id>
<name>Sita</name>
</row>
<operation>update</operation>
</parameters>
...
</request>

リクエスト・パラメータを含むこのマテリアライズされたXML文書をターゲット表の正規の形式に変換するために、XSLTスタイルシートの指定が必要になります。これにより、次のようなXSQLページを作成できます。

<!--
| ShowRequestDocument.xsql
| Show Materialized XML Document for an HTML Form
+-->
<xsql:include-request-params xmlns:xsql="urn:oracle-xsql"/>

このページを適切に使用すると、HTMLフォームを一時的に変更して、ShowRequestDocument.xsqlページにポストできます。また、ブラウザで、マテリアライズドXMLリクエスト文書の未加工のXMLが表示されます。このXMLは、保存してXSL変換を展開するために使用できます。

FOPシリアライザを使用したPDF出力の生成

XSQLページ・フレームワークによるカスタム・シリアライザのサポートを使用すると、oracle.xml.xsql.serializers.XSQLFOPSerializerクラスでApacheのFOPプロセッサと統合できます。FOPプロセッサは、XSL Formatting Objectsを含むXML文書からPDFドキュメントをレンダリングします。

表14-1に示すように、デモ・ディレクトリにはemptablefo.xslスタイルシートとemptable.xsqlページが存在します。FOPシリアライザを使用する際にエラーが発生した場合、必要なすべてのJARファイルがCLASSPATHに指定されていないことが原因と考えられます。XSQLFOPSerializerクラスは別のxml.jarファイルに存在しますが、FOPの統合を使用するには、CLASSPATH内に指定する必要があります。また、CLASSPATHに次のJavaアーカイブを追加する必要があります。

- fop.jar - Apacheバージョン0.20.3以上のJavaアーカイブ

- batik.jar - FOP配布パッケージに含まれるJavaアーカイブ

- avalon-framework-4.0.jar - FOP配布パッケージに含まれるJavaアーカイブ

- logkit-1.0.jar - FOP配布パッケージに含まれるJavaアーカイブ

実装をカスタマイズする際の参考として、このリリースに提供されているFOPシリアライザのソース・コードを例15-18に示します。

例15-18 FOPシリアライザのソース・コード

package oracle.xml.xsql.serializers;
import org.w3c.dom.Document;
import org.apache.log.Logger;
import org.apache.log.Hierarchy;
import org.apache.fop.messaging.MessageHandler;
import org.apache.log.LogTarget;
import oracle.xml.xsql.XSQLPageRequest;
import oracle.xml.xsql.XSQLDocumentSerializer;
import org.apache.fop.apps.Driver;
import org.apache.log.output.NullOutputLogTarget;
/**
* Tested with the FOP 0.20.3RC release from 19-Jan-2002
*/
public class XSQLFOPSerializer implements XSQLDocumentSerializer {
private static final String PDFMIME = "application/pdf";
public void serialize(Document doc, XSQLPageRequest env) throws Throwable {
try {
// First make sure we can load the driver
Driver FOPDriver = new Driver();
// Tell FOP not to spit out any messages by default.
// You can modify this code to create your own FOP Serializer
// that logs the output to one of many different logger targets
// using the Apache LogKit API
Logger logger=Hierarchy.getDefaultHierarchy().getLoggerFor("XSQLServlet");
logger.setLogTargets(new LogTarget[]{new NullOutputLogTarget()});
FOPDriver.setLogger(logger);
// Some of FOP's messages appear to still use MessageHandler.
MessageHandler.setOutputMethod(MessageHandler.NONE);
// Then set the content type before getting the reader
env.setContentType(PDFMIME);
FOPDriver.setOutputStream(env.getOutputStream());
FOPDriver.setRenderer(FOPDriver.RENDER_PDF); FOPDriver.render(doc);
}
catch (Exception e) {
// Cannot write PDF output for the error anyway.
// So maybe this stack trace will be useful info
e.printStackTrace(System.err);
}
}
}

関連項目:
Formatting Objects Processorの詳細は、http://xml.apache.org/fopを参照してください。

XSQLのカスタマイズの実行

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

- カスタムXSQLアクション・ハンドラの作成

- カスタムXSQLシリアライザの実装

- JDBCデータソースに対するカスタムXSQL Connection Managerの使用

- カスタムXSQL Connection Managerの作成

- カスタムXSQLErrorHandlerの実装

- カスタムXSQLログ出力実装の提供

カスタムXSQLアクション・ハンドラの作成

タスクの実行にカスタム処理が必要であり、そのニーズに合う組込みアクションが表30-2「XSQL構成ファイルの設定」にない場合は、独自のアクションを作成できます。

XSQLページ・エンジンでは、xsql名前空間からアクション・ハンドラ要素を検索し、適切なアクション・ハンドラ要素ハンドラ・クラスをコールして各アクションを処理することにより、XSQLページが処理されます。XSQLActionHandlerインタフェースを実装するすべてのアクションがサポートされています。すべての組込みアクションは、このインタフェースを実装します。

XSQLエンジンは、ページ内のアクションを次の方法で処理します。ページ内のアクションごとに、次の手順を実行します。

1. デフォルトのコンストラクタを使用して、アクション・ハンドラ・クラスのインスタンスを作成します。

2. メソッドinit(Element actionElt,XSQLPageRequest context)をコールして、アクション・ハンドラ要素オブジェクトおよびXSQL Page Processorコンテキストを含むハンドラ・インスタンスを初期化します。

3. メソッドhandleAction (Node result)を起動して、ハンドラがアクションを処理できるようにします。

組込みアクションの場合、XSQLエンジンは、そのアクション・ハンドラを実装するJavaクラスへのXSQLアクション・ハンドラ要素名をマップできます。表30-2「XSQL構成ファイルの設定」に、組込みアクションとそのアクションに対応するクラスを示しています。

ユーザー定義のアクションの場合は、次の組込みアクションを使用します。fully.qualified.Classnameの部分は使用するクラス名に置き換えてください。

<xsql:action handler="fully.qualified.Classname" ... />

handler属性は、そのカスタム・アクション・ハンドラを実装するJavaクラスの完全修飾名を指定します。

XSQLActionHandlerインタフェースの実装

カスタム・アクション・ハンドラを作成するには、oracle.xml.xsql.XSQLActionHandlerインタフェースを実装するクラスを作成します。ほぼすべてのカスタム・アクション・ハンドラは、init()メソッドのデフォルト実装および有用なヘルパー・メソッドを提供するoracle.xml.xsql.XSQLActionHandlerImplを拡張します。

XSQLページ・プロセッサがアクション・ハンドラのhandleAction()メソッドをコールすると、DOMフラグメントがアクション実装に渡されます。アクション・ハンドラは、ページに戻された、動的に作成されたXMLコンテンツをルート・ノードに追加します。

XSQLプロセッサによって、XSQLページ内のアクション要素は、概念的にこのドキュメント・フラグメントのコンテンツに置き換えられます。ページに追加するXMLコンテンツがない場合、アクション・ハンドラはこのフラグメントに何も追加しません。

カスタム・アクション・ハンドラを作成する場合、XSQLActionHandlerImplクラスのいくつかのメソッドが役に立ちます。表15-2に、これらのメソッドを示します。

表15-2 XSQLActionHandlerImplクラスの有用なメソッド

メソッド名

説明

getActionElement

処理中の現行のアクション・ハンドラ要素を戻します。

getActionElementContent

すべての字句パラメータを適切に置き換えて、現行のアクション・ハンドラ要素のテキスト・コンテンツを戻します。

getPageRequest

現行のXSQLページ・プロセッサのコンテキストを戻します。このオブジェクトでは次のメソッドを使用できます。

- setPageParam()
ページ・パラメータ値を設定します。

- getPostedDocument()/setPostedDocument()
ポストされたXML文書を取得または設定します。

- translateURL()
相対URLを絶対URLに変換します。

- getRequestObject()/setRequestObject()
単一のページのアクション間で共有できるページ・リクエスト・コンテキスト内のオブジェクトを取得または設定します。

- getJDBCConnection()
このページが使用中のJDBC接続(使用中の接続がない場合はnull)を取得します。

- getRequestType()
Servlet、Command LineまたはProgrammaticのいずれのコンテキストで実行中かを検出します。たとえば、リクエストのタイプがServletの場合は、XSQLPageRequestオブジェクトをより固有のXSQLServletPageRequestにキャストし、getHttpServletRequest、getHttpServletResponse、getServletContextなどのサーブレット固有のメソッドにアクセスできます。

getAttributeAllowingParam

属性値で使用されているすべてのXSQL字句パラメータ参照を解決し、要素から属性値を取得します。通常、このメソッドはアクション・ハンドラ要素自体に適用されますが、サブ要素の属性にアクセスすることも有効です。字句パラメータを許可せずに属性値にアクセスするには、DOMのElementインタフェースに対して標準のgetAttribute()メソッドを使用します。

appendSecondaryDocument

外部XML文書のコンテンツをアクション・ハンドラの結果コンテンツのルートに追加します。

addResultElement

テキスト・コンテンツを含む単一の要素をアクション・ハンドラの結果コンテンツのルートに追加する操作を簡単にします。

firstColumnOfFirstRow

SQL文の最初の行にある最初の列値を戻します。現行のページのドキュメント要素に接続属性が含まれている必要があります。含まれていない場合は、エラーが戻されます。

getBindVariableCount

空白で区切られたbind-paramsのリスト内にあるトークンの数を戻します。この値は、パラメータにバインドされるバインド変数の数を示します。

handleBindVariables

現行のアクション・ハンドラ要素のbind-params属性で指定されるパラメータ値を使用して、プリコンパイルされたSQL文で使用されるJDBCバインド変数のバインディングを管理します。このメソッドをコールする前にSQL文がすでに多くのバインド変数を使用している場合は、使用中である既存のバインド変数スロットの数も渡すことができます。

reportErrorIncludingStatement

エラーを報告します。エラーには問題の原因である違反(SQL)文が含まれます。オプションで、エラーに数値エラー・コードが含まれる場合もあります。

reportFatalError

致命的エラーを報告します。

reportMissingAttribute

<xsql-error>要素を使用して、必須のアクション・ハンドラ属性が欠落していることを示すエラーを報告します。

reportStatus

<xsql-status>要素を使用して、アクション・ハンドラの状態を報告します。

requiredConnectionProvided

このリクエストに使用できる接続の有無を確認し、使用可能な接続がない場合はページにエラーグラムを出力します。

variableValue

字句パラメータのデフォルト値を決定する場合があるすべての有効範囲決定規則を考慮して、字句パラメータの値を戻します。

例15-19に、組込みアクション・ハンドラの1つを使用するカスタム・アクション・ハンドラMyIncludeXSQLHandlerを示します。これは、任意のJavaコードを使用し、そのハンドラによって戻されたXMLフラグメントを変更してから、その結果をXSQLページに追加します。

例15-19 MyIncludeXSQLHandler.java

import oracle.xml.xsql.*;
import oracle.xml.xsql.actions.XSQLIncludeXSQLHandler;
import org.w3c.dom.*;
import java.sql.SQLException;
public class MyIncludeXSQLHandler extends XSQLActionHandlerImpl {
XSQLActionHandler nestedHandler = null;
public void init(XSQLPageRequest req, Element action) {
super.init(req, action);
// Create an instance of an XSQLIncludeXSQLHandler and init() the handler by
// passing the current request/action. This assumes the XSQLIncludeXSQLHandler
// will pick up its href="xxx.xsql" attribute from the current action element.
nestedHandler = new XSQLIncludeXSQLHandler();
nestedHandler.init(req,action);
}
public void handleAction(Node result) throws SQLException {
DocumentFragment df=result.getOwnerDocument().createDocumentFragment();
nestedHandler.handleAction(df);
// Custom Java code here can work on the returned document fragment
// before appending the final, modified document to the result node.
// For example, add an attribute to the first child.
Element e = (Element)df.getFirstChild();
if (e != null) {
e.setAttribute("ExtraAttribute","SomeValue");
}
result.appendChild(df);
}
}

ページがXSQLサーブレット、XSQLコマンドライン・ユーティリティまたはプログラムでXSQLRequestクラスを介してリクエストされているかどうかに基づいて、異なる動作をするカスタム・アクション・ハンドラを作成する場合、アクション・ハンドラの実装で、getPageRequest()を起動して、現行のページ・リクエスト用の XSQLPageRequestインタフェースを参照できます。XSQLPageRequestオブジェクトに対してgetRequestType()をコールすると、Servlet、Command LineまたはProgrammaticのいずれからリクエストを受信しているかを確認できます。戻り値がServletの場合、例15-20の構文によって、HTTPサーブレットのリクエスト、レスポンスおよびサーブレット・コンテキスト・オブジェクトにアクセスできます。

例15-20 サーブレット・リクエストのテスト

XSQLServletPageRequest xspr = (XSQLServletPageRequest)getPageRequest();
if (xspr.getRequestType().equals("Servlet")) {
HttpServletRequest     req  = xspr.getHttpServletRequest();
HttpServletResponse   resp  = xspr.getHttpServletResponse();
ServletContext        cont  = xspr.getServletContext();
// Do something here with req, resp, or cont. Note that writing to the response
// directly from a handler produces unexpected results. All the servlet or your
// custom Serializer to write to the servlet response output stream at the right
// moment later when all action elements have been processed.
}

カスタムXSQLアクション内での複数値パラメータの使用

XSQLActionHandlerImplはカスタムXSQLアクションのベース・クラスです。これは次のものをサポートしています。

- 配列名を使用した字句パラメータ置換

- 配列名を使用したバインド変数

- 単一値のパラメータ

カスタム・アクションでこの基本クラスからのメソッド、たとえばgetAttributeAllowingParam()、getActionElementContent()またはhandleBindVariables()などを使用する場合は、カスタム・アクションで複数値のパラメータの機能を使用できます。

パラメータ値をString[]として明示的に取得するには、XSQLPageRequestインタフェースでgetParameterValues()メソッドを使用します。XSQLActionHandlerImplのヘルパー・メソッドvariableValues()を使用すると、プログラムで必要な場合にカスタム・アクション・ハンドラ内からこの機能を使用できます。

カスタムXSQLシリアライザの実装

ユーザー定義のシリアライザ・クラスを実装し、最終XSQLデータページをテキストまたはバイナリ・ストリームにシリアライズする方法を制御できます。ユーザー定義のシリアライザには、oracle.xml.xsql.XSQLDocumentSerializerインタフェースを実装する必要があります。このインタフェースには次の単一メソッドがあります。

void serialize(org.w3c.dom.Document doc, XSQLPageRequest env) throws Throwable;

DOMベースのシリアライザのみがサポートされます。カスタム・シリアライザ・クラスを使用する場合は、次のタスクを適切な順序で実行する必要があります。

1. 出力PrintWriter(またはOutputStream)に内容を出力する前に、シリアライズされたストリームのコンテンツ・タイプを設定します。
シリアライザに渡されたXSQLPageRequestに対してsetContentType()をコールし、型を設定します。コンテンツ・タイプを設定する場合は、次のようなMIMEタイプを設定できます。

env.setContentType("text/html");

または、次のようにエンコーディング・キャラクタ・セットを含むMIMEタイプを設定することもできます。

env.setContentType("text/html;charset=Shift_JIS");

2. XSQLPageRequestに対してgetWriter()またはgetOutputStream()のどちらかをコールし(両方は不可)、それぞれ適切なPrintWriterまたはOutputStreamを取得して、コンテンツのシリアライズに使用します。

例15-21のカスタム・シリアライザは、現行のXSQLデータ・ページのドキュメント要素名を含むHTMLドキュメントをシリアライズする単純な実装を示します。

例15-21 カスタム・シリアライザ

package oracle.xml.xsql.serializers;
import org.w3c.dom.Document;
import java.io.PrintWriter;
import oracle.xml.xsql.*;

public class XSQLSampleSerializer implements XSQLDocumentSerializer {
public void serialize(Document doc, XSQLPageRequest env) throws Throwable {
String encoding = env.getPageEncoding();  // Use same encoding as XSQL page
// template. Set to specific
// encoding if necessary
String mimeType = "text/html"; // Set this to the appropriate content type
// (1) Set content type using the setContentType on the XSQLPageRequest
if (encoding != null && !encoding.equals("")) {
env.setContentType(mimeType+";charset="+encoding);
}
else {
env.setContentType(mimeType);
}
// (2) Get the output writer from the XSQLPageRequest
PrintWriter e = env.getWriter();
// (3) Serialize the document to the writer
e.println("<html>Document element is <b>"+
doc.getDocumentElement().getNodeName()+"</b></html>");
}
}

カスタム・シリアライザの使用方法

カスタム・シリアライザを使用するには、シリアライズの前にXSLT変換を実行する必要があるかどうかによって、2つの方法があります。

カスタム・シリアライザを使用する前にXSLT変換を実行するには、ページの最上部にある<?xml-stylesheet?>処理命令内にserializer="java:fully.qualified.ClassName"を追加します。次の例に、この方法を示します。

<?xml version="1.0?>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"
serializer="java:my.pkg.MySerializer"?>

カスタム・シリアライザのみが必要である場合は、type属性およびhref属性を省略します。次の例に、この方法を示します。

<?xml version="1.0?>
<?xml-stylesheet serializer="java:my.pkg.MySerializer"?>

カスタム・シリアライザへの短縮名の割当て

また、XSQL構成ファイルの<serializerdefs>セクションでカスタム・シリアライザに短縮名を割り当てることができます。serializer属性でそのニックネームを使用して、入力作業を省くことができます。短縮名には大/小文字の区別があります。

XSQL構成ファイルに例15-22に示す情報が指定されているとします。

例15-22 カスタム・シリアライザへの短縮名の割当て

<XSQLConfig>
<!--and so on. -->
<serializerdefs>
<serializer>
<name>Sample</name>
<class>oracle.xml.xsql.serializers.XSQLSampleSerializer</class>
</serializer>
<serializer>
<name>FOP</name>
<class>oracle.xml.xsql.serializers.XSQLFOPSerializer</class>
</serializer>
</serializerdefs>
</XSQLConfig>

次のようにスタイルシートの命令に短縮名"Sample"または"FOP"を使用できます。

<?xml-stylesheet type="text/xsl" href="emp-to-xslfo.xsl" serializer="FOP"?>
<?xml-stylesheet serializer="Sample"?>

XSQLPageRequestインタフェースは、getWriter()メソッドとgetOutputStream()メソッドの両方をサポートします。カスタム・シリアライザは、getOutputStream()をコールして、OutputStreamインスタンスを戻します。バイナリ・データは、このインスタンスにシリアライズできます。XSQLサーブレットを使用する場合は、このOutputStreamに出力すると、バイナリ情報がサーブレットのOutputStreamに出力されます。

例15-23のシリアライザは、動的GIFイメージを出力する例を示します。この例では、GIFイメージは静的な「OK」アイコンですが、より高度なイメージ・シリアライザで使用する必要がある基本的な方法を示します。

例15-23 動的GIFイメージの出力

package oracle.xml.xsql.serializers;
import org.w3c.dom.Document;
import java.io.*;
import oracle.xml.xsql.*;

public class XSQLSampleImageSerializer implements XSQLDocumentSerializer {
// Byte array representing a small "ok" GIF image
private static byte[] okGif =
{(byte)0x47,(byte)0x49,(byte)0x46,(byte)0x38,
(byte)0x39,(byte)0x61,(byte)0xB,(byte)0x0,
(byte)0x9,(byte)0x0,(byte)0xFFFFFF80,(byte)0x0,
(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,
(byte)0xFFFFFFFF,(byte)0xFFFFFFFF,(byte)0xFFFFFFFF,(byte)0x2C,
(byte)0x0,(byte)0x0,(byte)0x0,(byte)0x0,
(byte)0xB,(byte)0x0,(byte)0x9,(byte)0x0,
(byte)0x0,(byte)0x2,(byte)0x14,(byte)0xFFFFFF8C,
(byte)0xF,(byte)0xFFFFFFA7,(byte)0xFFFFFFB8,(byte)0xFFFFFF9B,
(byte)0xA,(byte)0xFFFFFFA2,(byte)0x79,(byte)0xFFFFFFE9,
(byte)0xFFFFFF85,(byte)0x7A,(byte)0x27,(byte)0xFFFFFF93,
(byte)0x5A,(byte)0xFFFFFFE3,(byte)0xFFFFFFEC,(byte)0x75,
(byte)0x11,(byte)0xFFFFFF85,(byte)0x14,(byte)0x0,
(byte)0x3B};

public void serialize(Document doc, XSQLPageRequest env) throws Throwable {
env.setContentType("image/gif");
OutputStream os = env.getOutputStream();
os.write(okGif,0,okGif.length);
os.flush();
}
}

XSQLコマンドライン・ユーティリティを使用する場合は、バイナリ情報がターゲット出力ファイルに出力されます。XSQLRequest APIを使用する場合は、2つのコンストラクタが存在します。これらのコンストラクタは、コール元がページ処理の結果用に使用するターゲットOutputStreamを提供できるようにします。

シリアライザは、getWriter() (テキスト出力用)またはgetOutputStream() (バイナリ出力用)のどちらかをコールする必要があります。ただし、これらの両方をコールすることはできません。同一のリクエストで両方のメソッドをコールすると、エラーが発生します。

JDBCデータソースに対するカスタムXSQL Connection Managerの使用

XSQL構成ファイル内に自分が使用する接続を名前を付けて定義するという方法の他に、提供されている2つのXSQLConnectionManager実装のいずれかを使用するという方法があります。これらの実装を使用すると、サーブレット・コンテナのJDBCデータソース実装および関連する接続プーリング機能を使用できます。

XSQLページ・フレームワークには、代替として使用できる次のConnection Manager実装が付属しています。

- oracle.xml.xsql.XSQLDatasourceConnectionManager
サーブレット・コンテナのデータソース実装がOracle JDBCドライバを使用しない場合は、この接続マネージャを使用することを検討してください。Oracle JDBCドライバを使用していないと、<xsql:ref-cursor-function>や<xsql:include-owa>などのXSQLページ・システムの一部の機能が使用できなくなります。

- oracle.xml.xsql.XSQLOracleDatasourceConnectionManager
データソース実装が、それぞれoracle.jdbc.PreparedStatementインタフェースおよびoracle.jdbc.CallableStatementインタフェースを実装するJDBCのPreparedStatementオブジェクトおよびCallableStatementオブジェクトを戻す場合は、このConnection Managerを使用することをお薦めします。Oracle Application Serverには、このタスクを実行するデータソース実装が含まれています。

前述の代替Connection Manager実装のいずれかを使用するとき、XSQLページ内の接続属性の値には、必要なデータソースの検索に使用するJNDI名を指定します。接続属性の値の例を次に示します。

- jdbc/scottDS

- java:comp/env/jdbc/MyDatasource

デフォルトのXSQLページConnection Managerを使用しない場合は、代替のConnection Manager実装を使用して必要な接続プーリング機能を提供する必要があります。JDBCデータソースに基づく前述の2つのオプションでは、サーブレット・コンテナを適切に構成し、接続プーリングを提供する必要があります。プールされた接続を提供するためにデータソースを適切に構成する方法については、使用しているサーブレット・コンテナのドキュメントを参照してください。

カスタムXSQL Connection Managerの作成

カスタムConnection Managerを作成し、組込みConnection Managementメカニズムを置き換えることができます。カスタムConnection Managerの実装を提供するには、次の手順を実行する必要があります。

1. oracle.xml.xsql.XSQLConnectionManagerFactoryインタフェースを実装するConnection Managerファクトリ・クラスを作成します。

2. oracle.xml.xsql.XSQLConnectionManagerインタフェースを実装するConnection Managerクラスを作成します。

3. XSQL構成ファイル内のXSQLConnectionManagerFactoryクラスの名前を変更します。

XSQLサーブレットでは、XSQLページのデフォルト・スキームではなく、定義した接続管理スキームが使用されます。

XSQL構成ファイルにクラス名を指定すると、カスタムConnection ManagerファクトリをデフォルトのConnection Managerファクトリとして使用するように設定できます。ファクトリを次のセクションに設定します。

<!--
| Set the name of the XSQL Connection Manager Factory
| implementation. The class must implement the
| oracle.xml.xsql.XSQLConnectionManagerFactory interface.
| If unset, the default is to use the built-in connection
| manager implementation in
| oracle.xml.xsql.XSQLConnectionManagerFactoryImpl
+-->
<connection-manager>
<factory>oracle.xml.xsql.XSQLConnectionManagerFactoryImpl</factory>
</connection-manager>

デフォルトのConnection Managerファクトリを指定する他に、指定されたAPIを使用して、カスタム接続ファクトリをXSQLRequestオブジェクトに関連付けることもできます。

XSQLConnectionManagerFactoryは、現行のリクエストが使用するXSQLConnectionManagerのインスタンスを戻します。サーブレット・エンジンなどのマルチスレッド環境では、XSQLConnectionManagerオブジェクトが、2つの異なるスレッドによって単一のXSQLConnectionインスタンスが使用されていないことを保証する必要があります。そのために、getConnection()メソッドのコールからreleaseConnection()メソッドのコールまでの間、接続は使用中としてマークされます。デフォルトのXSQL Connection Manager実装は、名前付き接続を自動的にプールし、このスレッド・セーフ・ポリシーに従います。

XSQLConnectionManagerのカスタム実装で、オプションのoracle.xml.xsql.XSQLConnectionManagerCleanupインタフェースも実装する場合は、Connection Managerで、割当て済のリソースをクリーンアップできます。たとえば、サーブレット・コンテナがXSQLServletサーブレットに対してdestroy()メソッドを起動すると(サーブレットのオンライン管理中などに発生)、Connection Managerはサーブレットの破棄プロセスの一部として、リソースをクリーンアップできます。

カスタムConnection Managerの認証情報にアクセスする方法

HTTP認証メカニズムを使用して、データベースに接続するためのユーザー名およびパスワードを取得するには、カスタマイズしたConnection Managerを作成します。これにより、getConnection()メソッドを起動して必要な情報を取得できます。

Javaプログラムを作成するには、次の手順を実行します。

1. oracle.xml.xsql.XSQLPageRequestインタフェースのインスタンスをgetConnection()メソッドに渡します。

2. getRequestType()を起動して、リクエストのタイプがServletであることを確認します。

3. XSQLPageRequestオブジェクトをXSQLServletPageRequestにキャストします。

4. 前述の手順の結果に対してgetHttpServletRequest()をコールします。

5. 前述のコールで戻されたjavax.servlet.http.HttpServletResponseオブジェクトから認証情報を取得します。

カスタムXSQLErrorHandlerの実装

重大なPage Processorエラー(接続が使用できないなど)をユーザーに通知する方法を制御する場合があります。これを行うには、oracle.xml.xsql.XSQLErrorHandlerインタフェースを実装します。このインタフェースには次に示す単一のメソッド・シグネチャが含まれています。

public interface XSQLErrorHandler {
public void handleError( XSQLError err, XSQLPageRequest env);
}

XSQLErrorHandlerインタフェースを実装するクラスを提供すると、XSQLページ・プロセッサによるエラー・メッセージの出力方法をカスタマイズできます。新しいXSQLErrorオブジェクトはエラー情報をカプセル化し、エラー・コード、フォーマットされたエラー・メッセージなどへのアクセスを提供します。

例15-24に、XSQLErrorHandlerのサンプル実装を示します。

例15-24 myErrorHandlerクラス

package example;
import oracle.xml.xsql.*;
import java.io.*;
public class myErrorHandler implements XSQLErrorHandler {
public void logError( XSQLError err, XSQLPageRequest env) {
// Must set the content type before writing anything out
env.setContentType("text/html");
PrintWriter pw = env.getErrorWriter();
pw.println("<H1>ERROR</H1><hr>"+err.getMessage());
}
}

使用するカスタムXSQLErrorHandler実装を、次の2つの方法で制御できます。

1. カスタムXSQLErrorHandler実装クラスの名前をXSQL構成ファイルに定義します。エラー・ハンドラ・クラスの完全修飾クラス名を/XSQLConfig/processor/error-handler/classエントリの値として指定する必要があります。
XSQLページ・プロセッサがこのクラスをロードし、XSQLErrorHandlerインタフェースを正しく実装すると、このクラスはシングルトンとして使用され、ページ・プロセッサのエラーが通知された場合にデフォルトの実装をグローバルに置換します。

2. ページのドキュメント要素に対してerrorHandler(またはxsql:errorHandler)属性を使用して、ページごとにエラー・ライターをオーバーライドします。この属性の値は、XSQLErrorHandlerインタフェースを実装するクラスの完全修飾クラス名です。このクラスは現行のページで発生したエラーのみを通知します。このクラスは、Page Engineによってページ・リクエストごとにインスタンス化されます。

前述の方法は、必要に応じて組み合せて使用できます。

カスタムXSQLログ出力実装の提供

各XSQLページ・リクエストの開始と終了のロギングを処理するカスタム・コードをオプションで登録できます。カスタム・ログ出力コードでは、oracle.xml.xsql.XSQLLoggerFactoryインタフェースとoracle.xml.xsql.XSQLLoggerインタフェースの実装を提供する必要があります。

XSQLLoggerFactoryインタフェースには次に示す単一のメソッドが含まれています。

public interface XSQLLoggerFactory {
public XSQLLogger create( XSQLPageRequest env);
}

XSQLLoggerFactoryインタフェースを実装するクラスを提供し、ロギング用にXSQLLoggerオブジェクトを作成(または再利用)する方法を決定できます。XSQLプロセッサは、ページ・リクエストの存続期間中ファクトリによって戻されるXSQLLoggerオブジェクトへの参照を保持します。プロセッサはこの参照を使用して、logRequestStart()メソッドおよびlogRequestEnd()メソッドを起動することで、各ページ・リクエストの開始と終了をログに記録します。

XSQLLoggerインタフェースは次のとおりです。

public interface XSQLLogger {
public void logRequestStart(XSQLPageRequest env) ;
public void logRequestEnd(XSQLPageRequest env);
}

例15-25および例15-26のクラスは、カスタム・ログ出力の一般的な実装を示します。例15-25のXSQLLogger実装では、ページ・リクエストの開始時刻を記録します。また、ページ・リクエストの名前と経過時間をSystem.outに出力して、ページ・リクエストの終了時刻を記録します。

例15-25 SampleCustomLoggerクラス

package example;
import oracle.xml.xsql.*;
public class SampleCustomLogger implements XSQLLogger  {
long start = 0;
public void logRequestStart(XSQLPageRequest env) {
start = System.currentTimeMillis();
}
public void logRequestEnd(XSQLPageRequest env) {
long secs = System.currentTimeMillis() - start;
System.out.println("Request for " + env.getSourceDocumentURI()
+ " took "+ secs + "ms");
}
}

例15-26に、ファクトリの実装を示します。

例15-26 SampleCustomLoggerFactoryクラス

package example;
import oracle.xml.xsql.*;
public class SampleCustomLoggerFactory implements XSQLLoggerFactory {
public XSQLLogger create(XSQLPageRequest env) {
return new SampleCustomLogger();
}
}

カスタム・ログ出力ファクトリを登録するには、XSQLConfig.xmlファイルを編集し、カスタム・ログ出力ファクトリ・クラスの名前を/XSQLConfig/processor/logger/factory要素のコンテンツとして指定します。例15-27に、その方法を示します。

例15-27 カスタム・ログ出力ファクトリの登録

<XSQLConfig>
:
<processor>
:
<logger>
<factory>example.SampleCustomLoggerFactory</factory>
</logger>
:
</processor>
</XSQLConfig>

デフォルトでは、<logger>セクションはコメント・アウトされています。デフォルトのログ出力はありません。

第II部

XDK for C

第II部の各章では、Cでの開発におけるOracle XDKの使用方法を説明します。

章構成は次のとおりです。

- 第16章「C XDKコンポーネントを使用する前に」

- 第17章「XSLT Processor for CおよびXVM Processor for Cの使用」

- 第18章「XML Parser for Cの使用」

- 第19章「バイナリXML for Cの使用」

- 第20章「XML Schema Processor for Cの使用」

- 第21章「Cを使用したXML差分の検出」

- 第22章「C XDKでのSOAPの使用」

16 C XDKコンポーネントを使用する前に

XDK Cコンポーネントは、XML文書の読取り、操作、変換および検証を行うための基本コンポーネントです。

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

- C XDKコンポーネントのインストール

- C XDKコンポーネント用のUNIX環境の構成

- C XDKコンポーネント用のWindows環境の構成

- 統合C APIの概要

- C XDKコンポーネントのグローバリゼーション・サポート

C XDKコンポーネントのインストール

C XDKコンポーネントは、Oracle Databaseに付属しています。この章では、Oracle DatabaseとともにXDKをインストールし、Oracle Database Examplesメディアのデモ・プログラムもインストールしたと想定します。インストールの手順およびXDKディレクトリ構造の説明は、「XDKのインストール」を参照してください。

例16-1 に、XDKデモとXDKコンポーネントで使用されるライブラリのUNIXディレクトリ構造を示します。$ORACLE_HOME/xdk/demo/cのサブディレクトリには、XDK for Cコンポーネントのサンプル・プログラムとデータ・ファイルが入っています。第II部「XDK for C」では、これらのプログラムを理解および使用する方法について説明します。

例16-1 C XDKのライブラリ、ヘッダー・ファイル、ユーティリティおよびデモ

- Oracle_home_directory
| - bin/
schema
xml
xmlcg
xsl
xvm
| - lib/
libcore11.a
libcoresh11.so
libnls11.a
libunls11.a
libxml11.a
libxmlsh10.a

| - xdk/
| demo/
| - c/
| - dom/
| - parser/
| - sax/
| - schema/
| - webdav/
| - xslt/
| - xsltvm/
| include/
oratypes.h
oraxml.h
oraxmlcg.h
oraxsd.h
xml.h
xmlerr.h
xmlotn.h
xmlproc.h
xmlsch.h
xmlxptr.h
xmlxsl.h
xmlxvm.h

サブディレクトリには、C XDKコンポーネントのサンプル・プログラムとデータ・ファイルが入っています。第II部「XDK for C」では、これらのプログラムを使用して最も重要なC言語の機能を理解する方法について説明します。

関連項目:
XDK Cコンポーネントのリストは、「Oracle XML Developer's Kit(XDK)の概要」を参照してください。

C XDKコンポーネント用のUNIX環境の構成

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

- UNIXでのC XDKコンポーネントの依存性

- UNIXでのC XDK環境変数の設定

- UNIXでのC XDK実行時環境のテスト

- UNIXでのC XDKコンパイル時環境の設定とテスト

- UNIXでのC XDKコンポーネントのバージョンの検証

UNIXでのC XDKコンポーネントの依存性

この項で説明するCライブラリは、$ORACLE_HOME/libにあります。XDK CおよびC++コンポーネントは、次のライブラリに含まれます。

libxml11.a

このライブラリに含まれるXDKコンポーネントは次のとおりです。

- XMLパーサー: XML文書が整形式であるか、DTDまたはXMLスキーマに対して妥当であるかどうか(オプション)を確認します。プログラム・アクセス用のDOMおよびSAXインタフェースをサポートします。

- XSLTプロセッサ: XML文書を別のXML文書に変換します。

- XSLTコンパイラ: XSLTスタイルシートをコンパイルしてバイト・コードを生成します。生成したコードはXSLT仮想マシンによって使用されます。

- XSLTVM: XSLT変換エンジンです。

- XMLスキーマ・プロセッサ: XMLファイルをXMLスキーマに対して検証します。

表16-1 に、XDK Cコンポーネント(UNIX)が依存するOracleのCOREライブラリおよびGlobalization Supportライブラリを示します。

表16-1 XDK Cコンポーネントの依存ライブラリ(UNIX)

コンポーネント

ライブラリ

説明

COREライブラリ

libcore11.a

複数プラットフォームにわたる移植性を実現するCランタイム関数を含みます。

CORE動的リンク・ライブラリ

libcoresh11.so

UNIXプラットフォームでの動的リンクをサポートするCランタイム・ライブラリ。

Globalization Support共通ライブラリ

libnls11.a

UTF-8、UTF-16およびISO-8859-1のキャラクタ・セットをサポートします。このライブラリは、エンコーディング・ファイルおよびメッセージ・ファイルの場所を特定する際に環境に依存します。

Unicode用のGlobalization Supportライブラリ

libunls11.a

『Oracle Databaseグローバリゼーション・サポート・ガイド』で説明しているキャラクタ・セットをサポートします。このライブラリは、エンコーディング・ファイルおよびメッセージ・ファイルの場所を特定する際に環境に依存します。

UNIXでのC XDK環境変数の設定

表16-2 に、XDK Cコンポーネントを使用するときに必要なUNIX環境変数を示します。

表16-2XDK CコンポーネントのUNIXでの環境設定

変数

説明

設定

$ORA_NLS10

グローバリゼーション・サポート・キャラクタ・エンコーディング定義ファイルの場所を設定します。エンコーディング・ファイルは、Oracle Databaseで使用可能なキャラクタ・セットのサブセットを表します。

グローバリゼーション・サポート・データ・ファイルの場所を設定します。この変数は次のように設定します。

setenv ORA_NLS10 $ORACLE_HOME/nls/data

$ORA_XML_MESG

XMLエラー・メッセージ・ファイルの場所を設定します。.msbで終わるファイルは、マシンで読取り可能な形式で、実行時に必要とされます。.msgで終わるファイルは、ユーザーが読取り可能な形式で、各エラーの原因および処理に関する説明が含まれます。

mesgディレクトリのパスを設定します。次に例を示します。

setenv ORA_XML_MESG $ORACLE_HOME/xdk/mesg

$PATH

C XDK実行可能ファイルの場所を設定します。

PATHは次のように設定できます。

setenv PATH ${PATH}:${ORACLE_HOME}/bin

UNIXでのC XDK実行時環境のテスト

表16-3に示すいずれかのユーティリティを実行して、UNIX実行時環境をテストできます。

表16-3 C/C++ XDKユーティリティ(UNIX)

実行可能ファイル

ディレクトリ

説明

schema

$ORACLE_HOME/bin

C XMLスキーマ・バリデータ

関連項目: 「C XML Schema Processorコマンドライン・ユーティリティの使用」

xml

$ORACLE_HOME/bin

C XMLパーサー

関連項目: 「C XML Parserコマンドライン・ユーティリティの使用」

xmlcg

$ORACLE_HOME/bin

C++ Class Generator

関連項目: 「XML C++ Class Generatorコマンドライン・ユーティリティの使用」

xsl

$ORACLE_HOME/bin

C XSLTプロセッサ

関連項目: 「C XSLT Processorコマンドライン・ユーティリティの使用」

xvm

$ORACLE_HOME/bin

C XVMプロセッサ

関連項目: 「XVM Processorコマンドライン・ユーティリティの使用」

オプションを付けないでこれらのユーティリティを実行すると、使用方法のヘルプが表示されます。詳細な使用方法の情報を表示するには、-hhフラグを付けてユーティリティを実行します。

UNIXでのC XDKコンパイル時環境の設定とテスト

表16-4 に、Cコンポーネントのコンパイルに必要なヘッダー・ファイルを示します。これらのファイルは、$ORACLE_HOME/xdk/includeにあります。コードをコンパイルする前に、実行時環境を設定する必要があります。

表16-4 C XDKのコンパイル時環境のヘッダー・ファイル

ヘッダー・ファイル

説明

oratypes.h

Oracle Cプライベート・データ型をインクルードします。

oraxml.h

libxml.aに含まれるOracle9i XML ORAデータ型とパブリックORA APIをインクルードします(下位互換性のみを目的としています)。かわりにxml.hを使用してください。

oraxmlcg.h

C++ Class Generator用のC APIをインクルードします(下位互換性のみを目的としています)。

oraxsd.h

Oracle9i XSDバリデータのデータ型とAPIをインクルードします(下位互換性のみを目的としています)。

xml.h

OCI経由で使用するか単独で使用するかにかかわらず、統合されたDOM APIを透過的に処理します。非推奨となったoraxml.hに置き換わります。

xmlerr.h

XMLエラーとエラーの番号をインクルードします。

xmlotn.h

単独でコンパイルするか、OCIを使用するかに応じて、その他のヘッダーをインクルードします。

xmlproc.h

libxml11.aのOracle XMLデータ型とXMLパブリック・パーサーのAPIをインクルードします。

xmlsch.h

Oracle XSDバリデータのパブリックAPIをインクルードします。

xmlptr.h

現在はマニュアルでの説明もサポートもされていない、XPointerのデータ型とAPIをインクルードします。

xmlxsl.h

XSLTプロセッサのデータ型とパブリックAPIをインクルードします。

xmlxvm.h

XSLTコンパイラとVMのデータ型とパブリックAPIをインクルードします。

UNIXでのC XDKコンパイル時環境のテスト

コンパイル時環境をテストする最も簡単な方法は、Oracle Database CDではなくExamplesメディアにあるサンプル・プログラムに対して、makeユーティリティを実行することです。デモをインストールした後、サンプル・プログラムは$ORACLE_HOME/xdk/demo/cディレクトリにあります。同じディレクトリにあるREADMEに、コンパイルの手順と使用上の注意が示されています。

サンプル・プログラムをビルドし、実行します。そのためには、システム・プロンプトで次のコマンドを実行します。

cd $ORACLE_HOME/xdk/demo/c
make

UNIXでのC XDKコンポーネントのバージョンの検証

使用しているXDKのバージョンを取得するには、ディレクトリを$ORACLE_HOME/libに移動し、次のコマンドを実行します。

strings libxml11.a | grep -i developers

C XDKコンポーネント用のWindows環境の構成

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

- WindowsでのC XDKコンポーネントの依存性

- WindowsでのC XDK環境変数の設定

- WindowsでのC XDK実行時環境のテスト

- WindowsでのC XDKコンパイル時環境の設定とテスト

- WindowsでのC XDKコンポーネントとVisual C/C++の使用

WindowsでのC XDKコンポーネントの依存性

この項で説明するCライブラリは、%ORACLE_HOME%/libにあります。次のライブラリにXDK Cコンポーネントが含まれます。

libxml11.dll

このライブラリに含まれるXDKコンポーネントは次のとおりです。

- XMLパーサー

- XSLTプロセッサ

- XSLTコンパイラ

- XSLT VM

- XML Schema Processor

表16-5に、XDK Cコンポーネント(Windows)が依存するOracleのCOREライブラリおよびGlobalization Supportライブラリを示します。

表16-5 XDK Cコンポーネントの依存ライブラリ(Windows)

コンポーネント

ライブラリ

説明

COREライブラリ

libcore11.dll

複数プラットフォームにわたる移植性を実現するランタイム関数を含みます。

Globalization Support共通ライブラリ

libnls11.dll

UTF-8、UTF-16およびISO-8859-1のキャラクタ・セットをサポートします。このライブラリは、エンコーディング・ファイルおよびメッセージ・ファイルを見つける際に環境に依存します。

Unicode用のGlobalization Supportライブラリ

libunls11.dll

『Oracle Databaseグローバリゼーション・サポート・ガイド』で説明しているキャラクタ・セットをサポートします。このライブラリは、エンコーディング・ファイルおよびメッセージ・ファイルを見つける際に環境に依存します。

WindowsでのC XDK環境変数の設定

表16-6 に、XDK Cコンポーネントを使用するときに必要なWindows環境変数を示します。

表16-6C XDKコンポーネントのWindowsでの環境設定

変数

説明

設定

%ORA_NLS10%

グローバリゼーション・サポート・キャラクタ・エンコーディング定義ファイルの場所を設定します。エンコーディング・ファイルは、Oracle Databaseで使用可能なキャラクタ・セットのサブセットを表します。

この変数には、グローバリゼーション・サポート・データ・ファイルの場所を設定します。この変数は次のように設定します。

set ORA_NLS10=%ORACLE_HOME%\nls\data

%ORA_XML_MESG%

XMLエラー・メッセージ・ファイルの場所を設定します。.msbで終わるファイルは、マシンで読取り可能な形式で、実行時に必要とされます。.msgで終わるファイルは、ユーザーが読取り可能な形式で、各エラーの原因および処理に関する説明が含まれます。

mesgディレクトリのパスを設定します。次に例を示します。

set ORA_XML_MESG=%ORACLE_HOME%\xdk\mesg

%PATH%

C XDK DLLおよび実行可能ファイルの場所を設定します。

PATHは次のように設定できます。

path %path%;%ORACLE_HOME%\bin

WindowsでのC XDK実行時環境のテスト

表16-7に示すいずれかのユーティリティを実行して、Windows実行時環境をテストできます。

表16-7 C/C++ XDKユーティリティ(Windows)

実行可能ファイル

ディレクトリ

説明

schema.exe

%ORACLE_HOME%\bin

C XMLスキーマ・バリデータ

関連項目: 「C XML Schema Processorコマンドライン・ユーティリティの使用」

xml.exe

%ORACLE_HOME%\bin

C XMLパーサー

関連項目: 「C XML Parserコマンドライン・ユーティリティの使用」

xmlcg.exe

%ORACLE_HOME%\bin

C++ Class Generator

関連項目: 「XML C++ Class Generatorコマンドライン・ユーティリティの使用」

xsl.exe

%ORACLE_HOME%\bin

C XSLTプロセッサ

関連項目: 「C XSLT Processorコマンドライン・ユーティリティの使用」

xvm.exe

%ORACLE_HOME%\bin

C XVMプロセッサ

関連項目: 「XVM Processorコマンドライン・ユーティリティの使用」

オプションを付けないでこれらのユーティリティを実行すると、使用方法のヘルプが表示されます。詳細な使用方法の情報を表示するには、-hhフラグを付けてユーティリティを実行します。

WindowsでのC XDKコンパイル時環境の設定とテスト

「UNIXでのC XDKコンパイル時環境の設定とテスト」の表16-4に、WindowsでのCコンポーネントのコンパイルに必要なヘッダー・ファイルを示しています。UNIXのインストールとWindowsのインストールの両方で、相対ファイル名は同じです。

Windowsでは、ヘッダー・ファイルは%ORACLE_HOME%\xdk\includeにあります。コードをコンパイルする前に、実行時環境を設定する必要があります。

WindowsでのC XDKコンパイル時環境のテスト

デモ・プログラムをコンパイルすることによって、コンパイル時環境をテストできます。Oracle Database Examplesメディアからインストールしたデモ・プログラムは、%ORACLE_HOME%\xdk\demo\cppにあります。同じディレクトリにあるREADMEに、コンパイルの手順と使用上の注意が示されています。デモ・プログラムをコンパイルする前に、「WindowsでのMake.batファイルの編集」の説明に従ってMake.batファイルを編集してください。

WindowsでのMake.batファイルの編集

%ORACLE_HOME%\xdk\demo\cフォルダの各サブフォルダに、Make.batファイルがあります。ライブラリおよびヘッダー・ファイルのパスをCOMPILEコマンドに追加して、各フォルダのMake.batファイルを更新する必要があります。/libpath:%ORACLE_HOME%\libですでにCライブラリが指定されているので、:LINKセクションのパスは編集する必要がありません。例16-2のMake.batファイルのセクションでは、追加する必要があるパスを太字のテキストで示しています。

例16-2 C XDKのMake.batファイルの編集(Windows)

:COMPILE
set filename=%1
cl -c -Fo%filename%.obj %opt_flg%  /DCRTAPI1=_cdecl /DCRTAPI2=_cdecl /nologo /Zl
/Gy /DWIN32 /D_WIN32 /DWIN_NT /DWIN32COMMON /D_DLL /D_MT /D_X86_=1
/Doratext=OraText -I. -I..\..\..\include -I%ORACLE_HOME%\xdk\include %filename%.c
goto :EOF

:LINK
set filename=%1
link %link_dbg% /out:..\..\..\..\bin\%filename%.exe
/libpath:%ORACLE_HOME%\lib /libpath:..\..\..\..\lib
%filename%.obj oraxml10.lib user32.lib kernel32.lib msvcrt.lib ADVAPI32.lib
oldnames.lib winmm.lib

WindowsでのC XDKコンパイラ・パスの設定

デモ用make.batファイルでは、cl.exeコンパイラの使用を想定しています。このコンパイラは、Microsoft .NET Framework Software Development Kit(SDK)に含まれ、無償で入手できます。

Windows XPでcl.exeコンパイラのパスを設定するには、次の手順を実行します。

1. 「スタート」メニュー→「設定」→「コントロール パネル」を選択します。

2. 「システム」をダブルクリックします。

3. 「システムのプロパティ」ダイアログ・ボックスで、「詳細」タブを選択し、「環境変数」をクリックします。

4. 「システム環境変数」リストで「Path」を選択し、「編集」をクリックします。

5. cl.exe のパスを%PATH%変数に追加し、「OK」をクリックします。

サンプル・プログラムをビルドし、実行します。そのためには、システム・プロンプトで次のコマンドを実行します。

cd $ORACLE_HOME/xdk/demo/c
make

WindowsでのC XDKコンポーネントとVisual C/C++の使用

Microsoft Visual C/C++でプロジェクトを設定し、XDKに付属しているデモに使用できます。

Visual C/C++でのプロジェクト・パスの設定(Windows)

プロジェクトのパスを設定するには、次の手順を実行します。

1. Visual C++で作業領域をオープンし、プロジェクト用の*.cファイルをインクルードします。

2. 「Tools」メニューにナビゲートし、「Options」を選択します。

3. 図16-1に示すとおり、「Directories」タブを選択し、インクルード・パスを%ORACLE_HOME%\xdk\includeに設定します。

図16-1 Visual C/C++でのインクルード・パスの設定

Visual C/C++でのライブラリ・パスの設定(Windows)

プロジェクトのライブラリ・パスを設定するには、次の手順を実行します。

1. Visual C++で作業領域をオープンし、プロジェクト用の*.cファイルをインクルードします。

2. 「Tools」メニューにナビゲートし、「Options」を選択します。

3. 図16-2に示すとおり、「Directories」タブを選択し、ライブラリ・パスを%ORACLE_HOME%\libに設定します。

図16-2 Visual C/C++での静的ライブラリ・パスの設定

4. %ORACLE_HOME%\lib内の静的ライブラリのパスを設定した後、Visual C++のコンパイル環境でライブラリ名を設定します。メニュー・バーで「Project」メニュー→「Settings」を選択します。

5. 図16-3に示すとおり、「Link」タブを選択し、「Object/Library Modules」フィールドにXDK Cコンポーネントのライブラリの名前を入力します。

図16-3 Visual C/C++プロジェクトでのライブラリ名の設定

統合C APIの概要

統合C APIは、XDKおよびOracle XML DBの両方で必要とされる機能を統合したプログラム・インタフェースです。このAPIは、主にXSLTおよびXMLスキーマで使用されます。

表16-4に示すように、統合C APIはxml.hヘッダー・ファイルで宣言します。表16-8に、C XDK APIの概要を示します。ドキュメントの詳細は、『Oracle XML APIリファレンス』を参照してください。

表16-8に、XDK C APIの概要を示します。

パッケージ

用途

コールバックAPI

XMLコールバックの関数(または関数ポインタ)を宣言するマクロを定義します。

DOM API

DOMを使用してXML文書を解析および操作します。このAPIはDOM 2.0仕様にできるだけ準拠していますが、オブジェクト指向のDOM仕様からフラットなCの名前空間へマッピングする際に、一部の名前を変更します。たとえば、オーバーロードされたgetName()メソッドをgetAttrName()に変更します。

範囲API

Rangeオブジェクトを作成および操作します。

SAX API

SAXを使用したイベントベースのXML解析を有効にします。

スキーマAPI

複数のXMLスキーマ文書から、特定のインスタンス・ドキュメントを検証するために使用できる単一のスキーマを作成します。

横断API

DOMツリーの文書の検索とナビゲーションを有効にします。

XML API

XMLデータの読取り方法およびアプリケーションに提供する必要がある情報について、XMLプロセッサを定義します。

XPath API

XPathに関連するタイプおよびインタフェースを処理します。

XPointer API

XML文書内のノードの場所を特定します。

XSLT API

XSL処理を実行します。

XSLTVM API

コンパイル済のXSLTコードを実行できる仮想マシンを実装します。

このAPIは、準拠するコンテキストによって関数の統合を実現します。最上位のXMLコンテキスト(xmlctx)は、連動するXMLコンポーネント間で共通の情報を共有します。このテキストは次のような情報を定義します。

- データ・エンコーディング

- エラー・メッセージ言語

- 下位の割当てコールバック

アプリケーションでは、DOMまたはSAXインタフェースを使用して文書を解析し、プログラム・アクセスを提供する前に、この情報が必要です。

XDKおよびOracle XML DBのどちらにおいても、最上位コンテキストおよびサービス・コンテキストに対し、異なる起動およびメモリー解放関数が必要です。初期化関数は実装固有の引数を取り、準拠するコンテキストを戻します。

準拠するコンテキストを使用すると、統合が可能です。準拠するコンテキストとは、戻されたコンテキストがxmlctxで始まる必要があることを意味します。この標準ヘッダーの後に、実装固有の追加部分が続く場合があります。

アプリケーションでは、xmlctxを取得した後は、統合されたDOMコールを使用し、すべてのコールにおいてxmlctxを最初の引数として使用します。

C XDKコンポーネントのグローバリゼーション・サポート

C XDKパーサーでは、300を超えるIANAキャラクタ・セットがサポートされています。サポートされているキャラクタ・セットには、「XDK for Cがサポートするキャラクタ・セット」に示したものが含まれます。キャラクタ・セットを使用する場合の注意事項を次に示します。

- 他のXMLパーサーとの相互運用性のために、IANAキャラクタ・セット名を使用することをお薦めします。

- XMLパーサーでサポートが必須とされているのはUTF-8とUTF-16のみであるため、これらのキャラクタ・セットを使用することをお薦めします。

- デフォルトの入力エンコーディング(インコーディング)はUTF-8です。入力文書のエンコーディングが(HTTP文字セット、バイト・オーダー・マーク、XMLDeclなどによって)自明ではない場合は、デフォルトの入力エンコーディングが想定されます。シングルバイト文字セット(US-ASCII、ISO 8859文字セットのいずれか)のみを使用している場合、明示的にデフォルトのエンコーディングを設定することをお薦めします。フラグXML_FLAG_FORCE_INCODINGは、入力文書には常にデフォルトの入力エンコーディングを適用する必要があることを指定します。この場合、BOMまたはXMLDeclは無視されます。ただし、プロトコル宣言(HTTP文字セットなど)は常にサポートされます。

- DOMおよびSAXのデータ・エンコーディング(アウトコーディング)は、慎重に選択してください。シングルバイト・エンコーディングは最速ですが、表示できる文字のセットは非常に限られています。次に高速なのはUnicode (UTF-16)で、最も遅いのは、UTF-8などのマルチバイト・エンコーディングです。入力データのアウトコーディングへの変換によりデータが失われると、エラーが発生します。最大限の効用を得るには、Unicodeベースのアウトコーディングを使用してください。アウトコーディングを指定しないと、デフォルトは、解析された最初のドキュメントのインコーディングに設定されます。

17 XSLT Processor for CおよびXVM Processor for Cの使用

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

- XVMプロセッサ

- XSLTプロセッサ

- ソフトウェアに含まれるデモ・ファイルの使用

注意:
新規のXDKおよびOracle XML DBアプリケーションには、新規の統合C APIを使用してください。以前のC関数は非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。
新しいCのAPIの詳細は、第18章「XML Parser for Cの使用」を参照してください。

XVMプロセッサ

Oracle XVMパッケージは、1999年11月16日のW3C勧告で指定されているとおりにXSL Transformation (XSLT)を実装します。このパッケージには、XSLTコンパイラおよびXSLT Virtual Machine (XVM)が含まれます。OracleによってXSLTコンパイラおよびXVMが実装されると、XSLT (バージョン1.0)をバイトコード形式でコンパイルできるようになります。XSLT仮想マシンは、コンパイル済のXSLTコードを実行するよう設計されたCPUのソフトウェアによる実装です。この仮想マシンでは、一連のバイトコードまたは「XSLT CPU」の機械命令にXSLTスタイルシートをコンパイルするコンパイラを想定します。バイトコード・プログラムは、プラットフォームに依存しない2バイト単位のシーケンスです。このプログラムは、異なるXVM上で格納、キャッシュおよび実行することが可能です。XVMでは、バイトコード・プログラムを使用してXMLインスタンス・ドキュメントを変換します。このため、コンパイル時の計算と実行時の計算は明確に区別され、命令間でのデータ交換には決まった方法が指定されます。この方法のメリットは次のとおりです。

- 異なるプラットフォーム上でも、XSLTスタイルシートをコンパイルしたり、1つのファイルに保存したり、頻繁に再利用することができます。

- XVMは他のXSLTプロセッサに比べて著しく高速であり、使用するメモリーは少ないです。

- バイトコードは言語に依存しません。そのため、CまたはC++のXSLTコンパイラで生成されたコードに違いはありません。

XVMの使用例

通常、パッケージAPIは、次の手順で使用されます。

1. XMLメタコンテキスト・オブジェクトを作成して使用します。

xctx = XmlCreate(&err,...);

2. XSLTコンパイラ・オブジェクトを作成して使用します。

comp = XmlXvmCreateComp(xctx);

3. XSLTスタイルシートまたはXPath式をコンパイルし、結果として戻るバイトコードを格納またはキャッシュします。

code = XmlXvmCompileFile(comp, xslFile, baseuri, flags, &err);

または

code = XmlXvmCompileDom (comp, xslDomdoc, flags, &err);

または

code = XmlXvmCompileXPath (comp, xpathexp,  namespaces, &err);

4. XVMオブジェクトを作成して使用します。XVMが「スタックがオーバーフローしました」のメッセージで終了するとき、または必要とするメモリー・フットプリントがより少ないときは、スタック・サイズを明示的に設定する必要があります。「XmlXvmCreate()」を参照してください。

vm = XmlXvmCreate(xctx, "StringStack", 32, "NodeStack", 24, NULL);

5. 出力を設定します(オプション)。デフォルトはストリームです。

err = XmlXvmSetOutputDom (vm, NULL);

または

err = XmlXvmSetOutputStream(vm, &xvm_stream);

または

err = XmlXvmSetOutputSax(vm, &xvm_callback, NULL);

6. スタイルシートのバイトコードをXVMオブジェクトに設定します。他のバイトコードを使用して繰り返すことができます。

len = XmlXvmGetBytecodeLength(code, &err);
err = XmlXvmSetBytecodeBuffer(vm, code, len);

または

err = XmlXvmSetBytecodeFile (vm, xslBytecodeFile);

7. XMLインスタンス・ドキュメントを変換するか、コンパイルしたXPath式を評価します。同じXML文書または他のXML文書を使用して繰り返すことができます。

err = XmlXvmTransformFile(vm, xmlFile, baseuri);

または

err = XmlXvmTransformDom (vm, xmlDomdoc);

または

obj  = (xvmobj*)XmlXvmEvaluateXPath (vm, code, 1, 1, node);

8. 出力ツリー・フラグメントを取得します(手順5でDOM出力が設定されている場合)。

node = XmlXvmGetOutputDom (vm);

9. オブジェクトを削除します。

XmlXvmDestroy(vm);
XmlXvmDestroyComp(comp);
XmlDestroy(xctx);

XVM Processorコマンドライン・ユーティリティの使用

次の方法で、コマンドラインからXVMプロセッサにアクセスします。

xvm

使用方法

xvm options xslfile xmlfile

xvm options xpath xmlfile

オプション

-c        Compile xslfile. The bytecode is in "xmlfile.xvm".
-ct       Compile xslfile and transform xmlfile.
-t        Transform xmlfile using bytecode from xslfile.
-xc       Compile xpath. The bytecode is in "code.xvm".
-xct      Compile and evaluate xpath with xmlfile.
-xt       Evaluate XPath bytecode from xpath with xmlfile.

例

xvm -ct  db.xsl db.xml
xvm -t   db.xvm db.xml
xvm -xct "doc/employee[15]/family" db.xml

XVM Processor for Cの入手方法

Oracle XVM Processor for Cは、Oracle Databaseの標準インストールに含まれています。

関連項目:

- 『Oracle Database XML C APIリファレンス』の「C用のXSLTVM APIパッケージ」

- http://www.oracle.com/technetwork/database-features/xdk/overview/index.html

XSLTプロセッサ

Oracle XSL/XPathパッケージは、1999年11月16日のW3C勧告で指定されたとおりにXSL Transformation (XSLT)を実装します。このパッケージには、XSLTプロセッサおよびXPathプロセッサが含まれます。より一般的な設計方法に従い、OracleによってXSLTプロセッサが実装されます。この方法では、コンパイラとプロセッサが1つのオブジェクトに融合されています。

XSLTプロセッサの使用例

通常、パッケージAPIは、次の手順で使用されます。

1. XMLメタコンテキスト・オブジェクトを作成して使用します。

xctx = XmlCreate(&err,...);

2. XSLTスタイルシートを解析します。

xslDomdoc = XmlLoadDom(xctx, &err, "file", xslFile, "base_uri", baseuri, NULL);

3. スタイルシート用のXSLTプロセッサを作成します。

xslproc = XmlXslCreate (xctx, xslDomdoc, baseuri, &err);

4. XMLインスタンス・ドキュメントを解析します。

xmlDomdoc = XmlLoadDom(xctx, &err, "file", xmlFile,  "base_uri", baseuri, NULL);

5. 出力を設定します(オプション)。デフォルトはDOMです。

err = XmlXslSetOutputStream(xslproc, &stream);

6. XML文書を変換します。この手順は、同じXML文書または他のXML文書を使用して繰り返すことができます。

err = XmlXslProcess (xslproc, xmlDomdoc, FALSE);

7. 出力を取得します(DOMの場合)。

node = XmlXslGetOutput(xslproc);

8. オブジェクトを削除します。

XmlXslDestroy(xslproc);
XmlDestroy(xctx);

XPathプロセッサの使用例

通常、パッケージAPIは、次の手順で使用されます。

1. XMLメタコンテキスト・オブジェクトを作成して使用します。

xctx = XmlCreate(&err,...);

2. XML文書を解析するか、既存のDOMから現行のノードを取得します。

node = XmlLoadDom(xctx, &err, "file", xmlFile,  "base_uri", baseuri, NULL);

3. XPathプロセッサを作成します。

xptproc = XmlXPathCreateCtx(xctx, NULL, node, 0, NULL);

4. XPath式を解析します。

exp = XmlXPathParse (xptproc, xpathexpr, &err);

5. XPath式を評価します。

obj = XmlXPathEval(xptproc, exp, &err);

6. オブジェクトを削除します。

XmlXPathDestroyCtx (xptproc);
XmlDestroy(xctx);

C XSLT Processorコマンドライン・ユーティリティの使用

C Oracle XSLT Processorは、次のようにbin/xsl:をコールすることによって、実行可能ファイルとしてコールできます。

xsl [switches] stylesheet instance
or
xsl -f [switches] [document filespec]

スタイルシートが指定されないと、出力は生成されません。スタイルシートはあるが出力ファイルがない場合は、出力はstdoutとなります。

表17-1に、コマンドライン・オプションを示します。

表17-1 XSLT Processor for C: コマンドライン・オプション

オプション

説明

-B BaseUri

XSLTプロセッサ用のベースURIを設定します。http://pqr/xsl.txtのBaseUriは、pqr.txtを解釈してhttp://pqr/pqr.txtに変換します。

-e encoding

デフォルトの入力ファイルのエンコーディングを指定します(-eeを強制)。

-E encoding

DOMまたはSAXエンコーディングを指定します。

-f

ファイル: URIではなくfilespecを解析します。

-G xptrexprs

ファイルに指定されたXPointerスキーマの例を評価します。

-h

ヘルプ: 使用方法を表示します。(詳細なオプションには-hhを使用します。)

-hh

詳細なオプションのリストを表示します。

-i n

XSLTプロセスを繰り返す回数。

-l language

エラーを報告する言語。

-o XSLoutfile

XSLTプロセッサの出力ファイルを指定します。

-v

バージョン: パーサーのバージョンを表示し、終了します。

-V var value

C XSLTで最上位の変数をテストします。

-w

空白: すべての空白を保持します。

-W

警告: 警告の後で解析を停止します。

Oracle XSLT Processor for Cの入手方法

Oracle XSLT Processor for Cは、Oracle Databaseの標準インストールに含まれています。

関連項目:

- 『Oracle Database XML C APIリファレンス』の「C用のXSLT APIパッケージ」

- 『Oracle Database XML C APIリファレンス』の「C用のXPath APIパッケージ」

- http://www.oracle.com/technetwork/database-features/xdk/overview/index.html

ソフトウェアに含まれるデモ・ファイルの使用

$ORACLE_HOME/xdk/demo/c/parser/ディレクトリには、XSLT for Cの使用方法を示すXMLアプリケーションがあります。

表17-2に、このディレクトリにあるファイルを示します。

表17-2 XSLT for Cのデモ・ファイル

サンプル・ファイル名

説明

XSLSample.c

XSLSampleプログラムのソース

XSLSample.std

XSLSampleからの予想される出力

class.xml

XSLSampleで使用できるXMLファイル

iden.xsl

XSLSampleで使用できるスタイルシート

cleo.xml

シェークスピアの戯曲のXMLバージョン

XVMSample.c

XSLT Virtual Machineおよびコンパイラの使用例。入力として、XMLファイルおよびXSLTスタイルシート・ファイルの2つのファイル名を取ります。

XVMXPathSample.c

XSLT Virtual Machineおよびコンパイラの使用例。入力として、XMLファイル名およびXPath式を取ります。評価されたXPath式の結果を生成します。

XSLXPathSample.c

XSL/XPathプロセッサの使用例。入力として、XMLファイル名およびXPath式を取ります。評価されたXPath式の結果を生成します。

XSLT for Cデモ・プログラムの作成

デモ・ディレクトリに移動し、READMEファイルを参照してください。このファイルには、サンプル・プログラムの作成方法がオペレーティング・システムごとに記載されています。

XSLTプロセッサのサンプルXSLSampleの使用方法が説明されています。ここでは、入力として、XMLファイルおよびXSLTスタイルシートの2つのファイルを取ります。

XSLSample xmlfile xslss

18 XML Parser for Cの使用

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

- XML Parser for Cの概要

- XML Parser for Cの使用

- DOM API for Cの使用

- orastream関数の使用

- SAX API for Cの使用

- XML Pull Parser for Cの使用

- OCIおよびXDK C APIの使用

XML Parser for Cの概要

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

- 前提条件

- 標準と仕様

関連項目:
DOMとSAXを使用したXML解析は、「XML Parsing for Javaの概要」を参照してください。概要の大部分の情報は特定の言語に依存しておらず、Cにも適用されます。

前提条件

Oracle XML Parser for Cは、XML文書を読み取り、DOMまたはSAX APIを使用して、そのコンテンツと構造へのプログラム・アクセスを可能にします。このパーサーは検証モードまたは非検証モードで使用できます。またPull Parserも使用可能です。

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

- Document Object Model (DOM): DOMは、XML文書の構造を示すインメモリー・ツリー表現です。

- Simple API for XML (SAX): SAXは、イベントベースのXML解析の標準です。

- XML Pull Parser for Cの使用: Pull ParserではXMLイベントが使用されます。

- Document Type Definition (DTD): XML DTDは、XML文書の有効な構造を定義します。

- XMLスキーマ: DTDと同様にXMLスキーマはXML文書の有効な構造を定義します。

- XML名前空間: 名前空間は、要素名や属性名を区別するためのメカニズムです。

前述のテクノロジの概要説明が必要な場合は、「はじめに」の「関連ドキュメント」にあるXMLの資料を参照してください。

標準と仕様

XML 1.0はW3C勧告です。C XDK APIはXML 1.0(Second Edition)をフル・サポートしています。Second Editionの仕様は次のURLにあります。

http://www.w3.org/TR/2000/REC-xml-20001006

DOMレベル1、レベル2およびレベル3の仕様はW3C勧告です。C XDK APIはDOMレベル1および2をフル・サポートしていますが、レベル3はサポートしていません。次のURLに、3つのレベルすべての仕様へのリンクがあります。

http://www.w3.org/DOM/DOMTR

SAXにはバージョン1.0と2.0があり、バージョン1.0は非推奨です。SAXはW3C仕様ではありません。C XDK APIはSAX 1.0および2.0の両方をフル・サポートしています。次のURLに、SAXのドキュメントがあります。

http://www.saxproject.org

XML名前空間はW3C勧告です。仕様は次のURLにあります。

http://www.w3.org/TR/REC-xml-names

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

XML Parser for Cの使用

Oracle XML Parser for Cは、XML文書が整形式であるかどうか、およびDTDに対して妥当であるかどうか(オプション)を確認します。アプリケーションでは、DOMまたはSAX APIを使用して、解析されたデータにアクセスできます。

Parser API for Cの概要

XML解析APIの中核は、XML、DOM、SAXの各APIです。表18-1に、これらのAPIのインタフェースを示します。APIに関するドキュメントの詳細は、『Oracle XML APIリファレンス』を参照してください。

表18-1 XML、DOM、SAXの各APIのインタフェース

パッケージ

インタフェース

関数名の表記規則

XML

このパッケージは、1つのXMLインタフェースを実装します。インタフェースは次のタスクの関数を定義します。

- コンテキストの作成と破棄。最上位のXMLコンテキスト(xmlctx)は、連動するXMLコンポーネント間で共通の情報を共有します。

- XML文書とDTDの作成と解析。

関数名は文字列Xmlで始まります。

APIのドキュメントは、『Oracle Database XML C APIリファレンス』を参照してください。

DOM

このパッケージは、解析済XMLへのプログラム・アクセスを提供します。このパッケージは次のインタフェースを実装します。

- Attrは、XML属性用のget関数およびset関数を定義します。

- CharacterDataは、文字データを操作する関数を定義します。

- Documentは、XMLノードを作成する関数、XML文書に関する情報を取得する関数、文書のDTDを設定する関数を定義します。

- DocumentTypeは、DTD用のget関数を定義します。

- Elementは、XML要素用のget関数およびset関数を定義します。

- Entityは、XMLエンティティ用のget関数を定義します。

- NameNodeMapは、名前付きノード用のget関数を定義します。

- Nodeは、XMLノード用のget関数およびset関数を定義します。

- NodeListは、ノード・リストを解放し、リストからノードを取得する関数を定義します。

- Notationは、ノードからシステムおよびパブリックIDを取得する関数を定義します。

- ProcessingInstructionは、命令を処理するget関数およびset関数を定義します。

- Textは、テキスト・ノードを2つに分割する関数を定義します。

関数名は文字列XmlDomで始まります。

APIのドキュメントは、『Oracle Database XML C APIリファレンス』を参照してください。

SAX

このパッケージは、解析済XMLへのプログラム・アクセスを提供します。このパッケージは、SAXイベントの通知を受け取る関数を定義するSAXインタフェースを実装します。

関数名は文字列XmlSaxで始まります。

APIのドキュメントは、『Oracle Database XML C APIリファレンス』を参照してください。

XML Pull Parser

XMLイベントとはXML文書の表現で、開始タグ、終了タグ、コメントなどのような一連のイベントで文書が表現されるSAXイベントに類似しています。SAXイベントはパーサー(生産者)によって駆動され、XMLイベントはアプリケーション(消費者)によって駆動されるという点で異なります。

関数名は文字列XmlEvで始まります。

APIのドキュメントは、『Oracle Database XML C APIリファレンス』を参照してください。

XML Parser for Cのデータ型

C XDKのデータ型の完全なリストは、『Oracle XML APIリファレンス』を参照してください。表18-2に、XML Parser for Cで使用するデータ型を示します。

表18-2 XML Parser for Cで使用するデータ型

データ型

説明

oratext

文字列ポインタ

xmlctx

マスターXMLのコンテキスト

xmlsaxcb

SAXコールバック構造(SAXのみ)

ub4

32ビット以上の符号なし整数

uword

ネイティブな符号なし整数

XML Parser for Cのデフォルト

XML Parser for Cのデフォルトは、次のとおりです。

- キャラクタ・セットのエンコーディングはUTF-8です。ドキュメントがすべてASCII形式である場合は、パフォーマンス向上のために、エンコーディングをUS-ASCIIに設定することをお薦めします。

- パーサーのメッセージは、エラー・ハンドラが提供されていないかぎり、stderrに出力されます。

- パーサーは入力文書が整形式であるかどうかを確認しますが、妥当であるかどうかは確認しません。プロパティ"validate"を設定することで、入力の妥当性を検証できます。

注意:
シングルバイト・キャラクタ・セット(US-ASCII、ISO 8859キャラクタ・セットのいずれかなど)のみを使用している場合、明示的にデフォルトのエンコーディングを設定することをお薦めします。UTF-8などのマルチバイト・キャラクタ・セットを使用した場合よりパフォーマンスが向上します。

- パーサーは、空白を処理するときにXML 1.0仕様に準拠します。つまり、パーサーはアプリケーションにすべての空白を報告し、どの空白が無視できる空白であるかを示します。ただし、アプリケーションによっては、プロパティ"discard-whitespace"を設定し、要素の終了タグと次の要素の開始タグの間のすべての空白を削除する方が適切な場合もあります。

関連項目:

- DOM、SAX、Pull ParserおよびコールバックのAPIの詳細は、『Oracle Database XML C APIリファレンス』を参照してください。

- http://www.oracle.com/technetwork/database-features/xdk/overview/index.html

XML Parser for Cのコール順序

図18-1に、XML Parser for Cのコール順序を示します。

図18-1 XML Parser for Cのコール順序

XML Parser for Cの使用: 基本プロセス

アプリケーションで次の手順を実行します。

1. XmlCreate()関数を使用して解析プロセスを初期化します。次のサンプル・コード部分は、DOMNamespace.cからの抜粋です。

xmlctx     *xctx;
...
xctx = XmlCreate(&ecode, (oratext *) "namespace_xctx", NULL);

2. 入力項目を解析します。入力項目はXML文書または文字列バッファのどちらかです。
DOMを使用して解析する場合、XmlLoadDom()関数をコールします。次のサンプル・コード部分は、DOMNamespace.cからの抜粋です。

xmldocnode *doc;
...
doc = XmlLoadDom(xctx, &ecode, "file", DOCUMENT,
"validate", TRUE, "discard_whitespace", TRUE, NULL);

SAXを使用して解析する場合、XmlLoadSax()関数をコールします。次のサンプル・コード部分は、SAXNamespace.cからの抜粋です。

xmlerr      ecode;
...
ecode = XmlLoadSax(xctx, &sax_callback, &sc, "file", DOCUMENT,
"validate", TRUE, "discard_whitespace", TRUE, NULL);

Pull Parserを使用する場合は、イベント・コンテキストを作成して解析する文書ロードするために次の手順が含まれます。

evctx = XmlEvCreatePPCtx(xctx, &xerr, NULL);
XmlEvLoadPPDoc(xctx, evctx, "File", input_filenames[i], 0, NULL);

3. DOMインタフェースを使用する場合は、次の手順が含まれます。

- XmlLoadDom()関数を使用して、XmlDomGetDocElem()をコールします。この手順により、他のDOM関数がコールされます。通常、これらの関数は、必要に応じてDOM文書を出力するノード関数または出力関数です。次のサンプル・コード部分は、DOMNamespace.cからの抜粋です。

printElements(xctx, XmlDomGetDocElem(xctx, doc));

- XmlFreeDocument()関数をコールし、解析プロセス中に作成されたすべてのデータ構造を削除します。次のサンプル・コード部分は、DOMNamespace.cからの抜粋です。

XmlFreeDocument(xctx, doc);

SAXインタフェースを使用する場合は、次の手順が含まれます。

- 次のようなコールバック関数でXmlLoadSax()のコール結果を処理します。

xmlsaxcb saxcb = {
UserStartDocument,  /* user's own callback functions */
UserEndDocument,
/* ... */
};

if (XmlLoadSax(xctx, &saxcb, NULL, "file", "some_file.xml", NULL) != 0)
/* an error occured */

- コールバック関数を登録します。不要なSAXコールバック関数は、すべてNULLに設定できることに注意してください。

Pull Parserを使用する場合は、次を使用してイベントを繰り返します。

cur_event = XmlEvNext(evctx);

Get APIを使用してイベントに関する情報を取得します。

4. XmlFreeDocument()を使用して、解析中に使用されたメモリーと構造を削除します。XMLFreeDocument()またはXMLDestroy()をコールするまで、SAXコールバック関数に渡されたパラメータに割り当てられたメモリー、またはDOM解析ツリーとともに格納されたノードおよびデータに割り当てられたメモリーは解放されません。次のサンプル・コード部分は、DOMNamespace.cからの抜粋です。

XmlFreeDocument(xctx, doc);

手順2に戻るか、次の手順に進みます。

Pull ParserはXmlEvCleanPPCtx()をコールして解析中に使用されたメモリーと構造を公開します。アプリケーションは、別の文書を解析するためにXmlEvLoadPPDoc()を再度コールできます。または、Pull Parserコンテキストを再度使用できなくなった後は、XMLEvDestroyPPCtx()をコールできます。

XmlEvCleanPPCtx(xctx, evctx);
...
XmlEvDestroyPPCtx(xctx, evctx);

5. XmlDestroy()を使用して解析プロセスを終了します。次のサンプル・コード部分は、DOMNamespace.cからの抜粋です。

(void) XmlDestroy(xctx);

初期化から終了までのコール順序の途中でスレッドが分岐している場合、アプリケーションで不適切な動作および結果が発生する場合があります。

独自のメモリー割当てにはメモリー・コールバック関数XML_ALLOC_FおよびXML_FREE_Fを使用できます。その場合、両方の関数を指定します。

関連項目:
「XML Pull Parser for Cの使用」

XML Parser for Cのデモ・プログラムの実行

$ORACLE_HOME/xdk/demo/c/(UNIXの場合)および%ORACLE_HOME%\xdk\demo\c(Windowsの場合)ディレクトリには、DOMインタフェースおよびSAXインタフェースによるXML Parser for Cの使用方法を示すXMLアプリケーションがあります。表18-3に、デモを示します。

makeユーティリティでは、ソース・ファイルfileName.cをコンパイルし、デモ・プログラムfileNameおよび出力ファイルfileName.outを作成できます。予期される出力は、fileName.stdです。

表18-3 Cパーサーのデモ

ディレクトリ

内容

デモ

dom

DOMNamespace.c
DOMSample.c
FullDom.c
FullDom.xml
NSExample.xml
Traverse.c
XPointer.c
class.xml
cleo.xml
pantry.xml

次のデモ・プログラムではDOM APIを使用します。

- DOMNamespaceプログラムでは、DOM APIに名前空間による拡張を使用します。NSExample.xmlのすべての要素と属性、および名前空間に関するすべての情報が出力されます。

- DOMSampleプログラムでは、DOM APIを使用して、Cleopatraの概要(XML要素のACTおよびSCENE)を表示します。cleo.xml文書には、『The Tragedy of Antony and Cleopatra』(シェイクスピア戯曲のXMLバージョン)が入っています。

- FullDomプログラムでは、DOMインタフェース全体の使用例を示します。すべてのコールを実行します。このプログラムでは、エンティティの使用方法を示すFullDom.xmlを入力として受け入れます。

- Traverseプログラムでは、DOMイテレータ、ツリー・ウォーカーおよび範囲の使用方法を示します。プログラムでは、大学の計算法科目を示すclass.xml文書を入力として受け入れます。

- XPointerプログラムでは、pantry.xmlで<pantry>要素の子を検索して、XMLポインタ言語の使用方法を示します。

sax

NSExample.xml
SAXNamespace.c
SAXSample.c
cleo.xml

次のデモ・プログラムではSAX APIを使用します。

- SAXNamespaceプログラムでは、SAX APIに名前空間による拡張を使用します。NSExample.xmlのすべての要素と属性、および名前空間に関するすべての情報が出力されます。

- SAXSampleプログラムでは、SAX APIを使用して、戯曲Cleopatra内の、指定されたワードを含むすべてのせりふを表示します。ワードを指定しない場合は、ワード"death"が使用されます。cleo.xml文書には、『The Tragedy of Antony and Cleopatra』(シェイクスピア戯曲のXMLバージョン)が入っています。

サンプル・プログラムのコンパイルおよび実行方法を説明するドキュメントは、同じディレクトリ内のREADMEにあります。基本手順は次のとおりです。

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

2. 「UNIXでのC XDK環境変数の設定」および「WindowsでのC XDK環境変数の設定」の説明に従って、環境変数が設定されていることを確認します。

3. システム・プロンプトでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。makeユーティリティでは、ディレクトリをデモ・サブディレクトリに変更し、makeを実行して次の処理を行います。

1. ccユーティリティでCソース・ファイルをコンパイルします。たとえば、$ORACLE_HOME/xdk/demo/c/domディレクトリのMakefileには、次の行があります。

$(CC) -o DOMSample $(INCLUDE) $@.c $(LIB)

2. 各デモ・プログラムを実行し、出力をファイルにリダイレクトします。たとえば、$ORACLE_HOME/xdk/demo/c/domディレクトリのMakefileには、次の行があります。

./DOMSample > DOMSample.out

4. プログラムごとに*.stdファイルと*.outファイルを比較します。*.stdファイルには、各プログラムの予期される出力が入っています。たとえば、DOMSample.stdには、DOMSampleの実行で予期される出力が入っています。

XML Parser for Cコマンドライン・ユーティリティの使用

$ORACLE_HOME/bin (UNIXの場合)または%ORACLE_HOME%\bin (Windowsの場合)にあるxmlユーティリティは、XML文書を解析するコマンドライン・インタフェースです。XML文書が整形式であるか、および妥当であるかを確認します。

xmlを使用するには、「UNIXでのC XDK環境変数の設定」および「WindowsでのC XDK環境変数の設定」の説明に従って、環境が設定されていることを確認します。

コマンドラインで次の構文を使用して、xmlを起動します。Windowsではxml.exeを使用します。

xml [options] [document URI]
xml -f [options] [document filespec]

表18-4に、コマンドライン・オプションを示します。

表18-4 C XML Parserのコマンドライン・オプション

オプション

説明

-B BaseURI

XSLTプロセッサのベースURIを設定します。http://pqr/xsl.txtのベースURIでは、pqr.txtをhttp://pqr/pqr.txtに解決します。

-c

入力文書が整形式であるかどうかを確認しますが、妥当であるかどうかは確認しません。

-e encoding

デフォルトの入力ファイルのエンコーディング(インコーディング)を指定します。

-E encoding

DOM/SAXのエンコーディング(アウトコーディング)を指定します。

-f file

ファイルをURIではなくfilespecとして解析します。

-G xptr_exprs

ファイルに指定されたXPointerスキームの例を評価します。

-h

使用方法のヘルプおよびコマンドライン・オプションの基本リストを表示します。

-hh

コマンドライン・オプションの詳細なリストを表示します。

-i n

XSLTプロセスを繰り返す回数を指定します。

-l language

エラー報告用の言語を指定します。

-n

DOMを検索し、要素の数を報告します。次に、出力例を示します。

ELEMENT       1
PCDATA       1
DOC       1
TOTAL       3 * 60 = 180

-o XSLoutfile

XSLTプロセッサの出力ファイルを指定します。

-p

解析後の文書/DTDの構造を出力します。たとえば、ルート要素<greeting>hello</greeting>は次のように出力されます。

+---ELEMENT greeting
+---PCDATA "hello"

-P

ルート要素から文書を出力します。たとえば、ルート要素<greeting>hello</greeting>は次のように出力されます。

<greeting>hello</greeting>

-PP

ルート・ノード(DOC)からXML宣言を含めて出力します。

-PE encoding

-Pまたは-PPの出力のエンコーディングを指定します。

-PX

出力にXML宣言を含めます。

-s stylesheet

XSLTスタイルシートを指定します。

-v

XDKパーサーのバージョンを表示した後、終了します。

-V var value

CXSLTの最上位の変数をテストします。

-w

すべての空白を保持します。

-W

警告の後で解析を停止します。

-x

SAXインタフェースを実行し、文書を出力します。次に出力例を示します。

StartDocument
XMLDECL version='1.0' encoding=FALSE
<greeting>
"hello"
</greeting>
EndDocument

XML Parser for Cコマンドライン・ユーティリティの使用: 例

$ORACLE_HOME/xdk/demo/cにある様々なXMLファイルに対してxmlをテストできます。例18-1に、NSExample.xmlの内容を示します。

例18-1 NSExample.xml

<!DOCTYPE doc [
<!ELEMENT doc (child*)>
<!ATTLIST doc xmlns:nsprefix CDATA #IMPLIED>
<!ATTLIST doc xmlns CDATA #IMPLIED>
<!ATTLIST doc nsprefix:a1 CDATA #IMPLIED>
<!ELEMENT child (#PCDATA)>
]>
<doc nsprefix:a1 = "v1" xmlns="http://www.w3c.org"
xmlns:nsprefix="http://www.oracle.com">
<child>
This element inherits the default Namespace of doc.
</child>
</doc>

次の例に示すように、このファイルを解析し、要素数を計算し、DOMツリーを表示できます。

xml -np NSEample.xml > xml.out

次の例に、出力を示します。

例18-2 xml.out

ELEMENT       2
PCDATA       1
DOC       1
DTD       1
ELEMDECL       2
ATTRDECL       3
TOTAL      10 * 112 = 1120
+---ELEMENT doc [nsprefix:a1='v1'*, xmlns='http://www.w3c.org'*, xmlns:nsprefix=
'http://www.oracle.com'*]
+---ELEMENT child
+---PCDATA "
This element inherits the default Namespace of doc.
"

DOM API for Cの使用

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

- C APIに対応するXML文書のデータ・エンコーディングの制御

- NULL文字終了および長さエンコードのC API関数の使用

- C APIを使用したエラー処理

C APIに対応するXML文書のデータ・エンコーディングの制御

XMLデータは多くのエンコーディングに存在します。XMLエンコーディングは次のように制御できます。

- 自己記述的でないファイルに対して前提とするデフォルト・エンコーディングの指定

- DOMまたはSAXの表示用エンコーディングの指定

- DOMがシリアライズされている場合の再エンコーディング

入力XMLデータは常にエンコードされています。UTF-16など、エンコーディングによっては完全に自己記述的なものがあり、この場合は実際のデータの開始前に特定のBOMが必要です。文書のXMLDeclまたはMIMEヘッダーでもエンコーディングを指定できます。アプリケーションで特定のエンコーディングを決定できない場合、デフォルトの入力エンコーディングが適用されます。デフォルトを指定していない場合、ASCIIプラットフォームではUTF-8、EBCDICプラットフォームではUTF-Eが想定されます。

APIでは、入力文書のエンコーディング・データが不正である場合に備えて、対策が取られています。たとえば、encoding=asciiと記述されているXMLDeclが含まれるASCII文書がEBCDICに変換されたとします。新しいEBCDIC文書には、(EBCDIC内に)文書がASCIIであると誤って主張するXMLDeclが含まれます。XMLデータを再エンコードするプログラムの正しい動作は、XMLDeclの変換ではなく、これを再生成することです。XMLDeclは、データそのものではなく、メタデータです。しかし、このルールは無視されることが多く、そのため不正な文書が生成されます。この問題を回避するため、APIには入力エンコーディングの強制的な設定を可能にする追加フラグが提供されており、不正なXMLDeclの問題が解決されています。

入力エンコーディングを決定するための優先順位ルールは、次のとおりです。

1. ユーザーが指定した強制エンコーディング

注意:
競合が存在する場合、強制エンコーディングによって致命的エラーになる可能性があります。たとえば、入力文書がUTF-16であり、UTF-16 BOMで始まっているにもかかわらず、ユーザーが強制UTF-8エンコーディングを指定したとします。この場合、パーサーによって競合に関するエラーが発行されます。

2. プロトコル仕様(HTTPヘッダーなど)

3. XMLDecl仕様

4. ユーザーのデフォルト入力エンコーディング

5. デフォルト(ASCIIプラットフォームではUTF-8、EBCDICプラットフォームではUTF-E)

アプリケーションでは、入力エンコーディングが決定された後、ドキュメントの解析およびデータの表示が可能になります。表示用エンコーディングを選択できます。元の入力エンコーディングにかかわらず、データにはこの表示用エンコーディングが実行されます。

アプリケーションでシリアライズ形式でDOMを書き戻す時点で、表示用データの再エンコードを選択できます。したがって、シリアライズされた文書を任意のエンコーディングにすることができます。

NULL文字終了および長さエンコードのC API関数の使用

Cにおけるネイティブな文字列表現はNULL文字で終了します。そのため、プライマリDOMインタフェースではNULL文字で終了する文字列が使用され、戻されます。ただし、Oracle XML DBデータが表形式で格納されている場合、NULLで終了するのではなく、長さがエンコードされます。したがって、XDKでは、頻度の高い場合にパフォーマンスを向上させるために、長さエンコードAPIの追加セットが提供されます。特に、表18-5のDOM関数には2つのAPIがあります。

表18-5 NULL文字終了および長さエンコードのC API関数

NULL文字終了API

長さエンコードAPI

XmlDomGetNodeName()

XmlDomGetNodeNameLen()

XmlDomGetNodeLocal()

XmlDomGetNodeLocalLen()

XmlDomGetNodeURI()

XmlDomGetNodeURILen()

XmlDomGetNodeValue()

XmlDomGetNodeValueLen()

XmlDomGetAttrName()

XmlDomGetAttrNameLen()

XmlDomGetAttrLocal()

XmlDomGetAttrLocalLen()

XmlDomGetAttrURI()

XmlDomGetAttrURILen()

XmlDomGetAttrValue()

XmlDomGetAttrValueLen()

C APIを使用したエラー処理

C API関数では、通常、数値のエラー・コード(成功の場合は0(ゼロ)、失敗の場合は0(ゼロ)以外)が戻されるか、または変数によりエラー・コードが戻されます。いずれの場合も、APIによってエラー・コードが格納されます。アプリケーションでは、XmlDomGetLastError()関数をコールして、最新のエラーを取得できます。

デフォルトでは、関数出力エラー・メッセージはstderrに出力されます。ただし、初期化の際にエラー・メッセージ・コールバックを登録できます。エラーが発生すると、登録済コールバックがコールされ、エラーは出力されません。

orastream関数の使用

orastream関数APIは、1つのピースですべて取得するかわりに、大規模なチャンクのデータをノードからストリームするインタフェースです。したがって、64KBより大きいノードにアクセスできます。

orastream APIは、汎用入力または出力ストリームを表します。XDKユーザーはxml.hを介して、このインタフェースを使用します。これは、このインタフェースを実装するorastreamデータ構造および関数のセットにより定義されます。ストリームの作成者は、ストリーム関数アドレスのリストおよびストリーム・コンテキストをOraStreamInitに渡します。この関数は、orastream構造のインスタンスを戻します。

初期化の時点で、多数のストリーム・プロパティを指定します。読取りまたは書込みが指定された場合、ストリームはOraStreamRead()およびOraStreamWrite()を使用してバイト・モードで動作します。"read_char"または"write_char"が指定された場合、ストリームはOraStreamReadChar()およびOraStreamWriteChar()を使用してキャラクタ・モードで動作します。キャラクタ・モードの場合、完全な文字のみを読み込みまたは書き込み、バッファ境界を越えて分割しません。

ストリーム・コンテキストは、orastreamの状態を表すのに使用され、ストリームの存続期間中、存続します。

Javaの入力または出力ストリームと同様、常に、データのソースまたはシンクを指定します。出力ストリームはデータを移入する外部ストリームまたはオブジェクトのアドレスを格納します。同様に、入力ストリームは読み込まれるオブジェクトのアドレスを格納します。

次に、orastream関数の例を示します。

struct orastream;
typedef struct orastream orastream;
typedef ub4 oraerr; /* Error code: zero is success, non-zero is failure */

/* Initialize (Create) & Destroy (Terminate) stream object */

orastream  *OraStreamInit(void *sctx, void *sid, oraerr *err, ...);
oraerr     OraStreamTerm(orastream *stream);

/* Set or Change SID (streamID) for stream (returns old stream ID through osid)*/

oraerr     OraStreamSid(orastream *stream, void *sid, void **osid);

/* Is a stream readable or writable? */

boolean    OraStreamReadable(orastream *stream);
boolean    OraStreamWritable(orastream *stream);

/* Open & Close stream */

oraerr     OraStreamOpen(orastream *stream, ubig_ora *length);
oraerr     OraStreamClose(orastream *stream);

/* Read | Write byte stream */

oraerr     OraStreamRead(orastream *stream, oratext *dest, ubig_ora size,
oratext **start, ubig_ora *nread, ub1 *eoi);
oraerr     OraStreamWrite(orastream *stream, oratext *src, ubig_ora size,
ubig_ora *nwrote);

/* Read | Write char stream */

oraerr     OraStreamReadChar(orastream *stream, oratext *dest, ubig_ora size,
oratext **start, ubig_ora *nread, ub1 *eoi);
oraerr     OraStreamWriteChar(orastream *stream, oratext *src, ubig_ora size,
ubig_ora *nwrote);

/* Return handles for stream */

orastreamhdl *OraStreamHandle(orastream *stream);

/* Returns status: if the stream object is currently opened or not */

boolean OraStreamIsOpen(orastream *stream);

ストリーム・エラー・コードは次のとおりです。

#define ORASTREAM_ERR_NULL_POINTER      1      /* NULL pointer given */
#define ORASTREAM_ERR_BAD_STREAM        2      /* invalid stream object */
#define ORASTREAM_ERR_WRONG_DECTION     3      /* tried wrong-direction I/O */
#define ORASTREAM_ERR_UNKNOWN_PROPERTY  4      /* unknown creation prop */
#define ORASTREAM_ERR_NO_DIRECTION      5      /* neither read nor write? */
#define ORASTREAM_ERR_BI_DIRECTION      6      /* both read any write? */
#define ORASTREAM_ERR_NOT_OPEN          7      /* stream not open */
#define ORASTREAM_ERR_WRONG_MODE        8      /* wrote byte/char mode */
/* --- Open errors --- */
#define ORASTREAM_ERR_CANT_OPEN         10     /* can't open stream */
/* --- Close errors --- */
#define ORASTREAM_ERR_CANT_CLOSE        20     /* can't close stream */

関連項目:
orastream APIのパラメータ定義などの参考情報は、『Oracle Database XML C APIリファレンス』を参照してください。

例18-3 orastream関数の使用

int test_read()
{
xmlctx *xctx = NULL;
oratext *barray, *docName = "NSExample.xml";
orastream* ostream = (orastream *) 0;
xmlerr ecode = 0;
ub4 wcount = 0;
ubig_ora  destsize, nread;
oraerr oerr = 0;
ub1 eoi = 0;
nread = destsize = 1024;
if (!(xctx = XmlCreateNew(&ecode, (oratext *)"stream_xctx", NULL, wcount,
NULL)))
{
printf("Failed to create XML context, error %u\n", (unsigned)ecode);
return -1;
}

barray = XmlAlloc(xctx, sizeof(oratext) * destsize);

/* open function should be specified in order to read correctly. */
if (!(ostream = OraStreamInit(NULL,docName, (oraerr *)&ecode,
"open", fileopen,
"read", fileread,
NULL)))
{
printf("Failed to initialize OrsStream, error %u\n",(unsigned)ecode);
return -1;
}

/* check readable and writable  */
if (OraStreamReadable(ostream))
printf("ostream is readable\n");
else
printf("ostream is not readable\n");

if (OraStreamWritable(ostream))
printf("ostream is writable\n");
else
printf("ostream is not writable\n");

if (oerr = OraStreamRead(ostream, barray, destsize, &barray, &nread, &eoi))
{
printf("Failed to read due to orastream was not open, error %u\n", oerr);
}

/* open orastream */
OraStreamOpen(ostream, NULL);

/* read document */
OraStreamRead(ostream, barray, destsize, &barray, &nread, &eoi);

OraStreamTerm(ostream);

XmlDestroy(xctx);
return 0;
}
ORASTREAM_OPEN_F(fileopen, sctx, sid, hdl, length)
{
FILE *fh = NULL;

printf("Opening orastream %s...\n", (oratext *)sid);

if (sid && ((fh= fopen(sid, "r")) != NULL))
{
printf("Opening orastream %s...\n", (oratext *)sid);
}
else
{
printf("Failed to open input file.\n");
return -1;
}

/* store file handle generically, NULL means stdout */
hdl->ptr_orastreamhdl = fh;

return XMLERR_OK;
}

ORASTREAM_READ_F(fileread, sctx, sid, hdl,
dest, size, start, nread, eoi)
{
FILE *fh = NULL;
int i =0;
printf("Reading orastream %s ...\n", (oratext *)sid);

// read data from file to dest
if ((fh = (FILE *) hdl->ptr_orastreamhdl) != NULL)
*nread = fread(dest, 1, size, fh);
printf("Read %d bytes from orastream...\n", (int) *nread);

*eoi = (*nread < size);
if (start)
*start = dest;

printf("printing document ...\n");
for(i =0; i < *nread; i++)
printf("%c", (char)dest[i]);
printf("\nend ...\n");
return ORAERR_OK;
}

SAX API for Cの使用

SAXを使用するには、xmlsaxcb構造を関数ポインタで初期化し、XmlLoadSax()に渡します。また、各SAX関数に渡す、ユーザー定義コンテキスト構造へのポインタを含めることができます。

関連項目:
SAXコールバック構造については、『Oracle Database XML C APIリファレンス』を参照してください。

XML Pull Parser for Cの使用

XML Pull Parserは、XMLイベント・インタフェースを実装しています。

XML Pull ParserとSAXパーサーは類似していますが、Pull Parserを使用する場合はアプリケーション(コンシューマ)がイベントを駆動する一方、SAXパーサーの場合はパーサー(プロデューサ)がイベントを駆動します。XML Pull ParserとSAXのいずれも、開始タグ、終了タグおよびコメントを使用してドキュメントを一連のイベントとして表示します。XML Pull Parserは単純な一連のAPIおよび基礎となる一連のイベントを表示することでアプリケーションに制御を渡します。SAXなどのコールバック内でイベントを処理するのではなく、XmlEvNextのようなメソッドを使用して、アプリケーションは次のイベントをリクエストしたり、または取り出すことができます。そのため、アプリケーションではXML処理においてより手続き的な制御を行います。また、ドキュメント全体を解析するSAXアプリケーションとは異なり、処理を途中で停止することもできます。

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

- 基本的なXML Pull Parsing機能の使用

- 複数のXML文書の解析

- IDコールバック

- XML Pull Parserのエラー処理

- サンプルPull Parserアプリケーション

基本的なXML Pull Parsing機能の使用

XML Pull Parserを使用するには、示される順序に従って、次の操作を行いません。

1. XmlCreateをコールしてXMLメタコンテキストを初期化します。

2. イベント・コンテキストを作成して戻すXmlEvCreatePPCtx関数をコールしてPull Parserコンテキストを初期化します。
XmlEvCreatePPCtx関数は、XmlLoadDomおよびXmlLoadSaxなどにサポートされるすべてのプロパティをサポートします。

XmlEvCreatePPCtx関数およびXmlEvCreatePPCtxVA関数は完全に実装されています。

3. イベント・コンテキストが、Pull Parserへのすべての副問合せコールに渡されることを確認します。

4. XmlEvDestoryPPCtx関数をコールしてPull Parserコンテキストを終了し、メモリーを削除します。

5. XmlDestoryCtx関数をコールしてXMLメタコンテキストを削除します。

XMLイベント・コンテキスト

例18-4に、イベント・コンテキストの構造を示します。

例18-4 XMLイベント・コンテキスト

typedef  struct {
void *ctx_xmlevctx;                   /* implementation specific context */
xmlevdisp *disp_xmlevctx;             /* dispatch table */
ub4 checkword_xmlevctx;               /* checkword for integrity check */
ub4 flags_xmlevctx;                   /* mode; default: expand_entity */
struct xmlevctx *input_xmlevctx;      /* input xmlevctx; chains the XML Event
context */
} xmlevctx;

XMLイベント・コンテキストの概要

各XML Pull Parserでは、固有のコンテキストの作成および固有のAPI関数の実装が可能です。

- ディスパッチ表
disp_xmlevctxというディスパッチ表には、XmlEvCreatePPCtx関数、XmlEvCreatePPCtxVA関数、XmlEvDestoryPPCtx関数、XmlEvLoadPPDoc関数、およびXmlEvCleanPPCtx関数を除いて、各API関数に1つのポインタが含まれます。

イベント・コンテキストが作成されると、ポインタdisp_xmlevctxは静的表のアドレスで初期化されます。

- 実装固有のイベント・コンテキスト
フィールドctx_xmlevctxは、特定の実装の起動に固有のコンテキストのアドレスで初期化される必要があります。実装固有のイベント・コンテキストは*void型なので、別のアプリケーションとは異なります。

- 入力イベント・コンテキスト
各Pull Parserは、xmlevctxという入力イベント・コンテキストを指定できます。このフィールドでは、パーサーにより複数のイベント生産者を連鎖させることが可能です。結果として、コンテキストでディスパッチ関数がNULLと指定されている場合、アプリケーションは入力イベント・コンテキストの連鎖にある次のNULL以外のディスパッチ関数を使用します。基本的なxmlevctxでは、すべてのディスパッチ関数のポインタはNULL以外であることを確認する必要があります。

複数のXML文書の解析

XMLイベント・コンテキストを作成して初期化した後、XmlEvLoadPPDocおよびXmlEvCleanPPCtxに対して繰り返されたコールを使用して複数の文書を解析できます。これらの関数は完全に実装されています。

XMLイベント・コンテキスト作成中にアプリケーションによって定義されたプロパティは、XmlLoadPPDoc関数への各コールに対して変更できないことに注意してください。プロパティを変更する場合は、イベント・コンテキストを削除して再作成します。

XmlEvCleanPPCtxにより現行のパーサーの内部構造を削除した後、イベント・コンテキストを再利用して別の文書を分析できます。

IDコールバック

コールバックを提供して、テキストベースの名前から8バイトのIDに変換できます。

コールバック関数署名

typedef  sb8 (*xmlev_id_cb_funcp)( void *ctx , ub1 type, ub1 *token, ub4 tok_len,
sb8 nmspid, boolean isAttribute);

戻り値

sb8は8バイトのIDです。

引数

- *ctxはコンテキスト実装です。

- typeは次の列挙に含まれる型です。

typedef enum
{
XML_EVENT_ID_URI,
XML_EVENT_ID_QNAME,
}xmlevidtype;

- *tokenおよびtok_lenは変換される実際のテキストです。

- nmspidは名前空間IDです。

- isAttributeは単一の属性を示すブール値です。

XmlEvGetTagIdおよびXmlEvGetAttrID APIは内部的にこのコールバックを2回コールし、1回は名前空間IDをフェッチし、他の1回はタグの実際のIDまたはQname属性をフェッチします。

XmlEvGetTagUriID関数およびXmlEvGetAttrUriID関数によりこのコールバックを1回起動して対応するURIのIDを取得します。

コールバックが指定されない場合、これらのAPIが使用されるとエラーXML_ERR_EVENT_NOIDCBKが戻されます。

XML Pull Parserのエラー処理

次の項では、XML Pull Parserのエラー処理について説明します。

パーサー・エラー

入力文書が不正な形式であるためエラーがスローされると、XML Pull ParserによりXML_EVENT_FATAL_ERRORというメッセージが戻されます。XmlEvGetError関数によりエラー番号およびメッセージが取得されます。

XmlCreate中にアプリケーションによって指定されたエラー処理は、XmlEvCreatePPCtx操作の間、オーバーライドされることに注意してください。XmlEvDestroyPPCtx操作で元のコールバックをリストアした後、アプリケーションはXmlErrSetHandler関数をコールする必要があります。

プログラミング・エラー

プログラムのエラーを処理するため、XDKには、アプリケーションがイベント・コンテキスト作成時に指定できるコールバックが用意されています。このコールバックは、アプリケーションが無効なAPIにコールを作成する場合に起動されます。コールバック署名は次のとおりです。

typedef  void (* xmlev_err_cb_funcp)(xmlctx *xctx, xmlevctx *evctx,
xmlevtype cur_event);

無効なAPIコールの例は次のとおりです。

XmlEvGetNameはXML_EVENT_CHARACTERSイベントに対してコールされません。

サンプルPull Parserアプリケーション

この項では、サンプルPull Parserアプリケーション、解析する文書、および文書から生成するイベントのリストについて説明します。

XML Pull Parserサンプル・アプリケーション

例18-5 サンプルPull Parserアプリケーションの例

# include "xml.h"
# include "xmlev.h"
...
xmlctx *xctx;
xmlevctx *evtcx;
if (!(xctx = XmlCreate(&xerr, (oratext *) "test")))
{
printf("Failed to create XML context, error %u\n", (unsigned) xerr);
return -1;
}
...
if(!(evctx = XmlEvCreatePPCtx(xctx, &xerr, NULL)))
{
printf("Failed to create EVENT context, error %u\n", (unsigned) xerr);
return -1;
}
for(i = 0; i < numDocs; i++)
{
if (xerr = XmlEvLoadPPDoc(xctx, evctx, "file", input_filenames[i], 0, NULL)
{
printf("Failed to load the document, error %u\n", (unsigned) xerr);
return -1;
}
...
for(;;)
{
xmlevtype cur_event;
cur_event = XmlEvNext(evctx);
switch(cur_event)
{
case XML_EVENT_FATAL_ERROR:
XmlEvGetError(evctx, (oratext **)&errmsg);
printf("Error %s\n", errmsg);
return;
case XML_EVENT_START_ELEMENT:
printf("<%s>", XmlEvGetName0(evctx));
break;
case XML_EVENT_END_DOCUMENT:
printf("<%s>", XmlEvGetName0(evctx));
return;
}
}
XmlEvCleanPPCtx(xctx, evctx);
}
XmlEvDestroyPPCtx(xctx, evctx);
XmlDestroy(xctx);

サンプル文書

例18-6 解析するサンプル文書

<!DOCTYPE doc [
<!ENTITY ent SYSTEM "file:attendees.txt">
<!ELEMENT doc ANY>
<!ELEMENT meeting (topic, date, publishAttendees)>
<!ELEMENT publishAttendees (#PCDATA)>
<!ELEMENT topic (#PCDATA)>
<!ELEMENT date (#PCDATA)>
]>
<!-- Begin Document -->
<doc>
<!-- Info about the meeting -->
<meeting>
<topic>Group meeting</topic>
<date>April 25, 2005</date>
<publishAttendees>&ent;</publishAttendees>
</meeting>
</doc>
<!-- End Document -->

XML Pull Parserサンプル・アプリケーションにより生成されたイベント

これは、属性イベント・プロパティがFALSEで展開エンティティ・プロパティがTRUEである場合に生成される一連のイベントです。

例18-7 サンプル文書の解析により生成されたイベント

XML_EVENT_START_DOCUMENT
XML_EVENT_START_DTD
XML_EVENT_PE_DECLARATION
XML_EVENT_ELEMENT_DECLARATION
XML_EVENT_ELEMENT_DECLARATION
XML_EVENT_ELEMENT_DECLARATION
XML_EVENT_ELEMENT_DECLARATION
XML_EVENT_ELEMENT_DECLARATION
XML_EVENT_END_DTD
XML_EVENT_COMMENT
XML_EVENT_START_ELEMENT
XML_EVENT_SPACE
XML_EVENT_COMMENT
XML_EVENT_SPACE
XML_EVENT_START_ELEMENT
XML_EVENT_START_ELEMENT
XML_EVENT_CHARACTERS
XML_EVENT_END_ELEMENT
XML_EVENT_START_ELEMENT
XML_EVENT_CHARACTERS
XML_EVENT_END_ELEMENT
XML_EVENT_START_ELEMENT
XML_EVENT_START_ENTITY
XML_EVENT_CHARACTERS
XML_EVENT_END_ENTITY
XML_EVENT_END_ELEMENT
XML_EVENT_END_ELEMENT
XML_EVENT_SPACE
XML_EVENT_END_ELEMENT
XML_EVENT_COMMENT
XML_EVENT_END_DOCUMENT

OCIおよびXDK C APIの使用

この項では、Oracle Call Interface(OCI)からのXDK C関数のコールについて説明します。

XMLType関数の使用および説明

データベースのXMLType列のXMLにC APIを使用できます。OCIプログラムでは、次のようなOCIハンドルの値を初期化することで、テーブルに格納されたXMLデータにアクセスできます。

- 環境ハンドル

- サービス・ハンドル

- エラー・ハンドル

- オプションのパラメータ

プログラムでは、これらの入力値をOCIXmlDbInitXmlCtx()関数に渡すことができます。この関数によりXMLコンテキストが戻されます。プログラムによりC APIがコールされた後、OCIXmlDbFreeXmlCtx()関数によってコンテキストが解放されます。

表18-6に、XML操作に使用する関数の一部を示します。

表18-6 XMLType関数

関数名

説明

XmlCreateDocument()

空のXMLTypeインスタンスの作成

XmlLoadDom()など

ソース・バッファからの作成

XmlXPathEvalexpr()およびファミリ

XPath式の抽出

XmlXslProcess()およびファミリ

XSLTスタイルシートを使用した変換

XmlXPathEvalexpr()およびファミリ

XPathの有無のチェック

XmlDomIsSchemaBased()

文書がスキーマベースかどうかの確認

XmlDomGetSchema()

スキーマ情報の取得

XmlDomGetNodeURI()

文書の名前空間の取得

XmlSchemaValidate()

スキーマを使用した検証

(void *)の(xmldocnode *)へのキャスト

XMLTypeからのDOMの取得

(xmldocnode *)の(void *)へのキャスト

DOMからのXMLTypeの取得

XML DBに対するXMLコンテキストの初期化

XMLコンテキストは、すべてのC DOM API関数における必須パラメータです。この不透明なコンテキストは、データ・エンコーディング、エラー・メッセージ言語などに関する情報をカプセル化します。XMLコンテキストの内容は、XDKアプリケーションとOracle XML DBアプリケーションでは異なります。

注意:
XML DBアプリケーションでXDK用のXMLコンテキストを使用したり、XDKアプリケーションでXML DB用のXMLコンテキストを使用しないでください。

Oracle XML DBでは、XMLコンテキストを初期化および解放する2つのOCI関数があり、プロトタイプは次のとおりです。

xmlctx *OCIXmlDbInitXmlCtx (OCIEnv *envhp, OCISvcCtx *svchp, OCIError *errhp,
ocixmldbparam *params, ub4 num_params);

void OCIXmlDbFreeXmlCtx (xmlctx *xctx);

関連項目:

- 関数の参考資料は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

- XMLに対するOCIサポートの詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

- DOM APIの参考情報は、『Oracle Database XML C APIリファレンス』を参照してください。

クライアント上でのXMLTypeインスタンスの作成

XmlLoadDom()コールを使用して、クライアントに新しいXMLTypeインスタンスを構築できます。次の基本手順に従います。

1. 「DOM API for Cの使用」の例に示されているように、最初にxmlctxを初期化する必要があります。

2. 次のソースからXMLデータ自体を構築できます。

- ユーザー・バッファ

- ローカル・ファイル

- URI

これらの場所からの戻り値は(xmldocnode *)であり、残りの共通C APIで使用できます。

3. 最後に、(xmldocnode *)を(void *)にキャストし、必要に応じて直接バインド値として提供できます。

XmlCreateDocument()コールを使用して、空のXMLTypeインスタンスを構築できます。この関数は、他のタイプに対するOCIObjectNew()に相当します。前のコールで戻された(xmldocnode *)について操作し、バインド値として提供される必要がある場合、最後にこれを(void *)にキャストできます。

データベース・サーバーのXMLデータに対する操作

Oracle Database上のXMLデータは、OCI文のコールによって操作できます。xmldocnodeを使用してXMLType値をバインドして定義し、OCI文を使用してデータベースからXMLデータを選択できます。このデータは、C DOM関数で直接使用できます。同様に、SQL文に直接値をバインドできます。

OCIおよびXDK C APIの使用: 例

例18-8に、DOM APIを使用してスキーマベース文書を構築し、データベースに保存する方法を示します。ヘッダー・ファイルxml.hおよびocixmldb.hをインクルードする必要があることに注意してください。

例18-8 DOM APIを使用したスキーマベース文書の構築

#include <xml.h>
#include <ocixmldb.h>
static oratext tlpxml_test_sch[] = "<TOP xmlns='example1.xsd'\n\
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' \n\
xsi:schemaLocation='example1.xsd example1.xsd'/>";

void example1()
{
OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;
OCIDuration dur;
OCIType *xmltdo;

xmldocnode  *doc;
ocixmldbparam params[1];
xmlnode *quux, *foo, *foo_data;
xmlerr       err;

/* Initialize envhp, svchp, errhp, dur, stmthp */
/* ........ */

/* Get an xml context */
params[0].name_ocixmldbparam = XCTXINIT_OCIDUR;
params[0].value_ocixmldbparam = &dur;
xctx = OCIXmlDbInitXmlCtx(envhp, svchp, errhp, params, 1);

/* Start processing */
printf("Supports XML 1.0: %s\n",
XmlHasFeature(xctx, (oratext *) "xml", (oratext *) "1.0") ? "YES" : "NO");

/* Parsing a schema-based document */
if (!(doc = XmlLoadDom(xctx, &err, "buffer", tlpxml_test_sch,
"buffer_length", sizeof(tlpxml_test_sch)-1,
"validate", TRUE, NULL)))
{
printf("Parse failed, code %d\n");
return;
}

/* Create some elements and add them to the document */
top = XmlDomGetDocElem(xctx, doc);
quux = (xmlnode *) XmlDomCreateElem(xctx ,doc, (oratext *) "QUUX");
foo = (xmlnode *) XmlDomCreateElem(xctx, doc, (oratext *) "FOO");
foo_data = (xmlnode *) XmlDomCreateText(xctx, doc, (oratext *)"foo's data");
foo_data = XmlDomAppendChild(xctx, (xmlnode *) foo, (xmlnode *) foo_data);
foo = XmlDomAppendChild(xctx, quux, foo);
quux = XmlDomAppendChild(xctx, top, quux);

XmlSaveDom(xctx, &err, top, "stdio", stdout, NULL);
XmlSaveDom(xctx, &err, doc, "stdio", stdout, NULL);

/* Insert the document to my_table */
ins_stmt = "insert into my_table values (:1)";

status = OCITypeByName(envhp, errhp, svchp, (const text *) "SYS",
(ub4) strlen((char *)"SYS"), (const text *) "XMLTYPE",
(ub4) strlen((char *)"XMLTYPE"), (CONST text *) 0,
(ub4) 0, dur, OCI_TYPEGET_HEADER,
(OCIType **) &xmltdo)) ;

if (status == OCI_SUCCESS)
{
exec_bind_xml(svchp, errhp, stmthp, (void *)doc, xmltdo, ins_stmt));
}

/* free xml ctx */
OCIXmlDbFreeXmlCtx(xctx);
}

/*--------------------------------------------------------*/
/* execute a sql statement which binds xml data */
/*--------------------------------------------------------*/
sword exec_bind_xml(svchp, errhp, stmthp, xml, xmltdo, sqlstmt)
OCISvcCtx *svchp;
OCIError *errhp;
OCIStmt *stmthp;
void *xml;
OCIType *xmltdo;
OraText *sqlstmt;
{
OCIBind *bndhp1 = (OCIBind *) 0;
OCIBind *bndhp2 = (OCIBind *) 0;
sword  status = 0;
OCIInd ind = OCI_IND_NOTNULL;
OCIInd *indp = &ind;

if(status = OCIStmtPrepare(stmthp, errhp, (OraText *)sqlstmt,
(ub4)strlen((char *)sqlstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)) {
return OCI_ERROR;
}

if(status = OCIBindByPos(stmthp, &bndhp1, errhp, (ub4) 1, (dvoid *) 0,
(sb4) 0, SQLT_NTY, (dvoid *) 0, (ub2 *)0,
(ub2 *)0, (ub4) 0, (ub4 *) 0, (ub4) OCI_DEFAULT)) {
return OCI_ERROR;
}

if(status = OCIBindObject(bndhp1, errhp, (CONST OCIType *) xmltdo,
(dvoid **) &xml, (ub4 *) 0, (dvoid **) &indp, (ub4 *) 0)) {
return OCI_ERROR;
}

if(status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(CONST OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT)) {
return OCI_ERROR;
}

return OCI_SUCCESS;
}

例18-9に、DOM APIを使用してデータベースから文書を取得し、変更する方法を示します。

例18-9 DOM APIを使用したデータベース文書の変更

#include <xml.h>
#include <ocixmldb.h>
sword example2()
{
OCIEnv *envhp;
OCIError *errhp;
OCISvcCtx *svchp;
OCIStmt *stmthp;
OCIDuration dur;
OCIType *xmltdo;

xmldocnode  *doc;
xmlnodelist *item_list; ub4 ilist_l;
ocixmldbparam params[1];
text *sel_xml_stmt = (text *)"SELECT xml_col FROM my_table";
ub4    xmlsize = 0;
sword  status = 0;
OCIDefine *defnp = (OCIDefine *) 0;

/* Initialize envhp, svchp, errhp, dur, stmthp */
/* ... */

/* Get an xml context */
params[0].name_ocixmldbparam = XCTXINIT_OCIDUR;
params[0].value_ocixmldbparam = &dur;
xctx = OCIXmlDbInitXmlCtx(envhp, svchp, errhp, params, 1);

/* Start processing */
if(status = OCITypeByName(envhp, errhp, svchp, (const text *) "SYS",
(ub4) strlen((char *)"SYS"), (const text *) "XMLTYPE",
(ub4) strlen((char *)"XMLTYPE"), (CONST text *) 0,
(ub4) 0, dur, OCI_TYPEGET_HEADER,
(OCIType **) xmltdo_p)) {
return OCI_ERROR;
}

if(!(*xmltdo_p)) {
printf("NULL tdo returned\n");
return OCI_ERROR;
}

if(status = OCIStmtPrepare(stmthp, errhp, (OraText *)selstmt,
(ub4)strlen((char *)selstmt),
(ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT)) {
return OCI_ERROR;
}

if(status = OCIDefineByPos(stmthp, &defnp, errhp, (ub4) 1, (dvoid *) 0,
(sb4) 0, SQLT_NTY, (dvoid *) 0, (ub2 *)0,
(ub2 *)0, (ub4) OCI_DEFAULT)) {
return OCI_ERROR;
}

if(status = OCIDefineObject(defnp, errhp, (OCIType *) *xmltdo_p,
(dvoid **) &doc,
&xmlsize, (dvoid **) 0, (ub4 *) 0)) {
return OCI_ERROR;
}

if(status = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
(CONST OCISnapshot*) 0, (OCISnapshot*) 0, (ub4) OCI_DEFAULT)) {
return OCI_ERROR;
}

/* We have the doc. Now we can operate on it */
printf("Getting Item list...\n");

item_list = XmlDomGetElemsByTag(xctx,(xmlelemnode *) elem,(oratext *)"Item");
ilist_l   = XmlDomGetNodeListLength(xctx, item_list);
printf(" Item list length = %d \n", ilist_l);

for (i = 0; i < ilist_l; i++)
{
elem = XmlDomGetNodeListItem(xctx, item_list, i);
printf("Elem Name:%s\n", XmlDomGetNodeName(xctx, fragelem));
XmlDomRemoveChild(xctx, fragelem);
}

XmlSaveDom(xctx, &err, doc, "stdio", stdout, NULL);

/* free xml ctx */
OCIXmlDbFreeXmlCtx(xctx);

return OCI_SUCCESS;
}

19 バイナリXML for Cの使用

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

- バイナリXML for Cの概要

バイナリXML for Cの概要

XMLデータのクライアント側処理では、バイナリXML形式のデータなどデータベースに格納されているXMLTypeデータか、データベースにない一時データを使用することができます。

前提条件

この章では、XML Parser for C、バイナリXMLの基本的な概念、およびOCI(Oracle Call Interface)を十分に理解していると想定します。このリリースでは、バイナリXMLでCによるプログラミングに使用できるのはOCI APIのみです。OCIのXMLサポートを使用する方法の詳細は、『Oracle Call Interfaceプログラマーズ・ガイド』のOCIでのXMLのサポートに関する項を参照してください。

関連項目:

- 第18章「XML Parser for Cの使用」

- 第5章「バイナリXML for Javaの使用」

- 『Oracle XML DB開発者ガイド』

- 『Oracle Call Interfaceプログラマーズ・ガイド』

バイナリXML格納形式

バイナリXMLは、Oracle Database 11g リリース1(11.1)で導入されました。バイナリXMLは、XML用に最適化された形式です。テキストからバイナリ、およびバイナリからテキストへのXML文書のエンコーディングおよびデコーディングを含んでいます。

バイナリXMLはXMLデータのXML Schema対応エンコーディングですが、バイナリXMLはXML Schemaに基づいていないXMLデータで使用することもできます。

バイナリXMLプロセッサは、バイナリXML形式をテキストに、またXMLテキストをバイナリXML形式に処理して変換するコンポーネントです。

中間層とクライアント層は、バイナリXML形式でXMLを作成、使用および処理することができます。CアプリケーションはXML DBリポジトリからデータをフェッチし、DOMを使用してXML上で更新を実行し、それをデータベースに戻して格納します。つまり、XML文書がクライアント上で作成または入力され、それに対してXSLT、XQueryおよび他のユーティリティを使用することができます。その後、出力XMLがXML DBに保存されます。OCI関数の概念の詳細やリファレンス・ページは、『Oracle Call Interfaceプログラマーズ・ガイド』を参照してください。

20 XML Schema Processor for Cの使用

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

- XML Schema Processor for Cの概要

- C XML Schema Processorコマンドライン・ユーティリティの使用

- XML Schema Processor for Cの使用方法

- XML Schema Processor for Cサンプル・プログラムの実行

- ストリーミング・バリデータの概要

注意:
新規のXDKおよびOracle XML DBアプリケーションには、新規の統合C APIを使用してください。以前のC関数は非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。
新しいCのAPIの詳細は、「統合C APIの概要」を参照してください。

XML Schema Processor for Cの概要

XML Schema Processor for Cは、XML Parser for Cとともに動作するコンポーネントです。XML Schema Processor for Cを使用すると、XMLアプリケーションで単純なデータ型および複雑なデータ型をサポートできます。

XML Schema Processor for Cは、W3CのXML Schema勧告をサポートしています。このため、XML文書を処理するカスタム・アプリケーションを簡単に作成できます。また、Oracleが移植された各オペレーティング・システムには、標準に準拠したXML SchemaプロセッサがXDKの一部として搭載されています。

XML Schema Processorでは、XMLの検証およびメタデータの取得が可能です。これは、それ自身またはXML Parser for Cによってコールできます。

関連項目:
XML Schemaの詳細およびXML Schemaを使用する理由の詳細は、第4章「XML Parsing for Java」を参照してください。

XML Schema Processor for Cの機能

XML Schema Processor for Cには、次の機能があります。

- 単純型および複合型をサポートします。

- XML Parser for Cに統合されています。

- W3CのXML Schema勧告をサポートします。

関連項目:

- 『Oracle Database XML C APIリファレンス』の「C用のスキーマAPIパッケージ」

- $ORACLE_HOME/xdk/demo/c/schema/: サンプル・コード

標準への準拠

XML Schema Processor for Cは、次の標準に準拠しています。

- W3CのXML 1.0勧告

- W3CのDOMレベル1.0勧告

- W3CのXML Namespace勧告

- W3CのXML Schema勧告

XML Schema Processor for C: 提供されるソフトウェア

表20-1に、今回のリリースで提供されるファイルおよびディレクトリを示します。

表20-1 XML Schema Processor for C: $ORACLE_HOMEで提供されるファイル

ディレクトリおよびファイル

説明

bin

スキーマ・プロセッサが実行可能なschema

lib

XML/XSL/Schemaおよびサポート・ライブラリ

nls/data

グローバリゼーション・サポート・データ・ファイル

xdk/demo/c/schema

スキーマ・プロセッサの使用例

xdk/include

ヘッダー・ファイル

xdk/mesg

エラー・メッセージ・ファイル

xdk/readme.html

概要ファイル

表20-2に、ディレクトリlibに含まれるライブラリを示します。

表20-2 XML Schema Processor for C: 提供されるライブラリ

含まれるライブラリ

説明

libxml10.a

XML Parser、XSLT Processor、XML Schema Processor

libcore10.a

COREファンクション

libnls10.a

グローバリゼーション・サポート

C XML Schema Processorコマンドライン・ユーティリティの使用

XML Schema Processor for Cは、インストール場所のbin/schemaをコールすることによって、実行可能ファイルとしてコールされます。これは次の2つの引数を取ります。

- XMLインスタンス・ドキュメント

- デフォルト・スキーマ(オプション)

XML Schema Processor for Cは、提供されたAPIを使用するコードを記述して起動することもできます。このコードは、includeサブディレクトリにあるヘッダーを使用してコンパイルし、libサブディレクトリにあるライブラリにリンクする必要があります。プログラムを構築する方法の詳細は、xdk/demo/c/schemaサブディレクトリにあるMakefileを参照してください。

異なる言語のエラー・メッセージ・ファイルは、mesg/サブディレクトリにあります。

XML Schema Processor for Cの使用方法

図20-1に、次に示すXML Schema Processor for Cのコール順序を示します。

1. 初期化コールが、セッションの開始時に一度コールされ、セッションで使用されるスキーマ・コンテキストを戻します。

2. セッションで使用されるスキーマ・ドキュメントは事前にロードされます。

3. 検証するインスタンス・ドキュメントが、まずXMLパーサーによって解析されます。

4. 次に、このインスタンスのXML要素サブツリーの最上位がスキーマ検証関数に渡されます。

5. インスタンス・ドキュメントにスキーマが明示的に定義されていない場合は、任意の事前ロード済のスキーマが使用されます。

6. 同じスキーマ・コンテキストを使用して、複数のドキュメントを検証できます。

7. セッションが終了すると、スキーマ・メモリー解放関数がコールされます。これによって、ロードされたスキーマに対して割り当てられていたすべてのメモリーが解放されます。

図20-1 XML Schema Processor for Cの使用方法

XML Schema Processor for Cサンプル・プログラムの実行

ディレクトリxdk/demo/c/schemaには、Oracle XML Schema ProcessorとそのAPIの使用方法を示すサンプルXML Schemaアプリケーションがあります。表20-3に、提供されるサンプル・ファイルを示します。

表20-3 XML Schema for Cのサンプル

サンプル・ファイル

説明

Makefile

サンプル・プログラムを作成および実行し、適切な出力を確認するMakeファイル。

xsdtest.c

XML Schema for CのAPIをコールするプログラム

car.{xsd,xml,std}

xsdtestを実行した後のサンプル・スキーマ、インスタンス・ドキュメントおよび予想される出力

aq.{xsd,xml,std}

xsdtestを実行した後の2つ目のサンプル・スキーマ、インスタンス・ドキュメントおよび予想される出力

pub.{xsd,xml,std}

xsdtestを実行した後の3つ目のサンプル・スキーマ、インスタンス・ドキュメントおよび予想される出力

サンプル・プログラムを作成するには、makeコマンドを実行します。

プログラムを作成および実行し、実際の出力と予想される出力を比較するには、次を実行します。

make sure

ストリーミング・バリデータの概要

ストリーミング・バリデータは、Oracle Database 11g リリース1(11.1)で導入されました。ストリーミング・バリデータはXMLイベントを使用します。XMLイベントはSAXイベントに類似した、XML文書の表現です。XMLイベントには開始タグ、終了タグおよびコメントがあります。プロデューサがSAXイベントを駆動し、コンシューマがXMLイベントを駆動します。ストリーミング・バリデータは古いスキーマ・バリデータとソフトウェアを共有し、大部分の機能をそこから導出します。メモリー・オーバーヘッドは、古いバリデータで使用されていたDOM表現より少なくなります。検証はドキュメントに対して1回のみ行われます。

ストリーミングの検証には次の2つのモードがあります。

- 透明モード: イベントはアプリケーションに戻されます。

- 不透明モード: イベントはアプリケーションに戻されませんが、文書検証処理の成功または失敗を示すエラーが戻されます。

文書検証の前に、通常の検証コンテキストを作成し、そのコンテキストを使用して関連のスキーマをロードする必要があります。次に、Pull Parser用(または別のイベント生産者用)のXMLイベント・コンテキストを作成する必要があります。これによりこのイベント・コンテキストがストリーミング・バリデータに指定され、生産者からイベントをリクエストすることができるようになります。

スキーマDOM内でXmlSchemaLoad APIに渡す操作もサポートされます。

透明モードの使用

最初にアプリケーションがXmlEvCreateSVCtx()をコールします。このコールは、型がxmlctxであるイベント・コンテキストを作成して戻します。それ以降のすべてのコールで、これをストリーミング・バリデータに渡す必要があります。作成されたイベント・コンテキストは、末尾にXmlEvDestroyCtx()のコールを持つ必要があります。

アプリケーションはイベント・コンテキストの作成後、XmlEvNext()のコールを発行することによって繰り返し次のイベントに検証を進め、この関数は次のイベントの型を戻します。アプリケーションはその他のAPIインタフェースにより、最後のイベントに関連する情報を取得します。

透明モードでのエラー処理

妥当なイベントという概念はありません。妥当性は文書のプロパティであって、個別の項目やイベントのプロパティではありません。エラーは次のとおりです。

- XML_EVENT_FATAL_ERROR: XMLイベントの生産者がこのエラーを報告すると、ストリーミング・バリデータはこのイベントをアプリケーションに戻し、検証処理を停止します。

- XML_EVENT_ERROR: 検証エラーが発生すると、ストリーミング・バリデータはこのイベントをアプリケーションに戻します。アプリケーションはXmlEvGetError()をコールして、エラーに関する詳細情報を入手することができます。

アプリケーションがXML_EVENT_ERRORまたはXML_EVENT_FATAL_ERRORイベントを受信しなければ、ドキュメントは妥当です。このため、アプリケーションはこれらのイベントを処理する必要があります。無視してはいけません。

これらのエラーはキャッシュされないため、関連の情報を後から取得することはできません。

ストリーミング・バリデータの例

透明モードの例を示します。

例20-1 ストリーミング・バリデータの透明モード

# include "xmlev.h"
...
xmlevctx *ppevtcx, *svevctx;
xmlctx *xctx
xsdctx *sctx;

if (!(xctx = XmlCreate(&xerr, (oratext *) "test")))
printf("Failed to create XML context, error %u\n",
(unsigned) xerr);
...
if (!(sctx = XmlSchemaCreate(xctx, &xerr, NULL)))
printf("Failed to create schema context, error %u\n",
(unsigned) xerr);

...
If (xerr = XmlSchemaLoad(sctx, "my_schema.xsd", NULL))
printf("Failed to load schema, error %u\n",
(unsigned) xerr);

if(!(ppevctx = XmlEvCreatePPCtx(xctx, &xerr, NULL)))
printf("Failed to create EVENT context, error %u\n",
(unsigned) xerr);

if(xerr = XmlEvLoadPPDoc(xctx, ppevctx, "file", "test.xml", 0, NULL))
printf("Failed to load Document, error %u\n",
(unsigned) xerr);

...
If(!(svevctx = XmlEvCreateSVCtx(xctx, sctx, ppevctx, &xerr)))
printf("Failed to create SVcontext, error %u\n",
(unsigned) xerr);
...
for(;;)
{
xmlevtype cur_event;
cur_event = XmlEvNext(svevctx);
switch(cur_event)
{
case XML_EVENT_FATAL_ERROR:
printf("FATAL ERROR");
/* error processing goes here */
return;
case XML_EVENT_ERROR:
XmlEvGetError(svevctx, oratext *msg);
printf("Validation Failed, Error %s\n", msg);
break;
case XML_EVENT_START_ELEMENT:
printf("<%s>", XmlEvGetName(svevctx));
break;
...
case XML_EVENT_END_DOCUMENT:
printf("END DOCUMENT");
return;
}
}
...
XmlEvDestroySVCtx(svevctx);
XmlSchemaDestroy(sctx);
XmlEvDestroyCtx(ppevctx);
XmlDestroyCtx(xctx);

不透明モードの使用

不透明モードでは、ストリーミング・バリデータは、検証対象のインスタンス・ドキュメントをプロデューサからの一連のイベントとして読み取りますが、アプリケーション(コンシューマ)にイベントを渡しません。成功時にはXMLERR_OK、失敗時にはエラーの数を戻します。

スキーマがロードされ、XMLイベント・コンテキストが初期化されると、アプリケーションはXmlEvSchemaValidate()をコールしてこのモードで文書を検証することができます。この関数の署名はポインタをイベント・コンテキストに導きます。宣言は次のとおりです。

xmlerr XmlEvSchemaValidate(xmlctx *xctx, xsdctx *sctx, xmlevctx *evctx,
oratext **errmsg);
/* Returns (xmlerr), the error code */

不透明モードでのエラー処理

ストリーミング・バリデータでエラーが発生すると、XmlEvSchemaValidate()はエラー数を戻します。これには、解析エラーが原因の場合も検証エラーが原因の場合もあります。その後、アプリケーションは既存のXmlEvGetError APIを使用してエラー・メッセージを取得することができます。エラー・メッセージはパラメータ化されていて、通常、ストリーミング・バリデータが終了した地点までのすべてのエラーを含んでいます。

不透明モードのアプリケーションの例

不透明モードの例を示します。

例20-2 ストリーミング・バリデータの不透明モードの例

# include "xmlev.h"
...
xmlevctx *ppevtcx;
xmlctx   *xctx;
xsdctx   *sctx;
oratext  **errmsg;
xmlerr   xerr;

if (!(xctx = XmlCreate(&xerr, (oratext *) "test"))
printf("Failed to create XML context, error %u\n", (unsigned) xerr);
...
if (!(sctx = XmlSchemaCreate(xctx, &xerr, NULL)))
printf("Failed to create schema context, error %u\n", (unsigned) xerr);

...
if (xerr = XmlSchemaLoad(sctx, "my_schema.xsd", NULL))
printf("Failed to load schema, error %u\n", (unsigned) xerr);

if(!(ppevctx = XmlEvCreatePPCtx(xctx, &xerr, NULL)))
printf("Failed to create EVENT context, error %u\n", (unsigned) xerr);

if(xerr = XmlEvLoadPPDoc(xctx, ppevctx, "file", "test.xml", 0, NULL))
printf("Failed to load Document, error %u\n", (unsigned) xerr);

if((xerr = XmlEvSchemaValidate(xctx, sctx, ppevctx, errmsg)))
{
printf("Validation Failed, Error: %s\n", errmsg);
}
...
XmlSchemaDestroy(sctx);
XmlEvDestroyCtx(ppevctx);
XmlDestroyCtx(xctx);

既存のXmlSchemaLoad()関数の拡張

XmlSchemaLoad()は、既存のDOMとともに動作するようにOracle Database 11gリリース1 (11.1)で拡張されました。以前は、この関数は2つの固定引数と、1つの変数プロパティ・セットを取りました。最初の引数はスキーマ・コンテキスト、2番目の引数はスキーマ文書のURLの場所です。URLを指定されたスキーマDOMへのアクセスを可能にするため、変数引数のセットに新しいプロパティが追加されました。プロパティschema_dom_callbackは、アプリケーションによって提供されるコールバック関数です。提供される場合、スキーマ・ロード関数はこのコールバックを使用してDOMにアクセスし、メイン・スキーマ、インクルード済スキーマ、インポート済スキーマおよび再定義済スキーマをロードします。コールバック署名は次のとおりです。

typedef  xmldocnode* (*xmlsch_dom_callback) (xmlctx *xctx, oratext *uri,
xmlerr *xerr);

このコールバックはURIを受け入れ(スキーマ・ロード関数が目的の文書のURI内で渡します)、文書ノードを戻します。次に例を示します。

例20-3 XmlSchemaLoad()の例

# include "xmlev.h"
...
xmlctx *xctx;
xsdctx *sctx;
xmldocnode *doc;

if (!(xctx = XmlCreate(&xerr, (oratext *) "test"))
printf("Failed to create XML context, error %u\n", (unsigned) xerr);
...
if (!(sctx = XmlSchemaCreate(xctx, &xerr, NULL)))
printf("Failed to create schema context, error %u\n", (unsigned) xerr);
...
If (xerr = XmlSchemaLoad(sctx, schema_uri, "schema_dom_callback", func1,  NULL))
printf("Failed to load schema, error %u\n", (unsigned) xerr);
...
XmlSchemaDestroy(sctx);
XmlDestroyCtx(xctx);

検証オプション

XmlSchemaSetValidateOptions()を使用して検証処理のオプションを指定することができます。次に例を示します。

XmlSchemaSetValidateOptions(scctx, "ignore_id_constraint", (boolean)TRUE, NULL);

オプションは次のとおりです。

- ignore_id_constraint (Oracle Database 11g リリース1(11.1)よりも前から存在する)

- ignore_sch_location (Oracle Database 11g リリース1(11.1)よりも前から存在する)

- ignore_par_val_rest (Oracle Database 11g リリース1(11.1)よりも前から存在する)

- ignore_pattern_check: このプロパティがTRUEの場合、ストリーミング・バリデータはパターン・ファセット・チェックを無視します。デフォルトはFALSEです。

- no_events_for_defaults: このプロパティがTRUEの場合、ストリーミング・バリデータはインスタンス・ドキュメントに追加されたデフォルト値のイベントを戻しません。このオプションは透明モードの場合のみ使用できます。

例20-4 新しいオプションを使用するストリーミング・バリデータの例

# include "xmlev.h"
...
xmlevctx *ppevtcx;
xmlctx   *xctx;
xsdctx   *sctx;
xmlerr   xerr;
oratext  **errmsg;

if (!(xctx = XmlCreate(&xerr, (oratext *) "test"))
printf("Failed to create XML context, error %u\n", (unsigned) xerr);
...
if (!(sctx = XmlSchemaCreate(xctx, &xerr, NULL)))
printf("Failed to create schema context, error %u\n", (unsigned) xerr);
...
If (xerr = XmlSchemaLoad(sctx, "my_schema.xsd", NULL))
printf("Failed to load schema, error %u\n", (unsigned) xerr);
if(!(ppevctx = XmlEvCreatePPCtx(xctx, &xerr, "file", "test.xml", NULL)))
printf("Failed to create EVENT context, error %u\n", (unsigned) xerr);

if(xerr = XmlEvLoadPPDoc(xctx, ppevctx, "file", "test.xml", 0, NULL))
printf("Failed to load Document, error %u\n", (unsigned) xerr);

XmlSchemaSetValidateOptions(sctx, "ignore_id_constraint", TRUE,
"ignore_pattern_facet", TRUE, NULL);
if((xerr = XmlEvSchemaValidate(xctx,sctx, ppevctx, errmsg)))
{
printf("Validation Failed, Error: %s\n", errmsg);
}
...
XmlSchemaDestroy(sctx);
XmlEvDestroyCtx(ppevctx);
XmlDestroyCtx(xctx);

21 Cを使用したXML差分の検出

Oracle XDKに含まれているコンポーネントを使用して、2つのXML文書の内容の差分を確認し、片方のXML文書に差分(パッチ)を適用できます。

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

- CにおけるXMLDiffの概要

- XmlDiffの使用

- XmlPatchの使用

- XmlHashの使用

CにおけるXMLDiffの概要

Oracle XmlDiffを使用して、類似した2つのXML文書の差分を定義できます。XmlDiffにより差分を示すXdiffインスタンス・ドキュメントが生成されます。Xdiffインスタンス・ドキュメントは、XMLスキーマの1つであるXdiffスキーマに準拠するXML文書です。

XmlPatchを使用して、Xdiffインスタンス・ドキュメントを受け取り、他の文書に変更を適用できます。これを使用して、多くのXML文書に同一の変更を適用できます。

XmlDiffは、DOM APIの入力および出力のみを目的としてサポートされています。

XmlPatchもまた、DOMの入力およびパッチ文書をサポートしています。

XmlDiffおよびXmlPatchは、C APIまたはコマンドライン・ツールを介して使用でき、2つのSQL関数により表示されます。

XmlHash C APIは、XMLツリーまたはサブツリーのハッシュ値を計算するために提供されます。2つのツリーまたはサブツリー間のハッシュ値が同数の場合、これらのツリーは非常に高い確率で同一です。

XMLDiffに関するプロセスのフロー

このプロセスのフローは、次のとおりです。

1. XmlDiffを使用して2つの入力文書を比較します。

2. XmlDiffにより、Xdiffインスタンス・ドキュメントが作成されます。

3. 必要に応じて、Xdiffインスタンス・ドキュメントをXmlPatchに渡すことができます。

4. XmlPatchを使用して、比較によって検出された差分を指定した他のドキュメントに適用できます。

XmlDiffの使用

XmlDiffを使用して、2つの入力文書を示すツリーを比較し差分を検出します。

この2つの入力文書では、同一のキャラクタ・セット・エンコーディングを使用する必要があります。Xdiff(出力)インスタンス・ドキュメントには、入力文書のデータ・エンコーディング(DOMエンコーディング)と同一のエンコーディングが含まれます。

最適化に関するユーザー・オプション

比較に関して、最適化と呼ばれる2つのオプションがあります。

- グローバル最適化: デフォルト
文書ツリー全体が比較されます。

- ローカル最適化
兄弟関係のレベルで比較が行われます。ローカル最適化では、2つのツリーの対応する親の下にある兄弟関係が比較されます。

グローバル最適化では、大きな文書に対してより多くの時間および領域を使用できますが、生成されるのは常に最小の差分セット(最適差分)です。ローカル最適化の方が処理速度は速いですが、最適差分は生成されない場合があります。

ハッシュに関するユーザー・オプション

一般的に、ハッシュによりグローバル最適化が早くなりますが、質が若干落ちる可能性もあります。ローカル最適化では、ハッシュにより差分出力の質が改善されます。異なるハッシュのレベルを使用すると、ローカル差分およびグローバル差分の両方が生成される可能性があります。

ローカルおよびグローバルの両方の最適化に関するハッシュの使用を指定できます。

ハッシュを指定するには、hashLevelパラメータを入力します。hashLevelが1より大きい場合、DOMHash値を使用して、差分がdepth >= hashLevelのすべてのサブツリーを比較できます。ハッシュ値が同一の場合は、サブツリーも同一と推定されます。

XmlDiffでの入力文書の見方

XmlDiffは、比較の実行中、属性順に差分を無視します。

XmlDiffはDocType宣言を無視します。ファイルはDTDに対して検証されません。

名前空間の接頭辞が同一の名前空間URIを参照する場合は、XmlDiffは名前空間の接頭辞における差分を無視します。それ以外の場合で、2つのノードに同じローカル名および内容が含まれていて名前空間URIが異なる場合は、差分が明示されます。

注意:
XmlDiffは入力文書上で、スキーマに基づかない方法で動作します。要素または属性上で、型を認識する方法では動作しません。

XmlDiffコマンドライン・ユーティリティの使用

表21-1に、コマンドライン・オプションを示します。

表21-1 C言語に関するXmlDiffコマンドライン・オプション

オプション

説明

-eエンコーディング

デフォルトの入力ファイルのエンコーディングを指定します。XMLファイルでエンコーディングが指定されていない場合、このエンコーディングは入力対象とみなされます。

-Eエンコーディング

出力/データのエンコーディングを指定します。DOMおよびXdiffインスタンス・ドキュメントはこのエンコーディングで作成されます。デフォルトはUTF8です。

-h hashLevel

ハッシュのレベルを指定します。0レベルがないことを意味します。

1より大きい場合、サブツリーにハッシュを使用します。

-g

グローバル最適化(デフォルト)を設定します。

-l

ローカル最適化を設定します。

-p

使用方法のヘルプを表示します。

-u

更新操作の無効にします。

入力文書のサンプル

例21-1は、XmlDiffおよびXmlPatchの使用による更新を説明するxml文書のサンプルです。いくつかの変更が続きます。

例21-1 book1.xml

<?xml version="1.0"?>
<booklist xmlns="http://booklist.oracle.com">
<book>
<title>Twelve Red Herrings</title>
<author>Jeffrey Archer</author>
<publisher>Harper Collins</publisher>
<price>7.99</price>
</book>
<book>
<title language="English">The Eleventh Commandment</title>
<author>Jeffrey Archer</author>
<publisher>McGraw Hill</publisher>
<price>3.99</price>
</book>
<book>
<title language="English" country="USA">C++ Primer</title>
<author>Lippmann</author>
<publisher>Harper Collins</publisher>
<price>4.99</price>
</book>
<book>
<title>Emperor's New Mind</title>
<author>Roger Penrose</author>
<publisher>Oxford Publishing Company</publisher>
<price>15.9</price>
</book>
<book>
<title>Evening News</title>
<author>Arthur Hailey</author>
<publisher>MacMillan Publishers</publisher>
<price>9.99</price>
</book>
</booklist>

次にあげる結果を除いて、例21-1「book1.xml」に非常によく似たbook2.xmlという別ファイルがあるとします。

「The Eleventh Commandment」を削除(delete-node操作の1つ)。

「C++ Primer」の国コードを米国から英国に変更(update-node操作の1つ)。

「Emperor's New Mind」に説明を追加(append-node操作の1つ)。

「Evening News」に版を追加(insert-node-before操作の1つ)。

「Evening News」の価格を更新(update-node操作の1つ)。

Xdiffインスタンス・ドキュメントのサンプル

この項では、前の項で説明された2つのXMLファイルの比較により生成されたXdiffインスタンス・ドキュメントを示します。次の項では、XML処理命令およびこの文書での操作について説明します。

次のようなXmlDiffを起動できます。

> xmldiff book1.xml book2.xml

この表では、引数およびフラグに関するサンプル・アプリケーションについても見ることができます。

例21-2 Xdiffインスタンス・ドキュメントのサンプル

<?xml version="1.0" encoding="UTF-8"?>
<xd:xdiff xsi:schemaLocation="http://xmlns.oracle.com/xdb/xdiff.xsd
xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:oraxdfns_0="http://booklist.oracle.com">
<?oracle-xmldiff operations-in-docorder="true" output-model="snapshot"
diff-algorithm="global"?>
<xd:delete-node xd:node-type="element" xd:xpath="/oraxdfns_0
:booklist[1]/oraxdfns_0:book[2]"/>
<xd:update-node xd:node-type="attribute"
xd:parent-xpath="/oraxdfns_0:booklist[1]/oraxdfns_0:book[3]/oraxdfns_0
:title[1]" xd:attr-local="country">
<xd:content>US</xd:content>
</xd:update-node>
<xd:append-node xd:node-type="element" xd:parent-xpath="/oraxdfns_0
:booklist[1]/oraxdfns_0:book[4]">
<xd:content>
<oraxdfns_0:description> This is a classic </oraxdfns_0:description>
</xd:content>
</xd:append-node>
<xd:insert-node-before xd:node-type="element" xd:xpath="/oraxdfns_0
:booklist[1]/oraxdfns_0:book[5]/oraxdfns_0:author[1]">
<xd:content>
<oraxdfns_0:edition>Hardcover</oraxdfns_0:edition>
</xd:content>
</xd:insert-node-before>
<xd:update-node xd:node-type="text" xd:xpath="/oraxdfns_0
:booklist[1]/oraxdfns_0:book[5]/oraxdfns_0:price[1]/text()[1]">
<xd:content>12.99</xd:content>
</xd:update-node>
</xd:xdiff>

出力モデルおよびXML処理命令

Xdiffインスタンス・ドキュメントは、XML処理命令(前の項の太字表示箇所)を使用して、差分検出処理の特定の側面を表示します。「Xdiffスキーマ」を参照してください。命令および関連オプションは次のとおりです。

- operations-in-docorder: オプションはtrueまたはfalseです。

- true: Xdiffインスタンス・ドキュメントは、文書内と同じ順で最初の文書からノードを参照します。

- false: Xdiffインスタンス・ドキュメントは、文書内と同じ順で最初の文書からノードを参照しません。

グローバル最適化の出力はoperations-in-docorder要件に適合しますが、ローカル最適化では適合しません。

- output-model: オプションは次のとおりです。

- snapshot: Xmldiffはスナップショット・モデルで出力を生成し、UNIXのdiffモデルに従います。入力文書にどの操作も適用しない場合は、XPathが使用されます。これはデフォルトです。operations-in-docorderがtrueに設定され、XPathが単純である場合は、XmlPatchはこのモデルの処理のみ実行できます。単純なXPathは子の軸をワイルド・カードなしで要求し、述語の位置を/root[1]/child[2]/text()[2]のように使用する必要があります。

- current: 各操作は、前の操作までのすべての操作が入力文書に適用されているようにXPathを使用します。XmlDiffが差分を現在のモデルで生成しない場合でも、XmlPatchは手作業で作成したdiff文書を現在のモデルで処理できます。

- diff-algorithm: このオプションはどの最適化が差分を生成するかを示します。

- グローバル最適化

- ローカル最適化

関連項目:
「最適化に関するユーザー・オプション」

Xdiff操作

XmlDiffは、Xdiffインスタンス・ドキュメントによって明示される操作を使用して差分を検出します。

Xdiffの操作は次のとおりです。

- 操作対象となるノードの親ノードのXPATHの場所またはノードのXPATHの場所が、parent-xpath属性またはxpath属性によって指定されます。

- node-type属性により、操作対象となるノードのタイプが指定されます。

- content子要素により、追加または挿入される新規のサブツリーまたは値が指定されます。

Xdiffインスタンス・ドキュメントに表示されるXdiff操作は、次のとおりです。

- append-node:
append-node要素により、指定されたタイプのノードが指定された親の最後の子へ追加されるように指定されます。

- insert-node-before:
insert-node-before要素により、指定されたタイプのノードが指定された参照ノードの前に挿入されるように指定されます。

- delete-node:
delete-node要素により、削除されるノードにそのすべての子が含まれるように指定されます。これは要素やコメントなどを削除する場合に使用されます。

- update-node:
update-nodeは、指定されたXPath式を含むノードに関連付けられた値が指定された新規の値に更新されるように指定します。内容は、テキスト・ノードに関する値です。属性の値は、属性ノードに関する値です。

- テキスト・ノードの更新

- update node操作の生成はユーザーによってオフにできます。

- 属性の値は、属性ノードに関する値です。

- update-nodeは、グローバル最適化によってのみテキスト・ノードに対して生成されます。

- 要素の更新

- XmlDiffは、要素ノードに対して更新操作を生成しません。
Xdiffインスタンス・ドキュメントを手動で変更して、XmlPatchを操作する更新操作を作成できます。または、Xdiffインスタンス・ドキュメントを完全に手書きで入力することも可能です。更新操作に関わる要素のすべての子は削除されます。内容ノードで指定された新規のサブツリーは、すべてインポートされます。

Xdiffインスタンス・ドキュメントの形式

XmlDiffの出力であるXdiffインスタンス・ドキュメントはXML形式で、次の項に示されるXdiffスキーマに準拠しています。

出力文書には、2つの入力文書間の差分を示す一連の操作が含まれます。最初の文書から差分を適用する場合は、2番目の文書を取得します。

Xdiffスキーマ

例21-3に、Xdiffインスタンス・ドキュメント(出力)が従うXdiffスキーマを示します。

例21-3 Xdiffスキーマ: xdiff.xsd

<schema targetNamespace="http://xmlns.oracle.com/xdb/xdiff.xsd"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xd="http://xmlns.oracle.com/xdb/xdiff.xsd"
version="1.0" elementFormDefault="qualified"
attributeFormDefault="qualified">
<annotation>
<documentation xml:lang="en">
Defines the structure of XML documents that capture the difference
between two XML documents. Changes that are not supported by Oracle
XmlDiff may not be expressible in this schema.

'oracle-xmldiff' PI in Xdiff document:

We use 'oracle-xmldiff' PI to describe certain aspects of the diff.
The PI denotes values for 'operations-in-docorder' and 'output-model'.
The output of XmlDiff has the PI always. If the user hand-codes a diff doc
then it must also have the PI in it as the first child of top level xdiff
element, to be able to call XmlPatch.

operations-in-docorder:
Can be either 'true' or 'false'.
If true, the operations in the diff document refer to the
elements of the input doc in the same order as document order. Output of
global algorithm meets this requirement while local does not.

output-model:
output models for representing the diff. Can be either 'Snapshot' or
'Current'.

Snapshot model:
Each operation uses Xpaths as if no operations
have been applied to the input document. (like UNIX diff)
This is the model used in the output of XmlDiff. XmlPatch works with
this (and the current model too).
For XmlPatch to handle this model, "operations-in-docorder" must be
true and the Xpaths must be simple. (see XmlDif C API documentation).

Current model:
Each operation uses Xpaths as if all operations till the previous one
have been applied to the input document. Works with XmlPatch even if
the 'operations-in-docorder' criterion is not met and the xpaths are
not simple.
<!-- Example:
<?oracle-xmldiff operations-in-docorder="true" output-model=
"snapshot" diff-algorithm="global"?>
-->
</documentation>
</annotation>
<!-- Enumerate the supported node types -->
<simpleType name="xdiff-nodetype">
<restriction base="string">
<enumeration value="element"/>
<enumeration value="attribute"/>
<enumeration value="text"/>
<enumeration value="cdata"/>
<enumeration value="entity-reference"/>
<enumeration value="entity"/>
<enumeration value="processing-instruction"/>
<enumeration value="notation"/>
<enumeration value="comment"/>
</restriction>
</simpleType>

<element name="xdiff">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="append-node">
<complexType>
<sequence>
<element name="content" type="anyType"/>
</sequence>
<attribute name="node-type" type="xd:xdiff-nodetype"/>
<attribute name="xpath" type="string"/>
<attribute name="parent-xpath" type="string"/>
<attribute name="attr-local" type="string"/>
<attribute name="attr-nsuri" type="string"/>
</complexType>
</element>

<element name="insert-node-before">
<complexType>
<sequence>
<element name="content" type="anyType"/>
</sequence>
<attribute name="xpath" type="string"/>
<attribute name="node-type" type="xd:xdiff-nodetype"/>

</complexType>
</element>

<element name="delete-node">
<complexType>
<attribute name="node-type" type="xd:xdiff-nodetype"/>
<attribute name="xpath" type="string"/>
<attribute name="parent-xpath" type="string"/>
<attribute name="attr-local" type="string"/>
<attribute name="attr-nsuri" type="string"/>
</complexType>
</element>
<element name="update-node">
<complexType>
<sequence>
<element name="content" type="anyType"/>
</sequence>
<attribute name="node-type" type="xd:xdiff-nodetype"/>
<attribute name="parent-xpath" type="string"/>
<attribute name="xpath" type="string"/>
<attribute name="attr-local" type="string"/>
<attribute name="attr-nsuri" type="string"/>
</complexType>
</element>
<element name="rename-node">
<complexType>
<sequence>
<element name="content" type="anyType"/>
</sequence>
<attribute name="xpath" type="string"/>
<attribute name="node-type" type="xd:xdiff-nodetype"/>
</complexType>
</element>
</choice>
<attribute name="xdiff-version" type="string"/>
</complexType>
</element>
</schema>

アプリケーションでのXMLDiffの使用

アプリケーションでは、XmlDiffは、入力文書のソース・タイプおよび場所を引数とします。ソース・タイプは、URL、ファイル、orastreamおよびstreamコンテキスト・ポインタ、バッファ、buffer_lengthポインタ、またはDOM文書要素(docelement)へのポインタです。

XmlDiffは、Xdiffインスタンス・ドキュメントに関するDOMの文書ノードを戻します。

比較の実行前にDOMとして2つの文書が提供されていない場合、XmlDiffは2つの文書に対してDOMを構築します。

関連項目:
XmlDiffの動作を制御するフラグのC APIの詳細は、『Oracle Database XML C APIリファレンス』を参照してください。

例21-4 XMLDiffアプリケーション

# include <xmldf.h>
...
xmlctx     *xctx;
xmldocnode *doc1, *doc2, *doc3;
uword       hash_level;
oratext    *s, *inp1 = "book1.xml", *inp2="book2.xml";
xmlerr      err;
ub4         flags;

flags = 0; /* defaults : global algorithm */
hash_level = 0; /* no hashing */
/* create XML meta context */
if (!(xctx = XmlCreate(&err, (oratext *) "XmlDiff", NULL)))
{
printf("Failed to create XML context, error %u\n",
(unsigned) err);
err_exit("Exiting");
}
/* Load the two input files */
if (!(doc1 = XmlLoadDom(xctx, &err, "file", inp1, "discard_whitespace", TRUE,
NULL)))
{
printf("Parsing first file failed, error %u\n", (unsigned)err);
err_exit((oratext *)"Exiting.");
}
if (!(doc2 = XmlLoadDom(xctx, &err, "file", inp2, "discard_whitespace", TRUE,
NULL)))
{
printf("Parsing second file failed, error %u\n", (unsigned)err);
err_exit((oratext *)"Exiting.");
}

/* run XmlDiff on the DOM trees. */

doc3 = XmlDiff(xctx, &err, flags, XMLDF_SRCT_DOM, doc1, NULL, XMLDF_SRCT_DOM,
doc2, NULL,hash_level, NULL);

if(!doc3)
printf("XmlDiff Failed, error %u\n", (unsigned)err);
else
{
if(err != XMLERR_OK)
printf("XmlDiff returned error %u\n", (unsigned)err);
/* Now we have the DOM tree in doc3 which represent the Diff */
...
}

XmlFreeDocument(xctx, doc1);
XmlFreeDocument(xctx, doc2);
XmlFreeDocument(xctx, doc3);
XmlDestroy(xctx);

出力のカスタマイズ

カスタマイズ済出力ビルダーは、アプリケーションに適したあらゆる形式の差分を格納します。XmlDiffによって生成され、Xdiffスキーマに準拠したデフォルトのXdiffインスタンス・ドキュメントを使用するかわりに、ユーザー自身のカスタマイズ済出力ビルダーを作成できます。

これを実行するには、XmlDiffが差分を決定した後にコールされるコールバックを提供する必要があります。差分はxmdlfopの配列としてコールバックに渡されます。差分が生成されるたびに、コールバックが呼び出される場合があります。

XPath生成に必要な内部状態の保守が不要なため、カスタマイズ済出力ビルダーを使用する方が、デフォルトを使用するパフォーマンスが向上する場合があります。

デフォルトでは、XmlDiffはXdiffスキーマに準拠するXMLでの差分を検出します。必要な場合は、出力ビルダーをプラグインしてください。差分は配列xmldfopとして表示されます。出力ビルダーのコールバック関数を書き込む必要があります。関数署名は次のとおりです。

xmlerr(*xdfobcb)(void *uctx, xmldfop *escript, ub4 escript_siz);

uctxは、ユーザー指定のコンテキストです。

escriptは、サイズescript_sizの配列です。

diff[escript_siz]

mctxは、メモリー・コンテキストです。

プロパティを介してこのメモリー・コンテキストをXmlDiff()に提供します。このメモリー・コンテキストを使用して、escriptに割り当てます。後でescriptを解放する必要があります。

XmlDiff()のコールが戻る前でも発生する差分が検出されたら、出力ビルダーのコールバックを起動します。出力ビルダーのコールバックは、複数回コールされます。

例21-5 カスタマイズ済XMLDiff出力

/* Sample useage:  */
...
#include <orastruc.h> / * for 'oraprop' * /
...
static oraprop diff_props[] = {
ORAPROP(XMLDF_PROPN_CUSTOM_OB, XMLDF_PROPI_CUSTOM_OB, POINTER),
ORAPROP(XMLDF_PROPN_CUSTOM_OBMCX, XMLDF_PROPI_CUSTOM_OBMCX, POINTER),
ORAPROP(XMLDF_PROPN_CUSTOM_OBUCX, XMLDF_PROPI_CUSTOM_OBUCX, POINTER),
{ NULL }
};
...
oramemctx *mymemctx;
...
xmlerr myob(void *uctx,  xmldfop *escript, ub4 escript_siz)
{
/* process diff which is available in escript * /

/* free escript - the caller has to do this * /
OraMemFree(mymemctx, escript);
}

main()
{
...
myctxt  *myctx;

diff_props[0].value_oraprop.p_oraprop_v = myob;
diff_props[1].value_oraprop.p_oraprop_v = mymemctx;
diff_props[2].value_oraprop.p_oraprop_v = myctx;
XmlDiff(xctx, &err, 0, doc1, NULL, 0, doc2, NULL, 0, diff_props);
...
}

XmlPatchの使用

XmlPatchは、XmlDiffによって生成されたものまたは別のメカニズムにより作成されたもののいずれかのXdiffインスタンス・ドキュメントを受け取り、Xdiffインスタンス・ドキュメント内の指示に従って、指定された他のXML文書を修正します。

- XmlPatchコマンドライン・ユーティリティの使用

- アプリケーションでのXmlPatchの使用

XmlPatchコマンドライン・ユーティリティの使用

表21-2に、XmlPatchコマンドライン・オプションを示します。

表21-2 XmlPatch for Cコマンドライン・オプション

オプション

説明

-eエンコーディング

デフォルトの入力ファイルのエンコーディングを指定します。XMLファイルでエンコーディングが指定されていない場合、このエンコーディングは入力対象とみなされます。

-Eエンコーディング

出力/データのエンコーディングを指定します。DOMおよびパッチ文書はこのエンコーディングで作成されます。デフォルトはUTF8です。

-i

ファイル名をURLとして解析します。

-h

使用方法のヘルプを表示します。

アプリケーションでのXmlPatchの使用

XmlPatchは、入力文書およびdiff文書のソース・タイプおよび場所を引数とします。ソース・タイプは、URL、ファイル、orastreamおよびstreamコンテキスト・ポインタ、バッファ、buffer_lengthポインタ、またはDOM文書要素(docelement)へのポインタです。

関連項目:
XmlPatchの動作を制御するフラグのC APIの詳細は、『Oracle Database XML C APIリファレンス』を参照してください。

Xdiffスキーマによって設定されたモードはXmlPatchの作業に影響します。

output-modelがSnapshotの場合、XmlPatchは、operations-in-docorderがTRUEの場合のみ作業します。

output-modelがCurrentの場合、operations-in-docorderをTRUEに設定する必要はありません。

例21-6 XmlPatchに関するサンプル・アプリケーション

...
#include <xmldf.h>
...
xmlctx     *xctx;
xmldocnode *doc1, *doc2;
oratext    *s;
oratext    *inp1 = "book1.xml"; /* input document */
oratext    *inp2 = "diff.xml", /* diff document */
xmlerr      err;

/* create XML meta context */
if (!(xctx = XmlCreate(&err, (oratext *) "XmlPatch", NULL)))
{
printf("Failed to create XML context, error %u\n",
(unsigned) err);
err_exit("Exiting");
}
/* Load the two input files */
if (!(doc1 = XmlLoadDom(xctx, &err, "file", inp1, "discard_whitespace", TRUE,
NULL)))
{
printf("Parsing first file failed, error %u\n", (unsigned)err);
err_exit((oratext *)"Exiting.");
}
if (!(doc2 = XmlLoadDom(xctx, &err, "file", inp2, "discard_whitespace", TRUE,
NULL)))
{
printf("Parsing second file failed, error %u\n", (unsigned)err);
err_exit((oratext *)"Exiting.");
}

/* call XmlPatch */
if(!XmlPatch(xctx, &err, 0, XMLDF_SRCT_DOM, doc1, NULL, XMLDF_SRCT_DOM,
doc2, NULL, NULL));

printf("XmlPatch Failed, error %u\n", (unsigned)err);
else
{
if(err != XMLERR_OK)
printf("XmlPatch returned error %u\n", (unsigned)err);
/* Now we have the patched document in doc1 */
...
}

XmlFreeDocument(xctx, doc1);
XmlFreeDocument(xctx, doc2);
XmlDestroy(xctx);

XmlHashの使用

Oracle XDKにより、XMLツリーまたはサブツリーに対するハッシュ値を計算するXmlHash,が提供されます。2つのサブツリーのハッシュ値が同一の場合、同じXMLである可能性が非常に高いです。たとえば、XMLツリーがすでにデータベース内にあるかどうかを見る場合、これを使用してすばやく比較できます。

必要な場合、一致がある可能性がある一致に対してXmlDiffを再度実行できます。新規文書のハッシュ値を計算して、データベースに問合せを実行できます。

例21-7に、XmlHashを使用するサンプル・プログラムを示します。

例21-7 XmlHashプログラム

sword main(sword argc, char *argv[])
{
xmlctx     *xctx;
xmldfsrct   srct;
oratext    *data_encoding, *input_encoding, *s, *inp1;
ub1         flags;
xmlerr      err;
ub4         num_args;
xmlhasht    digest;
flags = 0; /* defaults */
srct = XMLDF_SRCT_FILE;
inp1 = "somexml.xml";
xctx = XmlCreate(&err, (oratext *) "XmlHash", NULL);

if (!xctx)
{
/* handle error with creating xml context and exit */
...
}

/* run XmlHash */
err = XmlHash(xctx, &digest, 0, srct, inp1, NULL, NULL);
if(err)
printf("XmlHash returned error:%d \n", err);
else
txdfha_pd(digest);

XmlDestroy(xctx);

return (sword )err;
}

/* print bytes in xml hash */
static void txdfha_pd(xmlhasht digest)
{
ub4  i;

for(i = 0; i < digest.l_xmlhasht; i++)
printf("%x ", digest.d_xmlhasht[i]);

printf("\n");
}

XmlDiffおよびXmlPatchのコール

XmlDiffおよびXmlPatchは、コマンドライン・ツールとして、およびC言語からコールされます。SQL関数として使用可能です。

関連項目:

- 『Oracle Database SQL言語リファレンス』のXMLDiff

- 『Oracle Database SQL言語リファレンス』のXMLPatch

22 C XDKでのSOAPの使用

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

- SOAP for Cの概要

- SOAP C関数

- SOAPの例1: XML文書の送信

- SOAPの例2: 明確化を求めるレスポンス

- SOAPの例3: POSTの使用

関連項目:
『Oracle XML DB開発者ガイド』

SOAP for Cの概要

Simple Object Access Protocol(SOAP)は、HTTPおよびHTTPSにより分散環境のピア間の構造化情報や入力情報を送受信するためのXMLプロトコルです。XDK for 10gリリース2でサポートされるのはHTTP 1.0のみです。SOAPは次の3つの部分に分かれています。

- メッセージ内容の表示方法、メッセージの処理者、処理の任意または必須を定義するSOAPエンベロープ。

- アプリケーションのデータ型をXMLへ、またXMLをアプリケーションのデータ型へ変換するためのシリアライズおよびデシリアライズ・ルール。

- コールとレスポンスを定義するSOAPリモート・プロシージャ・コール(RPC)。

注意:
RPCとシリアライズおよびデシリアライズはこのリリースではサポートされません。

SOAPはXMLを使用するため、オペレーティング・システムや言語に依存しません。この章では、SOAPメッセージの読取りや書込みを行う関数のC実装について説明します。

SOAPバージョン1.2は、メッセージ内容を説明するXML Information Set(抽象データセット、XML 1.0も使用可)として指定されるXMLベースのメッセージ定義です。バージョン1.1もサポートされています。

関連項目:
W3C SOAP 1.2仕様については、次を参照してください。

- http://www.w3.org/TR/soap12-part0/(入門書)

- http://www.w3.org/TR/soap12-part1/(メッセージ・フレームワーク)

- http://www.w3.org/TR/soap12-part2/(補足)

SOAPメッセージの概要

Simple Object Access Protocol(SOAP)は、リクエストおよびレスポンスをインターネット経由で送受信するための軽量プロトコルです。このプロトコルはXMLおよび転送プロトコル(HTTPなど)に基づくもので、多くの場合、ファイアウォールによってブロックされません。SOAPはオペレーティング・システム、実装言語およびオブジェクト・モデルに依存しません。

SOAPの長所は、異種ソフトウェア・コンポーネント間の連結機能にあります。たとえば、Visual BasicクライアントからUNIXコンピュータ上で動作するCORBAサービスを起動したり、MacintoshクライアントからLinux上で動作するPerlオブジェクトを起動したりできます。

SOAPメッセージは次の部分に分かれています。

- エンベロープ: メッセージを含み、その処理方法、処理者、およびその処理がオプションか必須かを指定します。Envelope要素は必須です。

- エンコーディング規則: アプリケーションで使用するデータ型を記述します。これらの規則では、アプリケーションのデータ型をXMLへ、またXMLをデータ型へ変換するシリアライズ・メカニズムが定義されます。

- リモート・プロシージャ・コール(RPC): リクエストおよびレスポンスの規則を定義します。この必須要素は本体要素と呼ばれます。Body要素には、メソッド名を名前とする最初のサブ要素を指定します。このメソッド・リクエスト要素には、各入出力パラメータの要素が含まれます。要素名はパラメータ名です。RPCはこのリリースではサポートされていません。

SOAPは転送プロトコルに依存しません。ただし、HTTPによるリモート・サービスの起動に使用されるSOAPが、プログラミングされたコンテンツをインターネット上で提供するための標準として扱われています。

SOAPは、転送プロトコルに依存しないだけでなく、オペレーティング・システムにも依存しません。そのため、SOAPを使用すると、プログラムが異なる言語で記述されている場合や、異なるオペレーティング・システム上で実行される場合にも通信が可能です。

SOAPメッセージの書式

SOAPのメッセージには次の種類があります。

- サービスのリクエスト(入力パラメータを含む)

- リクエストされたサービスからのレスポンス(戻り値および出力パラメータを含む)

- エラー・コードおよびエラー情報を含むオプションのFault要素

SOAPのメッセージでは、ペイロードにXML用にエンコードされたデータが含まれます。処理情報は含まれません。メッセージ・ヘッダーには処理情報が含まれる場合があります。

SOAPリクエスト

SOAPリクエストでは、XMLペイロードに次のような要素が含まれます。

- ルート要素

- メソッド要素

- ヘッダー要素(オプション)

例22-1に、サンプルSOAPメッセージ・リクエストの書式を示します。GetLastTradePrice SOAPリクエストをStockQuoteサービスに送信します。このリクエストは企業の銘柄記号を示す文字列パラメータを取り、SOAPレスポンスで株価を示すfloat型を戻します。

例22-1 SOAPリクエスト・メッセージ

POST /StockQuote HTTP/1.0
Host: www.stockquoteserver.com
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

<SOAP-ENV:Envelope  xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
SOAP-ENV:encodingStyle="http://www.w3.org/2003/05/soap-encoding/">
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>ORCL</symbol>
<m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

例22-1のXML文書はSOAPメッセージです。<SOAP-ENV:Envelope>要素は、XML文書の最上位要素です。ペイロードはメソッド要素<m:GetLastTradePrice>で示されます。XML名前空間を使用して、SOAP識別子とアプリケーション固有の識別子を区別します。

ヘッダーの最初の行では、リクエストの転送プロトコルにHTTPを使用することが指定されています。

POST /StockQuote HTTP/1.1

SOAPは転送プロトコルに依存しないため、XMLペイロード形式を決定する規則は、このペイロードがHTTPで転送されるということには関係ありません。このHTTPリクエストはURI /StockQuoteを指しています。SOAP仕様ではコンポーネントのアクティブ化の問題を処理しないため、このURIでコンポーネントのアクティブ化方法とGetLastTradePriceメソッドの起動方法を指定します。

SOAPレスポンスの例

例22-2に、例22-1のリクエストに対するレスポンスの書式を示します。<Price>要素には、最初のメッセージでリクエストされたORCLの株価が含まれています。

例22-2 SOAPレスポンス・メッセージ

HTTP/1.0 200 OK
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn

<SOAP-ENV:Envelope  xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
SOAP-ENV:encodingStyle="http://www.w3.org/2003/05/soap-encoding/">
<SOAP-ENV:Body>
<m:GetLastTradePriceResponse xmlns:m="Some-URI">
<Price>13.5</Price>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

例22-1および例22-2のメッセージは、双方向のSOAPメッセージ(SOAPリクエストがSOAPレスポンスで応答される)を示しています。一方向のSOAPメッセージにはSOAPレスポンス・メッセージは不要です。

SOAPクライアントの使用

SOAPクライアントはXML文書を生成するユーザー作成アプリケーションです。生成されたXML文書でSOAPサービスへのリクエストを行い、SOAPレスポンスを処理します。XDKのSOAP実装は、有効なSOAPリクエストを送信するすべてのクライアントからのリクエストを処理します。

SOAPクライアントAPIの便利な機能を次に示します。

- リクエストおよびレスポンス用の同期式起動モデルをサポートします。

- SOAPリクエストを行うクライアント・アプリケーションの作成を簡素化します。

- SOAPリクエストの作成および基礎となる転送プロトコルを使用したリクエスト送信の詳細をカプセル化します。

- プラガブルな転送をサポートし、クライアントは転送を簡単に変更できます(HTTPおよびHTTPSによる転送が可能ですが、このリリースでサポートされるのはHTTP 1.0のみです)。

SOAPクライアントでリクエストの送信やレスポンスの受信を行うには、次の手順を実行する必要があります。

1. サービスの起動にすべての必要なパラメータを収集します。

2. SOAPプロトコルに従って作成されるXMLメッセージである、SOAPサービスのリクエスト・メッセージを作成します。これは、XMLでエンコードされたすべての入力パラメータのすべての値を含みます。このプロセスをシリアライズと呼びます。

3. SOAPサーバーがサポートする転送プロトコルを使用してリクエストをSOAPサーバーに送信します。

4. SOAPレスポンス・メッセージを受信します。

5. SOAP Fault要素を処理して、リクエストの成否を判断します。

6. XMLから戻されたパラメータをネイティブなデータ型に変換します。このプロセスをデシリアライズといいます。

7. 必要に応じて結果を使用します。

SOAPサーバーの使用

SOAPサーバーでは、SOAPサービス・リクエストの実行時に次の手順が実行されます。

1. SOAPサーバーは、サービス・リクエストを受信します。

2. XMLリクエストの解析後、メッセージを実行するか、拒否するかを決定します。

3. メッセージを実行する場合、リクエストされたサービスが存在するかどうかを判断します。

4. すべての入力パラメータをXMLからサービスが認識できるデータ型に変換します。

5. サービスを起動します。

6. 戻りパラメータをXMLに変換し、SOAPレスポンス・メッセージを生成します。

7. レスポンス・メッセージをコール元に戻します。

SOAP C関数

SOAP Cの実装では、xml.hヘッダーが使用されます。SOAPコンテキストを作成する前に、xmlctxタイプのコンテキストを作成する必要があります。

SOAPのHTTP要素はユーザーからは見えません。SOAPエンドポイントは、組合せ(バインディング、エンドポイント)で指定されます。ここで、バインディングはxmlsoapbindタイプ、バインディングに応じたエンドポイントは(void *)です。現在サポートされているバインディングは、XMLSOAP_BIND_HTTPのみです。HTTPバインディングの場合、エンドポイントは(OraText *) URLです。

SOAPレイヤーでエンドポイント間のSOAPメッセージが作成および転送され、受信したSOAPメッセージが分解されます。

C関数はxmlsoap.hで宣言します。次に、ヘッダー・ファイルの開始部分を示します。

例22-3 xmlsoap.hに定義されたSOAP C関数

FILE NAME
xmlsoap.h - XML SOAP APIs

FILE DESCRIPTION
XML SOAP Public APIs

PUBLIC FUNCTIONS
XmlSoapCreateCtx         - Create and return a SOAP context
XmlSoapDestroyCtx        - Destroy a SOAP context

XmlSoapCreateConnection  - Create a SOAP connection object
XmlSoapDestroyConnection - Destroy a SOAP connection object

XmlSoapCall              - Send a SOAP message & wait for reply

XmlSoapCreateMsg         - Create and return an empty SOAP message
XmlSoapDestroyMsg        - Destroy a SOAP message created
w/XmlSoapCreateMsg

XmlSoapGetEnvelope       - Return a SOAP message's envelope
XmlSoapGetHeader         - Return a SOAP message's envelope header
XmlSoapGetBody           - Return a SOAP message's envelope body

XmlSoapAddHeaderElement  - Adds an element to a SOAP header
XmlSoapGetHeaderElement  - Gets an element from a SOAP header

XmlSoapAddBodyElement    - Adds an element to a SOAP message body
XmlSoapGetBodyElement    - Gets an element from a SOAP message body

XmlSoapSetMustUnderstand - Set mustUnderstand attr for SOAP hdr elem
XmlSoapGetMustUnderstand - Get mustUnderstand attr from SOAP hdr elem

XmlSoapSetRole           - Set role for SOAP header element
XmlSoapGetRole           - Get role from SOAP header element

XmlSoapSetRelay          - Set relay Header element property
XmlSoapGetRelay          - Get relay Header element property

XmlSoapSetFault          - Set Fault in SOAP message
XmlSoapHasFault          - Does SOAP message have a Fault?
XmlSoapGetFault          - Return Fault code, reason, and details

XmlSoapAddFaultReason    - Add additional Reason to Fault
XmlSoapAddFaultSubDetail - Add additional child to Fault Detail
XmlSoapGetReasonNum      - Get number of Reasons in Fault element
XmlSoapGetReasonLang     - Get a lang of a reasons with a
particular iindex.

XmlSoapError             - Get error message(s)

*/

#ifndef XMLSOAP_ORACLE
# define XMLSOAP_ORACLE

# ifndef XML_ORACLE
#  include <xml.h>
# endif

/*---------------------------------------------------------------------------
Package SOAP - Simple Object Access Protocol APIs

W3C: "SOAP is a lightweight protocol for exchange of information
in a decentralized, distributed environment.  It is an XML based
protocol that consists of three parts: an envelope that defines a
framework for describing what is in a message and how to process
it, a set of encoding rules for expressing instances of
application-defined datatypes, and a convention for representing
remote procedure calls and responses."
Atachments are only allowed in Soap 1.1
In Soap 1.2 body may not have other elements if Fault is present.

Structure of a SOAP message:

[SOAP message (XML document)
[SOAP envelope
[SOAP header?
element*
]
[SOAP body
(element* | Fault)?
]
]
]
---------------------------------------------------------------------------*/
...

関連項目:
C SOAP APIについては、『Oracle Database XML C APIリファレンス』を参照してください。

SOAPの例1: XML文書の送信

次に、旅行会社にJohn Smithのニューヨーク発ロサンゼルス行きの航空券を予約するリクエストを記述したXML文書の例を示します。

例22-4 例1 SOAPメッセージ

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<m:reservation xmlns:m="http://travelcompany.example.org/reservation"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
<m:dateAndTime>2001-11-29T13:20:00.000-05:00</m:dateAndTime>
</m:reservation>
<n:passenger xmlns:n="http://mycompany.example.com/employees"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<n:name>John Smith</n:name>
</n:passenger>
</env:Header>
<env:Body>
<p:itinerary
xmlns:p="http://travelcompany.example.org/reservation/travel">
<p:departure>
<p:departing>New York</p:departing>
<p:arriving>Los Angeles</p:arriving>
<p:departureDate>2001-12-14</p:departureDate>
<p:departureTime>late afternoon</p:departureTime>
<p:seatPreference>aisle</p:seatPreference>
</p:departure>
<p:return>
<p:departing>Los Angeles</p:departing>
<p:arriving>New York</p:arriving>
<p:departureDate>2001-12-20</p:departureDate>
<p:departureTime>mid-morning</p:departureTime>
<p:seatPreference/>
</p:return>
</p:itinerary>
<q:lodging
xmlns:q="http://travelcompany.example.org/reservation/hotels">
<q:preference>none</q:preference>
</q:lodging>
</env:Body>
</env:Envelope>

この例では、XML文書の作成、送信、リプライの受信、分解が簡素化されています。最小限のエラー・チェックが行われます。エラーを修正するDEBUGオプションが示されています。このプログラムは、すべてのオペレーティング・システムで動作するとはかぎりません。このXML文書を送信するには、クライアントのCプログラムで次の手順を実行します。

- main()で変数を宣言した後、XMLコンテキスト、xctxをXmlCreate()で作成し、このコンテキストを使用してSOAPコンテキスト、ctxをXmlSoapCreateCtx()で作成します。

- メッセージを作成するためにXmlSoapCreateMsg()をコールすると、空のSOAPメッセージが戻されます。

- ヘッダーをXmlSoapAddHeaderElement()、XmlSoapSetRole()、XmlSoapSetMustUnderstand()およびXmlDomAddTextElem()で作成して、エンベロープにテキストを指定します。

- 本体要素をXmlSoapAddBodyElement()とXmlDomCreateElemNS()で作成し、XmlDomAddTextElem()をコールします。次に、XmlDomAppendChild()を追加すれば、ニューヨーク発ロサンゼルス行きの便を指定する本体のセクションが完成します。

- 帰りの航空券についても同様の方法で作成します。宿泊先を新たなXmlSoapAddBodyElement()コールで追加します。

- 次に、XmlSoapCreateConnection()で接続を作成し、HTTPバインディング(現時点で使用可能な唯一のバインディング)とエンドポイントのURLを指定する必要があります。

- XmlSoapCall()関数で、SOAPサーバーを使用して定義済の接続でメッセージを送信し、リプライを待機します。

- メッセージ返信は別のSOAPメッセージの形式で戻されます。それには、XmlSaveDom()とXmlSoapHasFault()をXmlSoapGetFault()とともに使用して、フォルトをチェックし、分析します。フォルトを解析して各部分に分けます。その出力結果がこの例です。

- フォルトが戻されなければ、次のXmlSoapGetBody()でエンベロープの本体が戻されます。XmlSaveDom()を実行すると、戻されたメッセージの分析が完了します。

- クリーンアップするには、メッセージとリプライのそれぞれに対してXmlSoapDestroyMsg()を実行し、XmlDestroyCtx()でSOAPコンテキストを削除し、XmlDestroy()でXMLコンテキストを削除します。

例1のCクライアント・プログラムを次に示します。

例22-5 例1 SOAP Cクライアント

#ifndef S_ORACLE
# include <s.h>
#endif

#ifndef XML_ORACLE
# include <xml.h>
#endif

#ifndef XMLSOAP_ORACLE
# include <xmlsoap.h>
#endif

#define MY_URL "http://my_url.com"

/* static function declaration */
static xmlerr add_ns_decl(xmlsoapctx  *ctx, xmlctx *xctx, xmlelemnode *elem,
oratext *pfx, oratext *uri);

sb4 main( sword argc, char *argv[])
{
xmlctx      *xctx;
xmlerr       xerr;
xmlsoapctx  *ctx;
oratext     *url;
xmlsoapcon  *con;

xmldocnode  *msg1, *reply, *msg2, *msg3;
xmlelemnode *res, *pas, *pref, *itin, *departure, *ret, *lodging;
xmlelemnode *departing, *arriving, *trans, *text, *charge, *card, *name;
xmlelemnode *body, *header;
boolean      has_fault;
oratext     *code, *reason, *lang, *node, *role;
xmlelemnode *detail;
oratext *comp_uri   = "http://travelcompany.example.org/";
oratext *mres_uri   = "http://travelcompany.example.org/reservation";
oratext *trav_uri   = "http://travelcompany.example.org/reservation/travel";
oratext *hotel_uri  = "http://travelcompany.example.org/reservation/hotels";
oratext *npas_uri   = "http://mycompany.example.com/employees";

oratext *tparty_uri = "http://thirdparty.example.org/transaction";
oratext *estyle_uri = "http://example.com/encoding";
oratext *soap_style_uri = "http://www.w3.org/2003/05/soap-encoding";
oratext *estyle     = "env:encodingStyle";
oratext *finance_uri = "http://mycompany.example.com/financial";

if (!(xctx = XmlCreate(&xerr, (oratext *)"SOAP_test",NULL)))
{
printf("Failed to create XML context, error %u\n", (unsigned) xerr);
return EX_FAIL;
}
/* Create SOAP context */
if (!(ctx = XmlSoapCreateCtx(xctx, &xerr, (oratext *) "example", NULL)))
{
printf("Failed to create SOAP context, error %u\n", (unsigned) xerr);
return EX_FAIL;
}

/* EXAMPLE 1 */
/* construct message */
if (!(msg1 = XmlSoapCreateMsg(ctx, &xerr)))
{
printf("Failed to create SOAP message, error %u\n", (unsigned) xerr);
return xerr;
}
res = XmlSoapAddHeaderElement(ctx, msg1, "m:reservation", mres_uri, &xerr);
xerr = XmlSoapSetRole(ctx, res, XMLSOAP_ROLE_NEXT);
xerr = XmlSoapSetMustUnderstand(ctx, res, TRUE);
(void) XmlDomAddTextElem(xctx, res, mres_uri, "m:reference",
"uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d");
(void) XmlDomAddTextElem(xctx, res, mres_uri, "m:dateAndTime",
"2001-11-29T13:20:00.000-05:00");
pas = XmlSoapAddHeaderElement(ctx, msg1, "n:passenger", npas_uri, &xerr);
xerr = XmlSoapSetRole(ctx, pas, XMLSOAP_ROLE_NEXT);
xerr = XmlSoapSetMustUnderstand(ctx, pas, TRUE);
(void) XmlDomAddTextElem(xctx, pas, npas_uri, "n:name",
"John Smith");
/* Fill body */
/* Itinerary */
itin = XmlSoapAddBodyElement(ctx, msg1, "p:itinerary", trav_uri, &xerr);
/* Departure */
departure = XmlDomCreateElemNS(xctx, msg1,  trav_uri, "p:departure");
(void) XmlDomAddTextElem(xctx, departure, trav_uri,
"p:departing","New York");
(void) XmlDomAddTextElem(xctx, departure, trav_uri,
"p:arriving", "Los Angeles");
(void) XmlDomAddTextElem(xctx, departure, trav_uri,
"p:departureDate", "2001-12-14");
(void) XmlDomAddTextElem(xctx, departure, trav_uri,
"p:departureTime", "late afternoon");
(void) XmlDomAddTextElem(xctx, departure, trav_uri,
"p:seatPreference", "aisle");
XmlDomAppendChild(xctx, itin, departure);

/* Return */
ret = XmlDomCreateElemNS(xctx, msg1,  trav_uri, "p:return");
(void) XmlDomAddTextElem(xctx, ret, trav_uri,
"p:departing", "Los Angeles");
(void) XmlDomAddTextElem(xctx, ret, trav_uri,
"p:arriving", "New York");
(void) XmlDomAddTextElem(xctx, ret, trav_uri,
"p:departureDate", "2001-12-20");
(void) XmlDomAddTextElem(xctx, ret, trav_uri,
"p:departureTime", "mid-morning");
pref = XmlDomCreateElemNS(xctx, msg1, trav_uri, "p:seatPreference");
(void) XmlDomAppendChild(xctx, ret, pref);
XmlDomAppendChild(xctx, itin, ret);

/* Lodging */
lodging = XmlSoapAddBodyElement(ctx, msg1, "q:lodging", hotel_uri, &xerr);
(void) XmlDomAddTextElem(xctx, lodging, hotel_uri,
"q:preference", "none");

#ifdef DEBUG
/* dump the message in debug mode */
printf("Message:\n");
XmlSaveDom(xctx, &xerr, msg1, "stdio", stdout, "indent_step", 1, NULL);
#endif

/* END OF EXAMPLE 1 */

/* create connection */
url = MY_URL;
if (!(con = XmlSoapCreateConnection(ctx, &xerr, XMLSOAP_BIND_HTTP,
url, NULL, 0, NULL, 0,
"XTest: baz", NULL)))
{
printf("Failed to create SOAP connection, error %u\n", (unsigned) xerr);
return xerr;
}

reply = XmlSoapCall(ctx, con, msg1, &xerr);
XmlSoapDestroyConnection(ctx, con);

if (!reply)
{
printf("Call failed, no message returned.\n");
return xerr;
}

#ifdef DEBUG
printf("Reply:\n");
XmlSaveDom(xctx, &xerr, reply, "stdio", stdout, NULL);
#endif

printf("\n==== Header:\n ");
header = XmlSoapGetHeader(ctx, reply, &xerr);
if (!header)
{
printf("NULL\n");
}
else
XmlSaveDom(xctx, &xerr, header, "stdio", stdout, NULL);

/* check for fault */
has_fault = XmlSoapHasFault(ctx, reply, &xerr);
if(has_fault)
{
lang = NULL;
xerr = XmlSoapGetFault(ctx, reply, &code, &reason, &lang,
&node, &role, &detail);
if (xerr)
{
printf("error getting Fault %d\n", xerr);
return EX_FAIL;
}
if(code)
printf("   Code -- %s\n", code);
else
printf("   NO Code\n");
if(reason)
printf("   Reason -- %s\n", reason);
else
printf("   NO Reason\n");
if(lang)
printf("   Lang -- %s\n", lang);
else
printf("   NO Lang\n");
if(node)
printf("   Node -- %s\n", node);
else
printf("   NO Node\n");
if(role)
printf("   Role -- %s\n", role);
else
printf("   NO Role\n");
if(detail)
{
printf("   Detail\n");
XmlSaveDom(xctx, &xerr, detail, "stdio", stdout, NULL);
printf("\n");
}
else
printf("   NO Detail\n");

}
else
{
body = XmlSoapGetBody(ctx, reply, &xerr);
printf("==== Body:\n ");
if (!body)
{
printf("NULL\n");
return EX_FAIL;
}
XmlSaveDom(xctx, &xerr, body, "stdio", stdout, NULL);
}
(void) XmlSoapDestroyMsg(ctx, reply);
(void) XmlSoapDestroyMsg(ctx, msg1);
(void) XmlSoapDestroyCtx(ctx);
XmlDestroy(xctx);
}

SOAPの例2: 明確化を求めるレスポンス

旅行会社は、旅行者John Smithがニューヨークのどの空港から出発するかを知る必要があります。選択肢としてJFK(ケネディ空港)、EWR(ニューアーク空港)、LGA(ラガーディア空港)があります。そこで次のリプライが送信されます。

例22-6 例2 SOAPメッセージ

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<m:reservation xmlns:m="http://travelcompany.example.org/reservation"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference>
<m:dateAndTime>2001-11-29T13:35:00.000-05:00</m:dateAndTime>
</m:reservation>
<n:passenger xmlns:n="http://mycompany.example.com/employees"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<n:name>John Smith</n:name>
</n:passenger>
</env:Header>
<env:Body>
<p:itineraryClarification
xmlns:p="http://travelcompany.example.org/reservation/travel">
<p:departure>
<p:departing>
<p:airportChoices>
JFK LGA EWR
</p:airportChoices>
</p:departing>
</p:departure>
<p:return>
<p:arriving>
<p:airportChoices>
JFK LGA EWR
</p:airportChoices>
</p:arriving>
</p:return>
</p:itineraryClarification>
</env:Body>
</env:Envelope>

このXML文書をSOAPメッセージとして送信するには、例22-5「例1 SOAP Cクライアント」の/* EXAMPLE 1 */から/* END OF EXAMPLE 1 */までの行を次のコード・ブロックに置き換えます。

例22-7 例2 SOAP Cクライアント

#define XMLSOAP_MAX_NAME        1024

/* we need this function for examples 2 and 3 */
static xmlerr add_ns_decl(xmlsoapctx  *ctx, xmlctx *xctx, xmlelemnode *elem,
oratext *pfx, oratext *uri)
{
oratext     *aq, aqbuf[XMLSOAP_MAX_NAME];
xmldocnode  *doc;
oratext     *xmlns = "xmlns:";

/* if no room for "xmlns:usersprefix\0" then fail now */
if ((strlen((char *)pfx) + strlen((char *)xmlns)) >
sizeof(aqbuf))
return EX_FAIL;
(void) strcpy((char *)aqbuf, (char *)xmlns);
strcat((char *)aqbuf, (char *)pfx);
doc = XmlDomGetOwnerDocument(xctx, elem);
aq = XmlDomSaveString(xctx, doc, aqbuf);
XmlDomSetAttrNS(xctx, elem, uri, aq, uri);
return XMLERR_OK;
}

/* EXAMPLE 2 */
/* construct message */
if (!(msg2 = XmlSoapCreateMsg(ctx, &xerr)))
{
printf("Failed to create SOAP message, error %u\n", (unsigned) xerr);
return xerr;
}
res = XmlSoapAddHeaderElement(ctx, msg2, "m:reservation", mres_uri, &xerr);
xerr = XmlSoapSetRole(ctx, res, XMLSOAP_ROLE_NEXT);
xerr = XmlSoapSetMustUnderstand(ctx, res, TRUE);
(void) XmlDomAddTextElem(xctx, res, mres_uri, "m:reference",
"uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d");
(void) XmlDomAddTextElem(xctx, res, mres_uri, "m:dateAndTime",
"2001-11-29T13:35:00.000-05:00");
pas = XmlSoapAddHeaderElement(ctx, msg2, "n:passenger", npas_uri, &xerr);
xerr = XmlSoapSetRole(ctx, pas, XMLSOAP_ROLE_NEXT);
xerr = XmlSoapSetMustUnderstand(ctx, pas, TRUE);
(void) XmlDomAddTextElem(xctx, pas, npas_uri, "n:name",
"John Smith");
/* Fill body */
/* Itinerary */
itin = XmlSoapAddBodyElement(ctx, msg2, "p:itineraryClarification",
trav_uri, &xerr);
/* Departure */
departure = XmlDomCreateElemNS(xctx, msg2,  trav_uri, "p:departure");
departing = XmlDomCreateElem(xctx, msg2,  "p:departing");
(void) XmlDomAddTextElem(xctx, departing, trav_uri,
"p:airportChoices", "JFK LGA EWR");
(void) XmlDomAppendChild(xctx, departure, departing);
XmlDomAppendChild(xctx, itin, departure);

/* Return */
ret = XmlDomCreateElemNS(xctx, msg2,  trav_uri, "p:return");
arriving = XmlDomCreateElemNS(xctx, msg2,  trav_uri, "p:arriving");
(void) XmlDomAddTextElem(xctx, arriving, trav_uri,
"p:airportChoices", "JFK LGA EWR");
XmlDomAppendChild(xctx, ret, arriving);
XmlDomAppendChild(xctx, itin, ret);

#ifdef DEBUG
XmlSaveDom(xctx, &xerr, msg2, "stdio", stdout, "indent_step", 1, NULL);
#endif

SOAPの例3: POSTの使用

最後のXML文書では、John Smithのクレジット・カード情報をPOSTメソッドで送信します。次の例では、XmlSoapCall()の実行により、XMLメッセージの前にHTTPヘッダーが記述されています。

例22-8 例3 SOAPメッセージ

POST /Reservations HTTP/1.0
Host: travelcompany.example.org
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn

<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" >
<env:Header>
<t:transaction
xmlns:t="http://thirdparty.example.org/transaction"
env:encodingStyle="http://example.com/encoding"
env:mustUnderstand="true" >5</t:transaction>
</env:Header>
<env:Body>
<m:chargeReservation
env:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:m="http://travelcompany.example.org/">
<m:reservation xmlns:m="http://travelcompany.example.org/reservation">
<m:code>FT35ZBQ</m:code>
</m:reservation>
<o:creditCard xmlns:o="http://mycompany.example.com/financial">
<n:name xmlns:n="http://mycompany.example.com/employees">
John Smith
</n:name>
<o:number>123456789099999</o:number>
<o:expiration>2005-02</o:expiration>
</o:creditCard>
</m:chargeReservation>
</env:Body>
</env:Envelope>

Cクライアントでは、例22-5「例1 SOAP Cクライアント」の2番目の例と同じ箇所を次のコード・ブロックに置き換えます。

例22-9 例3 SOAP Cクライアント

#define XMLSOAP_MAX_NAME        1024

/* we need this function for examples 2 and 3 */
static xmlerr add_ns_decl(xmlsoapctx  *ctx, xmlctx *xctx, xmlelemnode *elem,
oratext *pfx, oratext *uri)
{
oratext     *aq, aqbuf[XMLSOAP_MAX_NAME];
xmldocnode  *doc;
oratext     *xmlns = "xmlns:";

/* if no room for "xmlns:usersprefix\0" then fail now */
if ((strlen((char *)pfx) + strlen((char *)xmlns)) >
sizeof(aqbuf))
return EX_FAIL;
(void) strcpy((char *)aqbuf, (char *)xmlns);
strcat((char *)aqbuf, (char *)pfx);
doc = XmlDomGetOwnerDocument(xctx, elem);
aq = XmlDomSaveString(xctx, doc, aqbuf);
XmlDomSetAttrNS(xctx, elem, uri, aq, uri);
return XMLERR_OK;
}

/* EXAMPLE 3 */
if (!(msg3 = XmlSoapCreateMsg(ctx, &xerr)))
{
printf("Failed to create SOAP message, error %u\n", (unsigned) xerr);
return xerr;
}
trans = XmlSoapAddHeaderElement(ctx,msg3, "t:transaction", tparty_uri, &xerr);
xerr = XmlSoapSetMustUnderstand(ctx, trans, TRUE);
XmlDomSetAttr(xctx, trans, estyle, estyle_uri);
text = XmlDomCreateText(xctx, msg3, "5");
XmlDomAppendChild(xctx, trans, text);

/* Fill body */
/* Charge Reservation */
charge = XmlSoapAddBodyElement(ctx,msg3,"m:chargeReservation",comp_uri,&xerr);
XmlDomSetAttr(xctx, charge, estyle, soap_style_uri);
res = XmlDomCreateElemNS(xctx, msg3, mres_uri,  "m:reservation");
if (add_ns_decl(ctx, xctx, res, "m", mres_uri))
return EX_FAIL;
(void) XmlDomAddTextElem(xctx, res, mres_uri,
"m:code", "FT35ZBQ");
(void) XmlDomAppendChild(xctx, charge, res);

/* create card elem with  namespace */
card = XmlDomCreateElemNS(xctx, msg3, finance_uri, "o:creditCard");
if (add_ns_decl(ctx, xctx, card, "o", finance_uri))
return EX_FAIL;
name =  XmlDomAddTextElem(xctx, card, npas_uri,
"n:name", "John Smith");
/* add namespace */
if (add_ns_decl(ctx, xctx, name, "n", npas_uri))
return EX_FAIL;
(void)  XmlDomAddTextElem(xctx, card, finance_uri,
"o:number", "123456789099999");
(void) XmlDomAddTextElem(xctx, card, finance_uri,
"o:expiration", "2005-02");
(void) XmlDomAppendChild(xctx, charge, card);

#ifdef DEBUG
XmlSaveDom(xctx, &xerr, msg3, "stdio", stdout, "indent_step", 1, NULL);
#endif

第III部

Oracle XDK for C++

第III部の各章では、C++でのアプリケーション開発におけるOracle XDKの使用方法を説明します。

章構成は次のとおりです。

- 第23章「C++ XDKコンポーネントを使用する前に」

- 第24章「統合C++インタフェースの概要」

- 第25章「XML Parser for C++の使用」

- 第26章「XSLT Processor for C++の使用」

- 第27章「XML Schema Processor for C++の使用」

- 第28章「XPath Processor for C++の使用」

- 第29章「XML Class Generator for C++の使用」

23 C++ XDKコンポーネントを使用する前に

この章では、インストールしたOracle DatabaseのXDKについて説明します。C++のデモ・プログラムは、Examplesメディアにあります。

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

- C++ XDKコンポーネントのインストール

- C++ XDKコンポーネント用のUNIX環境の構成

- C++ XDKコンポーネント用のWindows環境の構成

C++ XDKコンポーネントのインストール

C++ XDKコンポーネントは、Oracle DatabaseおよびOracle Application Serverに付属しています。

インストールの手順は、「XDKのインストール」を参照してください。

関連項目:
C++ XDKコンポーネントのリストは、「Oracle XML Developer's Kit(XDK)の概要」を参照してください。

C++ XDKコンポーネント用のUNIX環境の構成

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

- UNIXでのC++ XDKコンポーネントの依存性

- UNIXでのC++ XDK環境変数の設定

- UNIXでのC++ XDK実行時環境のテスト

- UNIXでのC++ XDKコンパイル時環境の設定とテスト

- UNIXでのC++ XDKコンポーネントのバージョンの検証

UNIXでのC++ XDKコンポーネントの依存性

この項で説明するC++ライブラリは、$ORACLE_HOME/libにあります。CおよびC++ XDKコンポーネントは、次のライブラリに含まれます。

libxml11.a

「UNIXでのC XDKコンポーネントの依存性」で説明しているC XDKコンポーネントに加えて、ライブラリには、入力DTDまたはXML Schemaに基づいてC++ソース・ファイルを作成するXML Class Generatorが含まれます。

「UNIXでのC XDKコンポーネントの依存性」の表16-1に、C XDKコンポーネント(UNIX)が依存するOracleのCOREライブラリおよびGlobalization Supportライブラリを示しています。CとC++の両方で、ライブラリの依存性は同じです。

UNIXでのC++ XDK環境変数の設定

「UNIXでのC XDK環境変数の設定」の表16-2に、C XDKコンポーネントを使用するときに必要なUNIX環境変数を示しています。CとC++の両方で、環境変数は同じです。

UNIXでのC++ XDK実行時環境のテスト

「UNIXでのC XDK実行時環境のテスト」の表16-3に示すいずれかのユーティリティを実行して、環境をテストできます。これらのユーティリティはCユーティリティであり、C++バージョンはありません。

UNIXでのC++ XDKコンパイル時環境の設定とテスト

CおよびC++の両方のヘッダー・ファイルが$ORACLE_HOME/xdk/includeにあります。表23-1に、C++のヘッダー・ファイルを示します。「UNIXでのC XDKコンパイル時環境の設定とテスト」の表16-4に、Cのヘッダー・ファイルを示しています。C++コードをコンパイルする前に、実行時環境を設定する必要があります。

表23-1 C++ XDKコンパイル時環境のヘッダー・ファイル

ヘッダー・ファイル

説明

oraxml.hpp

libxml.aに含まれるOracle9i XML ORAデータ型とパブリックORA APIをインクルードします(下位互換性のみを目的としています)。

oraxmlcg.h

C++ Class Generator用のC APIをインクルードします(下位互換性のみを目的としています)。

oraxsd.hpp

Oracle9i XSDバリデータのデータ型とAPIをインクルードします(下位互換性のみを目的としています)。

xml.hpp

OCI経由で使用するか単独で使用するかにかかわらず、統合されたDOM APIを透過的に処理します。

xmlotn.hpp

単独でコンパイルするか、OCIおよび統合されたDOMを使用してコンパイルするかにかかわらず、共通APIをインクルードします。

xmlctx.hpp

初期化および例外処理のパブリックAPIをインクルードします。

UNIXでのC++ XDKコンパイル時環境のテスト

コンパイル時環境をテストする最も簡単な方法は、サンプル・プログラムに対してmakeユーティリティを実行することです。このデモ・プログラムは、Oracle Database CDではなくExamplesメディアにあります。デモ・プログラムをインストールすると、$ORACLE_HOME/xdk/demo/cppに配置されます。

サンプル・プログラムをビルドし、実行します。そのためには、システム・プロンプトで次のコマンドを実行します。

cd $ORACLE_HOME/xdk/demo/cpp
make

UNIXでのC++ XDKコンポーネントのバージョンの検証

使用しているXDKのバージョンを取得するには、$ORACLE_HOME/libに移動し、システム・プロンプトで次のコマンドを実行します。

strings libxml10.a | grep -i developers

C++ XDKコンポーネント用のWindows環境の構成

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

- WindowsでのC++ XDKコンポーネントの依存性

- WindowsでのC++ XDK環境変数の設定

- WindowsでのC++ XDK実行時環境のテスト

- WindowsでのC++ XDKコンパイル時環境の設定とテスト

- Visual C/C++でのC++ XDKコンポーネントの使用

WindowsでのC++ XDKコンポーネントの依存性

この項で説明するC++ライブラリは、%ORACLE_HOME%\libにあります。XDK CおよびC++コンポーネントは、次のWindowsライブラリに含まれます。

libxml10.dll

「WindowsでのC XDKコンポーネントの依存性」の表16-5に、Cコンポーネント(Windows)が依存するOracleのCOREライブラリおよびGlobalization Supportライブラリを示しています。CとC++の両方で、ライブラリの依存性は同じです。

WindowsでのC++ XDK環境変数の設定

「WindowsでのC XDK環境変数の設定」の表16-6に、XDK Cコンポーネントを使用するときに必要なWindows環境変数を示しています。CとC++の両方で、環境変数は同じです。

WindowsでのC++ XDK実行時環境のテスト

「WindowsでのC XDK実行時環境のテスト」の表16-7に示すいずれかのユーティリティを実行して、環境をテストできます。これらのユーティリティはCユーティリティであり、C++バージョンはありません。

WindowsでのC++ XDKコンパイル時環境の設定とテスト

「UNIXでのC++ XDKコンパイル時環境の設定とテスト」の表23-1に、WindowsでのCコンポーネントのコンパイルに必要なヘッダー・ファイルを示します。UNIXのインストールとWindowsのインストールの両方で、相対ファイル名は同じです。

Windowsでは、ヘッダー・ファイルは%ORACLE_HOME%\xdk\includeにあります。コードをコンパイルする前に、実行時環境を設定する必要があります。

WindowsでのC++ XDKコンパイル時環境のテスト

デモ・プログラムをコンパイルすることによって、コンパイル時環境をテストできます。Oracle Database Examplesメディアからインストールした場合、デモ・プログラムは%ORACLE_HOME%\xdk\demo\cppにあります。

C++コンパイラのパスを設定する手順は、「WindowsでのC XDKコンパイラ・パスの設定」に示す手順と同じです。Make.batファイルを編集する手順は、「WindowsでのMake.batファイルの編集」に示す手順と同じです。

Visual C/C++でのC++ XDKコンポーネントの使用

Microsoft Visual C/C++でプロジェクトを設定し、XDKに付属しているデモに使用できます。手順は、「WindowsでのC XDKコンポーネントとVisual C/C++の使用」を参照してください。

24 統合C++インタフェースの概要

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

- 統合C++ APIの概要

- C++インタフェースへのアクセス

- OracleXML名前空間

- Ctx名前空間

- IO名前空間

- ツール製品のパッケージ

- エラー・メッセージ・ファイル

統合C++ APIの概要

XMLツールの統合C++ APIとは、OracleのXMLツール製品の一連のC++インタフェースを表します。この統合によって、一般的なインタフェース・ベースのフレームワークが提供されます。このフレームワークを使用すると、XMLツール製品を改善、更新、置換または追加できます。この動作がインタフェース・ベースのユーザー・コードに影響を及ぼすことはなく、アプリケーション・ドライバおよびアプリケーション構成に及ぼす影響は最小限で済みます。一般的なテンプレート・パラメータによって表される3種類のインタフェース(抽象クラス、テンプレートおよび暗黙的なインタフェース)はすべて、統合したフレームワークで使用されます。

注意:
新規のXDKアプリケーションには、xml.hppに統合された新規のC++ APIを使用してください。oraxml.hppにある以前のC++ APIは非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。
これらのC++のAPIは、できるだけ緊密にW3C仕様をサポートしています。ただし、W3C仕様ではC++実装をサポートしていないため、この実装でW3C仕様が完全にサポートされるかどうかは保証できません。

C++インタフェースへのアクセス

C++インタフェースは、Oracle Databaseに付属しています。サンプル・ファイルは、$ORACLE_HOME/xdk/demo/cppにあります。

ソフトウェア・アーカイブのルート・ディレクトリにあるreadme.htmlファイルには、不具合の修正や追加のAPIなどのリリース固有の情報が含まれています。

OracleXML名前空間

OracleXmlは、すべてのXML C++インタフェースのC++名前空間です。これには、異なるXDKパッケージに共通するインタフェースおよび名前空間が含まれます。次の名前空間が含まれます。

- Ctx: TCtxに関連する宣言の名前空間

- Dom: Domに関連する宣言の名前空間

- Parser: パーサーおよびスキーマ・バリデータ宣言の名前空間

- IO: 入力および出力ソース宣言の名前空間

- Xsl: XSLTに関連する宣言の名前空間

- XPath: XPathに関連する宣言の名前空間

- Tools: Tools::Factoryに関連する宣言の名前空間

OracleXmlはファイルxml.hppで完全に定義されています。ユーザーに対して表示可能な別の名前空間、XmlCtxNSはxmlctx.hppで定義されています。この名前空間には、xmlctxコンテキストのCレベルの定義に対応するデータ構造および関連するデータ構造の、C++の定義が含まれています。ユーザーがこの名前空間の詳細を認識する必要はありませんが、xmlctx.hppをほとんどのアプリケーションのメイン・モジュールに含める必要があります。

複数のエンコーディングが、現在すべての実装で使用される予定である、oratextタイプに基づいてサポートされています。全文字列はoratext*として表されます。

OracleXMLインタフェース

XMLExceptionインタフェース: 全XML例外のルート・インタフェースです。

Ctx名前空間

Ctx名前空間には、TCtxインタフェースに関連するデータ型およびインタフェースが含まれます。

OracleXMLデータ型

DATATYPEエンコーディング: 特定のサポートされるエンコーディングです。次の種類のエンコーディング(またはエンコーディング名)がサポートされます。

- data_encoding

- default_input_encoding

- input_encoding: 前述のエンコーディングを上書きします。

- error_language: エラー・ハンドラの言語によって上書きされます(指定されている場合)。

DATATYPEエンコーディング: エンコーディングの配列です。

Ctxインタフェース

ErrorHandlerインタフェース: ルート・エラー・ハンドラ・クラスです。これは、主に基礎となるC実装からのエラーをローカル処理します。一部の実装では、XmlExceptionがスローされる可能性があります。ただし、すべての実装の要件を満たす目的で、これは署名では指定されていません。しかし、例外オブジェクトの作成は可能です。このエラー・ハンドラは、TCtxが初期化されるときにTCtxコンストラクタに渡されます。このインタフェースの実装はユーザーが行います。

MemAllocatorインタフェース: 将来、異なる割当て方法を使用できるように、TCtxインタフェースを合理的に一般化する単純なルート・インタフェースです。これは、TCtxが初期化されるときにTCtxコンストラクタに渡されます。これは、割り当てられるオブジェクトのタイプを認識しない低レベルのアロケータです。このインタフェースを含むアロケータは直接使用できます。この場合、ユーザーは(deallocを使用して)オブジェクトを明示的に割当て解除する責任があります。

MemAllocatorインタフェースがTCtxコンストラクタに対するパラメータとして渡される場合、通常、演算子newを上書きできます。この場合、CおよびC++両方におけるすべてのメモリー割当ては同じアロケータによって行われます。

Tctxインタフェース: XMLコンテキスト実装に対する暗黙的なインタフェースです。これは、主にメモリー割当て、エラー(例外以外の)処理および異なるエンコーディング処理で使用されます。コンテキスト・インタフェースは、タイプ・パラメータとして使用される暗黙的なインタフェースです。TCtxという名前は、対応するタイプ・パラメータ名として使用されます。実際の置換は、実際のコンテキスト実装によってパラメータ化(テンプレート化)された実装をインスタンス化することで行われます。この場合、エラーXmlExceptionがスローされる可能性があります。すべてのコンストラクタで、コンテキスト実装を作成および初期化できます。マルチスレッド環境では、各スレッドに対して別個のコンテキスト実装を初期化する必要があります。

IO名前空間

IO名前空間では、全XMLツール製品の様々な入出力オプションに対してインタフェースを指定します。

IOデータ型

データ型InputSourceTypeは、現在サポートされている様々な種類の入力ソースを指定します。これには、次が含まれます。

- ISRC_URI: 入力は指定されたURIから読み取られます。

- ISRC_FILE: 入力はファイルから読み取られます。

- ISRC_BUFFER: 入力はバッファから読み取られます。

- ISRC_DOM: 入力はDOMツリーです。

- ISRC_CSTREAM: 入力はCレベルのストリームです。

IOインタフェース

URISource: 指定されたURIからの入力に対するインタフェースです。

FileSource: ファイルからの入力に対するインタフェースです。

BufferSource: バッファからの入力に対するインタフェースです。

DOMSource: DOMツリーからの入力に対するインタフェースです。

CStreamSource: Cレベルのストリームからの入力に対するインタフェースです。

ツール製品のパッケージ

Toolsは、Oracle XMLツール製品の作成およびインスタンス化に関連するタイプおよびインタフェースのパッケージ(OracleXmlのサブ空間)です。

ツール製品のインタフェース

FactoryException: ツールのファクトリ例外を指定します。これは、XMLExceptionsから派生します。

Factory: XMLツール製品のファクトリです。全XMLツール製品の実装を非表示にし、これらのツール製品をそのID値に基づいて表すオブジェクトを作成するメソッドを提供します。

エラー・メッセージ・ファイル

エラー・メッセージ・ファイルは、mesgサブディレクトリにあります。メッセージ・ファイルも$ORACLE_HOME/xdk/mesgディレクトリにあります。環境変数ORA_XML_MESGを、mesgサブディレクトリの絶対パスを指すように設定できますが、これは必須ではありません。

関連項目:
『Oracle Database XML C++ APIリファレンス』のパッケージCtx API for C++に関する項

25 XML Parser for C++の使用

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

- Parser for C++の概要

- DOM名前空間

- DOMインタフェース

- パーサーの名前空間

- スレッド・セーフティ

- XML Parser for C++の使用方法

- XML Parser for C++のデフォルト動作

- C++のサンプル・ファイル

注意:
新規のXDKアプリケーションには、xml.hppに統合された新規のC++ APIを使用してください。oraxml.hpp内の旧C++ APIは非推奨で、下位互換性のためにのみサポートされています。

Parser for C++の概要

XML Parser for C++は、XML文書が整形式であるかどうか、およびDTDまたはXMLスキーマに対して妥当であるかどうか(オプション)を確認します。このパーサーは、次の2つのXMLのAPIのうち、いずれかでアクセス可能なオブジェクト・ツリーを構築します。

- DOM: ツリーベースAPI。ツリーベースAPIは、XML文書を内部ツリー構造にコンパイルします。これによって、アプリケーションは、XMLおよびHTML文書用のツリーベースの標準APIであるDocument Object Model (DOM)を使用してツリー内をナビゲートできます。

- SAX: イベントベースAPI。イベントベースAPIは、ユーザー定義のSAXイベント・ハンドラを使用して、要素の開始や終了などの解析イベントをアプリケーションに直接通知します。通常は、内部ツリーを構築しません。アプリケーションは、ハンドラを実装して様々なイベントを処理します。これは、GUIによるイベント処理に類似しています。

ツリーベースAPIは広範囲なアプリケーションで有効ですが、特にドキュメントのサイズが大きい場合、より多くのシステム・リソースが消費される場合があります(高度に制御された環境では、簡単な方法でツリーを構築し、この問題のいくつかを回避できる場合もあります)。さらに、いくつかのアプリケーションではそれぞれ独自のデータ・ツリーを構築する必要があります。この場合、新規のツリーにマップするためにのみ解析ノードのツリーを構築することは、非効率的です。

DOM名前空間

これは、DOMに関連するタイプおよびインタフェースの名前空間です。

DOMインタフェースは、DOM仕様の様々な実装に対する一般的な参照として表されます。DOMインタフェースは、様々な形式での特殊化およびインスタンス化をサポートする、Nodeによってパラメータ化されます。その中で最も重要なものは、現行のCの実装に対応しているxmlnodeです。

これらの一般的な参照には、NULLのような値はありません。これは、実装によって何の状態も持たない(NULLなどの)参照が作成されることはないためです。何の状態も持たないことを通知する必要がある場合は、例外を発生させる必要があります。

多くのメソッドでは、DOMツリーの構成が誤っている場合はSYNTAX_ERR例外をスローし、不正なパラメータまたは予期しないNULLポインタが使用されている場合はUNDEFINED_ERR例外をスローします。個別のメソッドがスローするエラーがそれのみである場合は、メソッド・シグネチャには反映されません。

実際のDOMツリーはコンテキストTCtxには依存しません。ただし、現行のDOMツリーを操作する、xmlctxベースの実装では、現行コンテキストのTCtxにアクセスする必要があります。コンテキスト・ポインタをDOMImplRefのコンストラクタに渡すことによって、この操作を実行できます。マルチスレッド環境では、DOMImplRefは常にスレッド・コンテキストで作成されるため、正しいコンテキストを指すポインタが備わります。

DOMImplRefにより、DOMツリーを作成する方法が提供されます。DomImplRefは実際のDOMImplementationオブジェクトに対する参照であり、DomImplRefの、コピーではない正規のコンストラクタが起動されると作成されます。これは、DOMツリーを共有する必要があるマルチスレッド環境で効率的に動作します。各スレッドには、スレッドに関連する個々のTCtxがあります。これは単一スレッド環境でも同様に動作します。DOMStringは、Oracle実装によってサポートされる唯一のエンコーディングです。その他のエンコーディングは、Oracleの拡張機能でサポートされます。oratext*データ型はすべてのエンコーディングで使用されます。インタフェースは、http://www.w3.org/TR/DOM-Level-2-Core/core.htmlの内容のとおりに、DOMレベル2 Coreインタフェースを表します。これらのC++インタフェースは、DOM仕様をほぼサポートしています。ただし、W3C仕様ではC++バインディングをサポートしていないため、この実装でDOM仕様が完全にサポートされることは保証していません。

DOMデータ型

DATATYPE DomNodeType: DOMノードのタイプを定義します。

DATATYPE DomExceptionCode: DOMのAPIによって戻される例外コードを定義します。

DOMインタフェース

DOMExceptionインタフェース: W3CのDOMのドキュメントの例外DOMExceptionを参照してください。(データが損失した、または実装が不安定であるなどの論理的な理由のいずれかにより)DOM操作を実行できない例外的な状況では、DOMを操作しても例外が発生するのみです。XMLExceptionの機能は、より広範な範囲の例外に使用できます。

NodeRefインタフェース: W3CのドキュメントのインタフェースNodeを参照してください。

DocumentRefインタフェース: W3CのドキュメントのインタフェースDocumentを参照してください。

DocumentFragmentRefインタフェース: W3CのドキュメントのインタフェースDocumentFragmentを参照してください。

ElementRefインタフェース: W3CのドキュメントのインタフェースElementを参照してください。

AttrRefインタフェース: W3CのドキュメントのインタフェースAttrを参照してください。

CharacterDataRefインタフェース: W3CのドキュメントのインタフェースCharacterDataを参照してください。

TextRefインタフェース: W3CのドキュメントのTextノードを参照してください。

CDATASectionRefインタフェース: W3CのドキュメントのCDATASectionノードを参照してください。

CommentRefインタフェース: W3CのドキュメントのCommentノードを参照してください。

ProcessingInstructionRefインタフェース: W3CのドキュメントのPIノードを参照してください。

EntityRefインタフェース: W3CのドキュメントのEntityノードを参照してください。

EntityReferenceRefインタフェース: W3CのドキュメントのEntityReferenceノードを参照してください。

NotationRefインタフェース: W3CのドキュメントのNotationノードを参照してください。

DocumentTypeRefインタフェース: W3CのドキュメントのDTDノードを参照してください。

DOMImplRefインタフェース: W3CのDOMのドキュメントのインタフェースDOMImplementationを参照してください。DOMImplementationは、DOMツリーを操作する際の基本となるインタフェースです。いずれのDOMツリーも、特定のDOM実装オブジェクトにアタッチされます。1つのDOM実装オブジェクトに複数のDOMツリーをアタッチできます。各DOMツリーを削除および割当て解除するには、ドキュメント・オブジェクトを削除します。特定のDOM実装オブジェクトが削除されると、そのオブジェクトにアタッチされているDOMツリーはすべて削除されます。DOMImplementationオブジェクトがユーザーに直接表示されることはありません。これは、クラスDOMImplRefを介して表示されます。これは、マルチスレッド環境の要件であるため必須です。

NodeListRefインタフェース: ノード・リストの抽象的な実装。W3CのドキュメントのインタフェースNodeListを参照してください。

NamedNodeMapRefインタフェース: ノード・マップの抽象的な実装。W3CのドキュメントのインタフェースNamedNodeMapを参照してください。

DOM TraversalおよびRangeデータ型

DATATYPE AcceptNodeCodeでは、ユーザーが提供するノード・フィルタで戻される値、およびイテレータとツリー・ウォーカーに渡される値を定義します。

DATATYPE WhatToShowCodeでは、特定のタイプのノードをフィルタするコードを指定します。

DATATYPE RangeExceptionCodeでは、Rangeインタフェースで発生する可能性がある例外の種類を指定します。

DATATYPE CompareHowCodeでは、2つの範囲で実行できる比較の種類を指定します。

DOM TraversalおよびRangeインタフェース

NodeFilterインタフェース: DOM 2 Node Filterです。

NodeIteratorインタフェース: DOM 2 Node Iteratorです。

TreeWalkerインタフェース: DOM 2 TreeWalkerです。

DocumentTraversalインタフェース: DOM 2インタフェースです。

RangeExceptionインタフェース: DOM 2 Range操作の例外です。

Rangeインタフェース: DOM 2 Rangeです。

DocumentRangeインタフェース: DOM 2インタフェースです。

パーサーの名前空間

DOMParserインタフェース: DOMパーサー・ルート・クラスです。

GParserインタフェース: XMLパーサーのルート・クラスです。

ParserExceptionインタフェース: パーサーおよびバリデータの例外クラスです。

SAXHandlerインタフェース: 現行のSAXハンドラ実装のルート・クラスです。

SAXHandlerRootインタフェース: 全SAXハンドラのルート・クラスです。

SAXParserインタフェース: 全SAXパーサーのルート・クラスです。

SchemaValidatorインタフェース: XML Schemaのバリデータです。

GParserインタフェース

GParserインタフェース: すべてのXMLパーサー・インタフェースおよび実装のルート・クラスです。これは抽象クラス(インタフェース)ではありません。これは実在するクラスです。ユーザーはこれを使用して、パーサー・パラメータを設定および確認できます。

DOMParserインタフェース

DOMParserインタフェース: DOMパーサー・ルート抽象クラスまたはインタフェースです。整形式である文書の解析および確認に加えて、DOMParserでは文書がDTDまたはXMLスキーマに対して妥当であるかどうかの検証もできます。

SAXParserインタフェース

SAXParserインタフェース: 全SAXパーサーのルート抽象クラスです。

SAXイベント・ハンドラ

SAXを使用するには、ユーザーがSAXイベント・ハンドラ・クラスを作成し、parse()のコール中にそれをSAXParserに渡すか、またはコール前に設定する必要があります。

SAXHandlerRootインタフェース: 全SAXハンドラのルート・クラスです。

SAXHandlerインタフェース: 現行のSAXハンドラ実装のルート・クラスです。

スレッド・セーフティ

コールの初期化/解析/終了シーケンスの途中でスレッドが分岐している場合、不適切な動作および結果が発生する場合があります。

XML Parser for C++の使用方法

1. Tools::Factoryをコールしてパーサーを作成すると、解析プロセスが初期化されます。

2. XML入力は、InputSourceタイプのいずれかになる可能性があります(IO名前空間を参照)。

3. DOMParserを起動すると、DOMツリーが生成されます。

4. SAXParserを起動すると、SAXイベントが生成されます。

5. parserデストラクタをコールすると、プロセスが終了します。

XML Parser for C++のデフォルト動作

XML Parser for C++のデフォルト動作は、次のとおりです。

- キャラクタ・セットのエンコーディングはUTF-8です。ドキュメントがすべてASCII形式である場合は、パフォーマンスを向上するために、エンコーディングをUS-ASCIIに設定することをお薦めします。

- メッセージは、msghdlrが指定されていないかぎり、stderrに出力されます。

- XML Parser for C++は、XML文書が整形式であるか、またはDTDに対して妥当であるかどうか(オプション)を確認します。XML Parser for Cは、DOMインタフェースを介してアクセス可能なオブジェクト・ツリーを構築するか、SAXインタフェースを介して順次操作します。

- saxcbがSAXコールバックAPIを使用するように設定すると、DOM APIがアクセスできる解析ツリーは構築されません。不要なSAXコールバック関数は、すべてNULLに設定できることに注意してください。

- パーサーは、デフォルト動作では、入力が整形式であることは確認しますが、妥当であるかどうかは確認しません。フラグXML_FLAG_VALIDATEを設定することで、入力の妥当性を検証できます。空白処理のデフォルト動作は、XML 1.0仕様に完全に準拠しています。すべての空白は、無視できる空白が明示された状態でアプリケーションに通知されます。ただし、アプリケーションによっては、XML_FLAG_DISCARD_WHITESPACEを設定し、要素の終了タグと次の要素の開始タグの間のすべての空白を削除する方が適切な場合もあります。

注意:
シングルバイト・キャラクタ・セット(US-ASCII、ISO 8859キャラクタ・セットのいずれかなど)のみを使用している場合、明示的にデフォルトのエンコーディングを設定することをお薦めします。UTF-8などのマルチバイト・キャラクタ・セットを使用した場合より、パフォーマンスが25%向上します。

- どちらの場合も、イベントベースAPIは、XML文書に対してより単純で低レベルのアクセスを提供します。したがって、使用可能なシステム・メモリーよりサイズの大きい文書を解析し、コールバック・イベント・ハンドラを使用して独自のデータ構造を構築できます。

C++のサンプル・ファイル

xdk/demo/cpp/parser/ディレクトリには、DOMインタフェースおよびSAXインタフェースによるXML Parser for C++の使用方法を示すXMLアプリケーションがあります。

サンプル・ディレクトリ(たとえば、Solarisの$ORACLE_HOME/xdk/demo/cpp)に移動し、READMEファイルを参照してください。このファイルには、サンプル・プログラムの作成方法が記載されています。

表25-1に、このディレクトリにあるサンプル・ファイルを示します。各ファイル*Main.cppには、対応する*Gen.cppおよび*Gen.hppがあります。

表25-1 XML Parser for C++ のサンプル・ファイル

サンプル・ファイル名

説明

DOMSampleMain.cpp

XMLパーサーおよびDOMのC++インタフェースの使用例です。

FullDOMSampleMain.cpp

手動でDOMを作成し、実行します。

SAXSampleMain.cpp

SAXSampleプログラムのソースです。

関連項目:
パーサー・パッケージAPI for C++については、『Oracle Database XML C++ APIリファレンス』を参照してください。

26 XSLT Processor for C++の使用

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

- XSLT for C++の入手方法

- XSL名前空間

- XSLT for C++のDOMインタフェースの使用方法

- XSLT for C++の起動

- ソフトウェアに含まれるサンプル・ファイルの使用

注意:
新規のXDKアプリケーションには、xml.hppに統合された新規のC++ APIを使用してください。oraxml.hppにある以前のC++ APIは非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。

XSLT for C++の入手方法

XSLT for C++はOracle Databaseに付属しています。サンプル・ファイルはxdk/demo/cpp/newにあります。

ソフトウェア・アーカイブのルート・ディレクトリにあるreadme.htmlファイルには、不具合の修正や追加のAPIなどのリリース固有の情報が含まれています。

関連項目:
「XVMプロセッサ」

XSL名前空間

これは、XSLTコンパイラおよびトランスフォーマの名前空間です。

XSLインタフェース

XslExceptionインタフェース: XSLTに関連するすべての例外のルート・インタフェースです。

Transformerインタフェース - 基本的なXSLTプロセッサです。このインタフェースを使用して全XSLTプロセッサを起動できます。

CompTransformerインタフェース - 拡張したXSLTプロセッサです。このインタフェースは、中間バイナリ・バイトコード(現行のXVMベースのプロセッサ専用)を作成するプロセッサとのみ併用できます。

Compilerインタフェース: XSLTコンパイラです。これは、XSLTをバイナリ・バイトコードにコンパイルするコンパイラに対して使用されます。

関連項目:
『Oracle Database XML C++ APIリファレンス』のパッケージXSL API for C++に関する項

XSLT for C++のDOMインタフェースの使用方法

1. XMLParser.xmlparse()には、次の2つの入力があります。

- XML文書

- XML文書に適用するスタイルシート

2. ツール・ファクトリをコールして特定のXSLTトランスフォーマまたはコンパイラを作成すると、XSLTプロセッサが起動します。

3. setXSL()メンバー関数をコールすると、スタイルシートが任意のトランスフォーマに指定されます。

4. XMLインスタンス・ドキュメントがメンバー関数を変換するパラメータとして指定されます。

5. 結果のドキュメント(XML、HTML、VMLなど)は、通常、アプリケーションに送られ、さらに処理されます。このドキュメントは、DOMツリーまたは一連のSAXイベントとして送られます。ユーザーがSAXイベント・ハンドラを指定すると、SAXイベントが生成されます。

6. デストラクタを起動すると、アプリケーションではXSLTプロセッサが終了します。

XSLT for C++の起動

XSLT for C++は、次の2つの方法で起動できます。

- コマンドラインで実行可能ファイルを起動する

- C++コードを記述し、提供されるAPIを使用する

コマンドラインの使用方法

XSLT for C++は、bin/xmlをコールすることによって、実行可能ファイルとしてコールできます。

関連項目:
表18-4「C XML Parserのコマンドライン・オプション」

提供されるAPIを使用するためのC++コードの記述

XSLT for C++は、提供されるAPIを使用するようにコードを記述することで起動することもできます。このコードは、publicサブディレクトリにあるヘッダーを使用してコンパイルし、libサブディレクトリにあるライブラリにリンクする必要があります。プログラムを作成する方法の詳細は、xdk/demo/cpp/newにある、MakeFileまたはmake.batを参照してください。

ソフトウェアに含まれるサンプル・ファイルの使用

$$ORACLE_HOME/xdk/demo/cpp/parser/ディレクトリには、XSLT for C++の使用方法を示すXMLアプリケーションがあります。

表26-1に、サンプル・ファイルを示します。

表26-1 XSLT for C++のサンプル・ファイル

サンプル・ファイル名

説明

XSLSampleMain.cpp
XSLSampleGen.cpp
XSLSampleGen.hpp

サンプルのXSLT使用プログラムのソース。XSLSampleは、2つの引数、XSLTスタイルシートおよびXMLファイルを取ります。このプログラムのstdoutをファイルにリダイレクトすると、環境によっては出力の一部が欠落する場合があります。

XVMSampleMain.cpp
XVMSampleGen.cpp
XVMSampleGen.hpp

サンプルのXVM使用プログラムのソース。

27 XML Schema Processor for C++の使用

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

- XML Schema Processor for C++の概要

- XML Schema ProcessorのAPI

- 指定したXML Schema for C++サンプル・プログラムの実行

注意:
新規のXDKアプリケーションには、xml.hppに統合された新規のC++ APIを使用してください。oraxml.hppにある以前のC++ APIは非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。

XML Schema Processor for C++の概要

XML Schema Processor for C++は、XML Parser for C++とともに動作するコンポーネントです。XML Schema Processor for C++を使用すると、XMLアプリケーションで単純なデータ型および複雑なデータ型をサポートできます。

XML Schema Processor for C++は、W3CのXML Schema勧告をサポートしています。このため、XML文書を処理するカスタム・アプリケーションを簡単に作成できます。また、Oracleが移植された各オペレーティング・システムには、標準に準拠したXML Schema ProcessorがXDKの一部として搭載されています。

XML Schema Processor for C++の機能

XML Schema Processor for C++には、次の機能があります。

- 単純型および複合型をサポートします。

- XML Parser for C++に統合されています。

- W3CのXML Schema勧告をサポートします。

XML Schema Processor for C++のクラスは、OracleXml::SchemaValidatorです。

関連項目:
『Oracle Database XML C++ APIリファレンス』のスキーマ・バリデータ・インタフェースに関する項

オンライン・ドキュメント

Oracle XML Schema Processor for C++のドキュメントは、インストール場所の/xdk/doc/cpp/schemaディレクトリにあります。

標準への準拠

XML Schema Processor for C++は、次の標準に準拠しています。

- W3CのXML 1.0勧告

- W3CのDOMレベル1.0勧告

- W3CのXML 1.0 Namaspace勧告

- W3CのXML Schema 1.0勧告

XML Schema ProcessorのAPI

インタフェースSchemaValidatorは、XML文書に対する、XMLスキーマ・ベースの検証を処理する抽象テンプレート・クラスです。

XML Schema Processor for C++の起動

XML Schema Processor for C++は、インストール場所のbin/schemaをコールすることによって、実行可能ファイルとしてコールされます。これは次の引数を取ります。

- XMLインスタンス・ドキュメント

- デフォルト・スキーマ(オプション)

- 作業ディレクトリ(オプション)

表27-1に、(オプションが無効、または-hがオプションである場合に表示できる)オプションを示します。

表27-1 XML Schema Processor for C++のコマンドライン・オプション

オプション

説明

-0

常にコード0で終了します(正常な場合)。

-e encoding

デフォルトの入力ファイルのエンコーディングを指定します。

-E encoding

出力/データ/表示のエンコーディングを指定します。

-h

ヘルプ。これらの選択肢を出力します。

-i

指定されたスキーマを無視します。

-o num

検証オプションです。

-p

正常な場合は、ドキュメント・インスタンスをstdoutに出力します。

-u

Unicodeパスを強制します。

-v

バージョン: バージョンを表示し、終了します。

XML Schema Processor for C++は、提供されるAPIを使用したコードを記述して起動することもできます。このコードは、includeサブディレクトリにあるヘッダーを使用してコンパイルし、libサブディレクトリにあるライブラリにリンクする必要があります。プログラムを作成する方法の詳細は、xdk/demo/cpp/schemaディレクトリにある、MakefileまたはMake.batを参照してください。

異なる言語のエラー・メッセージ・ファイルは、mesgサブディレクトリにあります。

指定したXML Schema for C++サンプル・プログラムの実行

xdk/demo/cpp/schemaディレクトリには、APIによるOracle XML Schema Processor for C++の使用方法を示すサンプル・アプリケーションがあります。表27-2に、提供されるサンプル・ファイルを示します。

表27-2提供されているXML Schema Processor for C++のサンプル

サンプル・ファイル

説明

Makefile

サンプル・プログラムを作成および実行し、適切な出力を確認するMakeファイル。

xsdtest.cpp

XML Schema for C++のAPIをコールする一般的なプログラム。

car.{xsd,xml,std}

xsdtestを実行した後のサンプル・スキーマ、インスタンス・ドキュメントおよび予想される出力

aq.{xsd,xml,std}

xsdtestを実行した後の2つ目のサンプル・スキーマ、インスタンス・ドキュメント、および予想される出力

pub.{xsd,xml,std}

xsdtestを実行した後の3つ目のサンプル・スキーマ、インスタンス・ドキュメント、および予想される出力

サンプル・プログラムを作成するには、makeコマンドを実行します。

プログラムを作成および実行し、実際の出力と予想される出力を比較するには、次を実行します。

make sure

28 XPath Processor for C++の使用

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

- XPathインタフェース

- サンプル・プログラム

注意:
新規のXDKアプリケーションには、xml.hppに統合された新規のC++ APIを使用してください。oraxml.hppにある以前のC++ APIは非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。

XPathインタフェース

Processorインタフェース - XPathプロセッサが準拠する基本的なXPathプロセッサ・インタフェースです。

CompProcessorインタフェース - 事前コンパイルしたXPath式を使用する機能を内部バイナリ表現に追加する、拡張XPathプロセッサです。このリリースでは、このインタフェースはOracle Virtual Machineインタフェースを表します。

Compilerインタフェース: バイナリ表現に対するXPathコンパイラです。

NodeSetRefインタフェース: ノード・セットがXPath式評価によって戻されるときの参照を定義します。

XPathExceptionインタフェース: XPathコンパイラおよびプロセッサの例外です。

XPathObjectインタフェース: XPath 1.0オブジェクトのインタフェースです。

サンプル・プログラム

サンプル・プログラムはxdk/demo/cpp/newにあります。

プログラムXslXPathSampleおよびXvmXPathSampleには、次のソースがあります。

XslXPathSampleGen.hpp、XslXPathSampleGen.cpp、XslXPathSampleMain.cpp、XslXPathSampleForce.cpp、

およびXvmXPathSampleGen.hpp、XvmXPathSampleGen.cpp、XvmXPathSampleMain.cpp、XvmXPathSampleForce.cpp。

関連項目:
『Oracle Database XML C++ APIリファレンス』のパッケージXPATH API for C++に関する項

29 XML Class Generator for C++の使用

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

- XML C++ Class Generatorの入手方法

- XML C++ Class Generatorの使用

- XML C++ Class Generatorコマンドライン・ユーティリティの使用

- XML C++ Class Generatorの使用例

XML C++ Class Generatorの入手方法

XML C++ Class Generatorは、Oracle Databaseに付属しています。

XML C++ Class Generatorの使用

XML C++ Class Generatorは、XML DTDまたはXML Schemaからソース・ファイルを作成します。XML C++ Class GeneratorはDocument Type Definition(DTD)またはXML Schemaを使用し、定義された各要素用のクラスを生成します。これらのクラスをC++プログラムで使用し、DTDに準拠するXML文書を作成します。

これは、アプリケーションがDTDまたはXML Schemaに従って、またはXML文書を構成するWebフォームのバックエンドとして、他のアプリケーションにXMLメッセージを送信する必要がある場合に有効です。C++アプリケーションは、これらのクラスを使用して、入力用DTDに準拠するXML文書を構成、検証および出力できます。

XML C++ Class Generatorは、Oracle XML Parser for C++と連携して機能します。XML Parser for C++は、入力用DTDを解析し、解析済文書をClass Generatorに渡します。

外部DTDの解析

XML C++ Class Generatorは、完全なドキュメント(ダミー・ドキュメント)をリクエストすることなく、直接外部DTDを解析することもできます。これには、Oracle XML Parser for C++ルーチンのxmlparseDTD()を使用します。

提供されているコマンドライン・プログラムxmlcgには、オプション「-d」があります。これは、外部DTDの解析に使用されます。

エラー・メッセージ・ファイル

エラー・メッセージ・ファイルは、mesg/サブディレクトリにあります。メッセージ・ファイルも$ORACLE_HOME/xdk/mesgディレクトリにあります。環境変数ORA_XML_MESGを、mesgサブディレクトリの絶対パスを指すように設定できますが、これは必須ではありません。

XML C++ Class Generatorコマンドライン・ユーティリティの使用

単独のClass Generatorは、bin/xmlcgをコールすることによって、実行可能ファイルとしてコールできます。

1. C++ Class Generatorは、コマンドラインに次のように入力して実行できます。

xmlcg [options] input_file

表29-1に、このユーティリティのオプションを示します。

表29-1 C++ Class Generatorのオプション

オプション

意味

-d name

入力は外部DTDまたはDTDファイルです。name.cppおよびname.hを生成します。

-o directory

生成されたファイル用の出力ディレクトリ: デフォルトは、現在のディレクトリです。

-e encoding

デフォルトの入力ファイルのエンコーディングです。

-h

使用方法のヘルプを表示します。

-v

XML C++ Class Generatorのバージョンのバリデータ・オプションを表示します。

-s name

指定された名前を持つXML Schemaファイルを入力します。name.cppおよびname.hを生成します。

input_file名は、<!DOCTYPE>を定義する解析済XML文書、解析済DTDまたはXML Schema文書の名前です。XML文書には、DTDが対応付けられている必要があります。

XML C++ Class GeneratorへのDTDの入力は、DTDを含むXML文書、または外部DTDです。文書本体自体は無視され、DTDのみが使用されますが、文書はDTDに準拠している必要があります。

2. オプションが無効な場合、または入力が指定されない場合は、前述した情報を含む使用メッセージが出力されます。

3. 2つのソース・ファイル、name.hヘッダー・ファイルおよびC++ファイル、name.cppが出力されます。これらのファイルには、DTDファイルと同じ名前が付けられます。

4. 出力ファイルは、通常、XML文書の生成に使用されます。

各クラス(要素)にコンストラクタが提供されているため、次の2つの方法でオブジェクトを作成できます。

- まず空のオブジェクトを作成し、後で子またはデータを追加します。

- 最初からすべての子または初期データを含むオブジェクトを作成します。

#PCDATA(および混合)要素用に提供されているメソッドを使用すると、データを設定したり、適切な場合は、要素の属性を設定することができます。

XML C++ Class Generatorへの入力

入力は、DTDを含むXML文書です。文書本体自体は無視され、DTDのみが使用されますが、ダミー・ドキュメントはDTDに準拠している必要があります。基礎となるXMLパーサーは、文書および関連する外部エンティティのファイル名を受け入れるのみです。

XML C++ Class Generatorの使用例

表29-2に、XML C++ Class Generatorのデモ・ファイルを示します。

表29-2 XML C++ Class Generatorファイル

ファイル名

説明

CG.cpp

サンプル・プログラム

CG.xml

DTDおよびダミー・ドキュメントを含むXMLファイル

CG.dtd

sample.xmlが参照するDTDファイル

Make.bat(Windows)

Makefile(UNIX)

クラスを生成し、サンプル・プログラムを構築する、バッチ・ファイル(Windowsの場合)またはMakeファイル(UNIXの場合)。

README

前述のファイルの説明を含むREADMEファイル

Make.batバッチ・ファイル(Windowsの場合)またはMakefile(UNIXの場合)では、次の操作が実行できます。

- sample.xmlに基づいて、クラスをSample.hおよびSample.cppに生成します。

- (Sample.hを使用して)プログラムsample.cppをコンパイルし、サンプル・オブジェクトとともに...\bin(または.../bin)ディレクトリにあるCG.exeという実行可能ファイルにリンクします。

XML C++ Class Generatorの例1: XML - Class Generatorの入力ファイルsample.xml

CG.xmlというXMLファイルは、XML C++ Class Generatorを入力します。これは、CG.dtdというDTDファイルを参照します。

<?xml version="1.0"?>
<!DOCTYPE Sample SYSTEM "CG.dtd">
<Sample>
<B>Be!</B>
<D attr="value"></D>
<E>
<F>Formula1</F>
<F>Formula2</F>
</E>
</Sample>

XML C++ Class Generatorの例2: DTD - Class Generatorの入力ファイルsample.dtd

DTDファイルsample.dtdは、XMLファイルsample.xmlによって参照されます。sample.xmlは、XML C++ Class Generatorを入力します。

<!ELEMENT Sample (A | (B, (C | (D, E))) | F)>
<!ELEMENT A (#PCDATA)>
<!ELEMENT B (#PCDATA | F)*>
<!ELEMENT C (#PCDATA)>
<!ELEMENT D (#PCDATA)>
<!ATTLIST D attr CDATA #REQUIRED>
<!ELEMENT E (F, F)>
<!ELEMENT F (#PCDATA)>

XML C++ Class Generatorの例3: sample.cppサンプル・プログラム

サンプル・プログラムsample.cppは、次のとおり実行します。

1. XMLパーサーを初期化します。

2. DTDを含むファイルのダミー・ドキュメント部分以外を解析することによって、DTDをロードします。

3. 生成されたクラスを使用して複数のオブジェクトを作成します。

4. 生成されたクラスがDTDに一致するかどうかを検証する、検証関数をコールします。

5. 作成されたドキュメントをSample.xmlに書き込みます。

//////////////////////////////////////////////////////////////////////////////
// NAME        CG.cpp
// DESCRIPTION Demonstration program for C++ class generator usage
//////////////////////////////////////////////////////////////////////////////

#ifndef ORAXMLDOM_ORACLE
# include <oraxmldom.h>
#endif

#include <fstream.h>

#include "Sample.h"

#define DTD_DOCUMENT "CG.xml"
#define OUT_DOCUMENT Sample.xml"

int main()
{
XMLParser parser;
Document *doc;
Sample   *samp;
B        *b;
D        *d;
E        *e;
F        *f1, *f2;
fstream  *out;
ub4       flags = XML_FLAG_VALIDATE;
uword     ecode;

// Initialize XML parser
cout << "Initializing XML parser...\n";
if (ecode = parser.xmlinit())
{
cout << "Failed to initialize parser, code " << ecode << "\n";
return 1;
}

// Parse the document containing a DTD; parsing just a DTD is not
// possible yet, so the file must contain a valid document (which
// is parsed but we're ignoring).
cout << "Loading DTD from " << DTD_DOCUMENT << "...\n";
if (ecode = parser.xmlparse((oratext *) DTD_DOCUMENT, (oratext *)0, flags))
{
cout << "Failed to parse DTD document " << DTD_DOCUMENT <<
", code " << ecode << "\n";
return 2;
}

// Fetch dummy document
cout << "Fetching dummy document...\n";
doc = parser.getDocument();

// Create the constituent parts of a Sample
cout << "Creating components...\n";
b = new B(doc, (String) "Be there or be square");
d = new D(doc, (String) "Dit dah");
d->setattr((String) "attribute value");
f1 = new F(doc, (String) "Formula1");
f2 = new F(doc, (String) "Formula2");
e = new E(doc, f1, f2);

// Create the Sample
cout << "Creating top-level element...\n";
samp = new Sample(doc, b, d, e);

// Validate the construct
cout << "Validating...\n";
if (ecode = parser.validate(samp))
{
cout << "Validation failed, code " << ecode << "\n";
return 3;
}

// Write out doc
cout << "Writing document to " << OUT_DOCUMENT << "\n";
if (!(out = new fstream(OUT_DOCUMENT, ios::out)))
{
cout << "Failed to open output stream\n";
return 4;
}
samp->print(out, 0);
out->close();

// Everything's OK
cout << "Success.\n";

// Shut down
parser.xmlterm();
return 0;
}

// end of CG.cpp

第IV部

Oracle XDKリファレンス

第IV部の各章は、XDKのリファレンスです。

- 第30章「XSQLページ・リファレンス」

- 第31章「XDK標準」

- 付録A「Oracle XDK for Java XMLエラー・メッセージ」

- 付録B「Oracle XDK for Java TXUエラー・メッセージ」

- 付録C「Oracle XDK for Java XSUエラー・メッセージ」

30 XSQLページ・リファレンス

この章では、XSQLページ・フレームワークに関する参照情報を示します。「XSQL構成ファイルのパラメータ」では、XSQL構成ファイルの設定について説明します。表30-1に、XSQLページの有効な組込みアクションを示します。

表30-1 組込みXSQLアクション・ハンドラ要素およびアクション・ハンドラ・クラス

XSQLアクション・ハンドラ要素

oracle.xml.xsql.actionsのハンドラ・クラス

用途

<xsql:action>

XSQLExtensionActionHandler

Javaに実装されたユーザー定義のアクション・ハンドラを起動し、カスタム・ロジックを実行して、カスタムXMLデータをXSQLページに挿入します。

<xsql:delete-request>

XSQLDeleteRequestHandler

リクエストで指定されたポスト済XML文書に基づいて、データベース内の既存の行を削除します。

<xsql:dml>

XSQLDMLHandler

SQL DML文またはPL/SQL無名ブロックを実行します。

<xsql:if-param>

XSQLIfParamHandler

XMLコンテンツまたは他のXSQLアクションを条件付きで挿入します。

<xsql:include-owa>

XSQLIncludeOWAHandler

データベース内でOracle Web Agent(OWA)パッケージを使用してXMLを生成するストアド・プロシージャの結果を挿入します。

<xsql:include-param>

XSQLGetParameterHandler

パラメータおよびその値を要素としてXSQLページに挿入します。

<xsql:include-posted-xml>

XSQLIncludePostedXMLHandler

リクエストでポストされたXML文書をXSQLページに挿入します。

<xsql:include-request-params>

XSQLIncludeRequestHandler

すべてのリクエスト・パラメータをXML要素としてXSQLページに挿入します。

<xsql:include-xml>

XSQLIncludeXMLHandler

相対URLまたは絶対URLを使用して、任意のXMLリソースをページの任意の場所に挿入します。

<xsql:include-xsql>

XSQLIncludeXSQLHandler

XSQLページの結果を別のXSQLページの任意の場所に挿入します。

<xsql:insert-param>

XSQLInsertParameterHandler

単一のパラメータの値に含まれるXML文書を挿入します。

<xsql:insert-request>

XSQLInsertRequestHandler

リクエストでポストされたXML文書またはHTMLフォームを表またはビューに挿入します。

<xsql:query>

XSQLQueryHandler

任意のSQL文を実行し、その結果を正規のXML形式に挿入します。

<xsql:ref-cursor-function>

XSQLRefCursorFunctionHandler

PL/SQLストアド・ファンクションが戻すカーソルの結果セットの正規のXML表示を挿入します。

<xsql:set-cookie>

XSQLSetCookieHandler

HTTP Cookieを設定します。

<xsql:set-page-param>

XSQLSetPageParamHandler

HTTPセッション・レベルのパラメータを設定します。ページの後続のSQL文内で参照できるページ・レベル(ローカル)のパラメータを設定します。

<xsql:set-session-param>

XSQLSetSessionParamHandler

HTTPセッション・レベルのパラメータを設定します。

<xsql:set-stylesheet-param>

XSQLStylesheetParameterHandler

最上位のXSLTスタイルシート・パラメータの値を設定します。

<xsql:update-request>

XSQLUpdateRequestHandler

リクエストで指定されたポスト済XML文書に基づいて、データベース内の既存の行を更新します。

XSQL構成ファイルのパラメータ

XSQL構成ファイルを使用して、XSQLページ環境をチューニングできます。表30-2に、有効なパラメータの定義を示します。

表30-2 XSQL構成ファイルの設定

構成設定名

説明

XSQLConfig/servlet/output-buffer-size

バッファ付き出力ストリーム・サイズ(バイト単位)を設定します。サーブレット・エンジンがすでにI/Oをサーブレット出力ストリームにバッファリング済である場合は、0(デフォルト)に設定してさらなるバッファリングを回避できます。有効値は負ではない整数です。

XSQLConfig/servlet/suppress-mime-charset/media-type

XSQLサーブレットは、HTTP ContentTypeヘッダーがリクエストに対して戻されているリソースのMIMEタイプを示すように設定します。デフォルトでは、サーブレットはMIMEタイプにオプションのキャラクタ・セット・データを挿入します。特定のMIMEタイプについて、必要なMIMEタイプをコンテンツとして指定した<media-type>要素を挿入すると、キャラクタ・セット・データの挿入を抑制できます。任意の数の<media-type>要素を指定できます。有効値はすべての文字列です。

XSQLConfig/processor/character-set-conversion/
default-charset

注意: 設定名は単一行です。スペースの制約により、2行に表示されています。

デフォルトでは、HTTPパラメータの値に基づいてキャラクタ・セット変換が行われ、ほぼすべてのサーブレット・エンジンが使用するデフォルトのキャラクタ・セットを補完します。変換に使用されるデフォルトのベース・キャラクタ・セットは、IANAのISO-8859-1セットに対応するJava8859_1です。サーブレット・エンジンが異なるキャラクタ・セットをベースとして使用する場合は、この構成設定でその値を指定できます。

キャラクタ・セット変換を抑制するには、<default-charset>要素のコンテンツとして、キャラクタ・セット名ではなく空の要素である<none/>を指定します。この方法は、サーブレットのデフォルト・キャラクタ・セットを使用して適切に表示できるパラメータ値を使用する場合に有効です。キャラクタ・セット変換の実行に関連するオーバーヘッドが削減されます。

有効値は、すべてのJavaキャラクタ・セット名または<none/>です。

XSQLConfig/processor/reload-connections-on-error

XSQL Page Processorを起動すると、接続定義が初期化されます。yesに設定した場合(デフォルト)、キャッシュされた接続のリストに含まれていない接続名のリクエストが試行されると、XSQL Page ProcessorはXSQLConfig.xmlファイルを再度読み取り、接続定義を再ロードします。yesを設定すると、サーブレットの実行中に新しい<connection>定義をファイルに追加する場合に有効です。インメモリーのキャッシュで接続名が見つからなかった場合の接続定義ファイルの再ロードを回避するには、noに設定します。有効値は、yesおよびnoです。

XSQLConfig/processor/default-fetch-size

SQL問合せを使用して情報を取得するための行のフェッチ・サイズのデフォルト値を設定します。この設定は、Oracle JDBC Driversを使用している場合にのみ有効です。それ以外の場合は無視されます。この方法により、異なる層で実行中のサーブレット・エンジンからデータベースへのネットワーク・ラウンドトリップが削減されます。

デフォルトは50です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/page-cache-size

XSQLページ・テンプレート用のキャッシュ・サイズを設定します。この設定は、キャッシュされるXSQLページの最大数を決定します。この最大数を超えると、最も使用頻度の少ないページがキャッシュから削除されます。デフォルトは25です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-cache-size

XSLTスタイルシート用のキャッシュ・サイズを設定します。この設定は、キャッシュされるXSQLページの最大数を決定します。この最大数を超えると、最も使用頻度の少ないページがキャッシュから削除されます。デフォルトは25です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-pool/initial

キャッシュされた各スタイルシートは、スループットを改善するためにキャッシュされたスタイルシート・インスタンスのプールです。この構成設定は、各スタイルシート・プールに対するスタイルシートの初期割当て数を設定します。

デフォルトは1です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-pool/increment

サーバー上でのロードが増加したためスタイルシート・プールを拡大する必要がある場合に割り当てるスタイルシートの数を設定します。

デフォルトは1です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/stylesheet-pool/timeout-seconds

プールが縮小して初期サイズに戻ろうとするときに、プール内のスタイルシート・インスタンスが削除され、リソースが解放される前の非活動時間(秒)を設定します。

デフォルトは60です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/initial

各接続プールに対するJDBC接続の初期割当て数を制御します。XSQL Page ProcessorのデフォルトのConnection Managerは、接続プーリングを実装して、スループットを改善します。

デフォルトは2です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/increment

サーバー上でのロードが増加したため接続プールを拡大する必要がある場合に割り当てる接続の数を設定します。

デフォルトは1です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/timeout-seconds

プールが縮小して初期サイズに戻ろうとするときに、プール内のJDBC接続が削除され、リソースが解放される前の非活動時間(秒)を設定します。

デフォルトは60です。有効値は0(ゼロ)以外の正の整数です。

XSQLConfig/processor/connection-pool/dump-allowed

dump-pool=yパラメータをページ・リクエストで渡すことによって接続プール・アクティビティの診断レポートをリクエストできるかどうかを決定します。

デフォルトはnoです。有効値は、yesまたはnoです。

XSQLConfig/processor/connection-manager/factory

XSQL Connection Managerファクトリ実装の完全修飾Javaクラス名を指定します。指定しない場合、デフォルトはXSQLConnectionManagerFactoryImplです。

有効値は、XSQLConnectionManagerFactoryインタフェースを実装するすべてのクラス名です。

XSQLConfig/processor/owa/fetch-style

<xsql:include-owa>アクションが使用するOWAページ・バッファのフェッチ・スタイルを設定します。有効値は、CLOB(デフォルト)またはTABLEです。

CLOBに設定すると、プロセッサは一時CLOBを使用してOWAページ・バッファを取得します。TABLEに設定すると、プロセッサは、XSQL_OWA_ARRAYというOracleデータベースのユーザー定義型を必要とする、より効率的な方法を使用します。この型は、次のDDL文を使用して作成します。

CREATE TYPE xsql_owa_array AS TABLE OF VARCHAR2(32767)

XSQLConfig/processor/timing/page

XSQL Page Processorがxsql-timing属性を、ページの処理に必要な経過時間(ミリ秒)を報告する値を持つページのドキュメント要素に追加するかどうかを決定します。

有効値は、yesまたはno(デフォルト)です。

XSQLConfig/processor/timing/action

XSQL Page Processorがページ内の、アクションの処理に必要な経過時間(秒)を報告するコンテンツを持つアクション・ハンドラ要素のすぐ前にコメントを追加するかどうかを決定します。

有効値は、yesまたはno(デフォルト)です。

XSQLConfig/processor/logger/factory

カスタムXSQLログ出力ファクトリ実装の完全修飾Javaクラス名を指定します。値を設定しない場合は、ログは出力されません。

有効値は、XSQLXSQLLoggerFactoryインタフェースを実装するすべてのクラス名です。

XSQLConfig/processor/error-handler/class

カスタムXSQLエラー・ハンドラの完全修飾Javaクラス名を指定します。指定したハンドラがデフォルトのエラー・ハンドラ実装になります。値を設定しない場合は、デフォルトのエラー・ハンドラが使用されます。

有効値は、XSQLErrorHandlerインタフェースを実装するすべてのクラス名です。

XSQLConfig/processor/xml-parsing/preserve-whitespace

XSQLページおよびXSLTスタイルシートの解析時に、XSQL Page Processorで空白を保持するかどうかを決定します。

有効な値は、true (デフォルト)またはfalseです。デフォルトをfalseに変更すると空白が無視されるため、XSQLページおよびXSQLスタイルシートの処理が若干速くなります。これは、空白を無視する方が解析が速く実行されるためです。

XSQLConfig/processor/security/stylesheet/defaults/
allow-client-style

注意: 設定名は単一行です。スペースの制約により、2行に表示されています。

クライアントによるスタイルシートのオーバーライドを禁止します。有効値は、yesおよびnoです。

開発中は、xml-stylesheetパラメータの値をリクエストで指定し、XSQLスタイルシートをオーバーライドする機能を使用すると便利な場合があります。デバッグ操作のために、xml-stylesheet=noneの組合せを使用してスタイルシートの適用を一時的に無効にできます。

allow-client-style="no"属性を各XSQLページのドキュメント要素に追加して、クライアントが本番アプリケーションでスタイルシートをオーバーライドしないようにできます。この設定を使用すると、allow-client-styleのデフォルト動作を1つの場所でグローバルに変更できます。

この設定で指定されるのはデフォルト動作のみです。特定のXSQLページのドキュメント要素に対してこの属性値を明示的に指定すると、その値がこのグローバル・デフォルト値より優先されます。

XSQLConfig/processor/security/stylesheet/
trusted-hosts/host

注意: 設定名は単一行です。スペースの制約により、2行に表示されています。

XSLTスタイルシートへの絶対URLが構成ファイルに示されているトラステッド・ホストからのものである必要があることを規定します。<trusted-hosts>要素内で任意の数の<host>要素を指定します。デフォルトでは、ローカル・マシン名、localhostおよび127.0.0.1がトラステッド・ホストです。有効値は、すべてのホスト名またはIPアドレスです。

XSLTプロセッサは、Java拡張関数をサポートします。通常、XSQLページは相対URLを使用してXSLTスタイルシートを参照します。

XSQLConfig/http/proxyhost

HTTPプロトコルを使用するURLを処理する場合に使用するHTTPプロキシ・サーバーの名前を設定します。

有効値は、すべてのホスト名またはIPアドレスです。

XSQLConfig/http/proxyport

HTTPプロトコルを使用するURLを処理する場合に使用するHTTPプロキシ・サーバーのポート番号を設定します。

有効値は0(ゼロ)以外の整数です。

XSQLConfig/connectiondefs/connection

XSQL Page Processorが使用する名前付き接続の短縮名およびJDBCの詳細を定義します。

<connectiondefs>には、任意の数の<connection>子要素を指定できます。各接続定義にはname属性を指定する必要があります。また、子要素<username>、<password>、<driver>、<dburl>および<autocommit>を指定できます。

XSQLConfig/connectiondefs/connection/username

現行の接続のユーザー名を定義します。

XSQLConfig/connectiondefs/connection/password

現行の接続のパスワードを定義します。

XSQLConfig/connectiondefs/connection/dburl

現行の接続のJDBC接続URLを定義します。

XSQLConfig/connectiondefs/connection/driver

現行の接続に使用するJDBCドライバの完全修飾Javaクラス名を指定します。値を指定しない場合は、デフォルトでoracle.jdbc.driver.OracleDriverに設定されます。

XSQLConfig/connectiondefs/connection/autocommit

現行の接続の自動コミット・フラグを明示的に設定します。値を指定しない場合、接続はJDBCドライバの自動コミットのデフォルト設定を使用します。

XSQLConfig/serializerdefs/serializer

名前付きカスタム・シリアライザの実装を定義します。<serializerdefs>には、任意の数の<serializer>子要素を指定できます。各シリアライザには、<name>子要素と<class>子要素の両方を指定する必要があります。

XSQLConfig/serializerdefs/serializer/name

現行のカスタム・シリアライザ定義の名前を定義します。

XSQLConfig/connectiondefs/connection/class

現行のカスタム・シリアライザの完全修飾Javaクラス名を指定します。このクラスは、XSQLDocumentSerializerインタフェースを実装する必要があります。

<xsql:action>

用途

Javaに実装されたユーザー定義のアクション・ハンドラを起動し、カスタム・ロジックを実行して、カスタムXMLデータをXSQLページに挿入します。このアクションで起動するJavaクラスには、oracle.xml.xsql.XSQLActionHandlerインタフェースを実装する必要があります。

<xsql:action>を使用して、組込みアクション・ハンドラが処理しないタスクを実行する必要があります。カスタム・アクションは、任意のXMLコンテンツをデータ・ページに提供し、任意の処理を実行することができます。

使用上の注意

XSQL Page Processorは、ページ内のアクションを次の方法で処理します。

1. デフォルトのコンストラクタを使用して、アクション・ハンドラ・クラスのインスタンスを作成します。

2. メソッドinit(Element actionElt,XSQLPageRequest context)をコールして、アクション・ハンドラ要素オブジェクトおよびXSQL Page Processorコンテキストを含むハンドラ・インスタンスを初期化します。

3. メソッドhandleAction (Node result)を起動して、ハンドラがアクションを処理できるようにします。

構文

このアクションの構文は、次のとおりです。handlerは、単一の必須属性です。この属性の値は、起動するアクションの完全修飾Javaクラス名です。yourpackageは、Javaパッケージです。YourCustomHandlerは、Javaクラスです。

<xsql:action handler="yourpackage.YourCustomHandler"/>

一部のアクション・ハンドラでは、テキスト・コンテンツまたは要素コンテンツを<xsql:action>要素内で使用する必要がある場合があります。その場合は、次のような構文を使用します。

<xsql:action handler="yourpackage.YourCustomHandler">
Some_text
</xsql:action>

次の構文も使用できます。

<xsql:action handler="yourpackage.YourCustomHandler">
<some>
<other/>
<elements/>
<here/>
</some>
</xsql:action>

属性

必須属性はhandlerのみですが、その他にもハンドラに指定可能な属性があります。たとえば、yourpackage.YourCustomHandlerにparam1およびparam2という名前の属性が必要である場合、次の構文を使用します。

<xsql:action handler="yourpackage.YourCustomHandler" param1="xxx" param2="yyy">

例

例30-1に、myactions.StockQuotes Javaクラスを起動するXSQLページを示します。これには、symbolパラメータで渡された記号に対してGoogleから取得した株価情報が挿入されます。このパラメータを指定しない場合、デフォルト・リストが指定されます。

例30-1 株価情報の取得

<?xml version="1.0"?>
<page xmlns:xsql="urn:oracle-xsql">
<xsql:action handler="myactions.StockQuotes"
symbols="{@symbol}"
symbol="ORCL,SAP,MSFT,IBM"/>
</page>

<xsql:delete-request>

用途

XML文書またはHTMLフォームからポストされたデータを受け入れ、XML SQL Utility(XSU)を使用して、ターゲット表またはビューから正規の形式のXML文書のコンテンツを削除します。

XSUとXSLTを組み合せると、XML文書を特定の表に対して適切な正規の形式に変換できます。変換後、結果として戻る正規のXMLをXSUで削除できます。特定のデータベース表では、正規のXML形式は、その表に対するSELECT *問合せからのXML出力の1行によって指定されます。

構文

このアクションの構文は、次のとおりです。table_nameは表名、keyは一意キーとして使用する1つまたは複数の列のリストです。

<xsql:delete-request table="table_name" key-columns="key"/>

属性

表30-3に、<xsql:delete-request>アクションに対して使用できるオプションの属性を示します。太字の属性は必須です。

表30-3 <xsql:delete-request>の属性

の属性 " width="100%">

属性名

説明

table = "string"

XMLデータの削除に使用する表、ビューまたはシノニムの名前。

key-columns = "string string ..."

空白またはカンマで区切られた1つ以上の列名のリスト。プロセッサは、ポストされたXML文書に指定されたこれらの名前の値によって、削除する既存の行を識別します。

transform = "URL"

削除されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

columns = "string"

削除されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

commit = "boolean"

yes(デフォルト)に設定すると、削除が正常に実行された後に、現行の接続に対するCOMMITがコールされます。有効値は、yesおよびnoです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるintegerを指定すると、integerのバッチ単位のレコードが削除されるたびにCOMMITが発行されます。数値を指定しない場合は、デフォルトのバッチ・サイズは0(ゼロ)で、プロセッサによって途中でコミットされることはありません。

date-format = "string"

削除中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列Errorに設定する必要があります。任意のパラメータ名を有効な値として指定できます。

例

例30-2に、ポストされたXML文書をstyle.xslスタイルシートで変換し、departments表から削除する例を示します。departments.department_id列が削除の主キーです。

例30-2 行の削除

<?xml version="1.0"?>
<xsql:delete-request table="departments"       transform="style.xsl"
connection="demo" key-columns="department_id" xmlns:xsql="urn:oracle-xsql"/>

<xsql:dml>

用途

DML文またはDDL文、あるいはPL/SQLブロックを実行します。通常は、このタグを使用して、実行またはロールバックする文をまとめて挿入します。

このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

使用上の注意

<xsql:dml>を使用してOUT変数の位置にパラメータ値をバインドしても、パラメータ値を設定できません。バインディングは、INパラメータに対してのみサポートされます。

構文

このアクションの構文は、次のとおりです。DML_DDL_or_PLSQLは有効なDML文、DDL文、またはPL/SQLブロックのプレースホルダです。

<xsql:dml>
DML_DDL_or_PLSQL
</xsql:dml>

属性

表30-4に、<xsql:dml>アクションに対して使用できるオプションの属性を示します。

表30-4 <xsql:dml>の属性

の属性 " width="100%">

属性名

説明

commit = "boolean"

yesに設定すると、DML文が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yesおよびno(デフォルト)です。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。これらのパラメータの値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

error-statement = "boolean"

noに設定すると、生成されたすべての<xsql-error>要素への違反SQL文の挿入が抑制されます。有効値は、yes(デフォルト)およびnoです。

例

例30-3は、webuser cookieに保存されているユーザー名をrequest_log表に挿入します。バインド変数でSQL挿入攻撃から保護します。

例30-3 表へのユーザー名の挿入

<xsql:dml connection="demo" bind-params="webuser"
xmlns:xsql="urn:oracle-xsql">
BEGIN
INSERT INTO request_log(page,userid)
VALUES( 'somepage.xsql', ? );
COMMIT;
END;
</xsql:dml>

<xsql:if-param>

用途

ある条件が真である場合に、ネストされている要素またはアクションを挿入できます。条件が真である場合は、すべてのネストされたXMLコンテンツおよびアクションがページに挿入されます。条件が偽である場合は、ネストされたXMLコンテンツまたはアクションはいずれも挿入されません(したがって、ネストされたアクションは実行されません)。

評価するパラメータ値を指定するには、必要なname属性を指定します。単純なパラメータの名前と配列パラメータの名前の両方を指定できます。

注意:
テスト対象のパラメータが存在しない場合は、偽と評価されます。

構文

このアクションの構文は、次のとおりです。some_nameは、name属性の値です。またtest_conditionは、表30-5に示す条件のうちのいずれかです。

<xsql:if-param name="some_name" test_condition>
element_or_action
</xsql:if-param>

任意のXMLコンテンツまたはXSQLアクション・ハンドラ要素(別の<xsql:if-param>要素など)を<xsql:if-param>内でネストできます。

属性

1つ以上のパラメータ値(配列の場合は複数)のテスト方法を指定するために、name属性の他に表30-5の属性のいずれかを使用する必要があります。その他のXSQLアクションでは、<xsql:if-param>アクションの属性に、字句置換パラメータ式(たとえば、{@paramName})を含めることができます。

表30-5 <xsql:if-param>の属性

の属性 " width="100%">

属性名

説明

exists="yes_or_no"

exists="yes"に設定した場合、この条件では、名前付きパラメータが存在するかどうか、そして値が空でないかどうかがテストされます。配列パラメータについては、配列パラメータが存在し、空ではない要素が1つ以上含まれているかどうかがテストされます。

exists="no"に設定した場合、この条件は、パラメータが存在しないとき、または存在するが値が空であるときに真と評価されます。配列値パラメータについては、パラメータが存在しないとき、または配列要素がすべて空であるときに真と評価されます。

equals="stringValue"

この条件では、名前付きパラメータと指定された文字列値が等しいかどうかがテストされます。デフォルトでは、文字列が完全一致するかどうかが比較されます。一致の比較で大/小文字を区別しない場合は、ignore-case="yes"属性も指定してください。

配列値パラメータについては、配列内の任意の要素に指定された値が含まれているかどうかがテストされます。

not-equals="stringValue"

この条件では、名前付きパラメータと指定された文字列値が等しくないかどうかがテストされます。デフォルトでは、文字列が完全一致するかどうかが比較されます。配列値パラメータについては、配列内の要素のいずれにも指定された値が含まれていないときに真と評価されます。

in-list = "comma-or-space-separated-list"

この条件では、名前付きパラメータが指定されたリスト内の文字列のいずれかに一致するかどうかがテストされます。デフォルトでは、文字列が完全一致するかどうかが比較されます。一致の比較で大/小文字を区別しない場合は、ignore-case="yes"属性も指定してください。

文字列内にカンマが検出された場合、そのカンマはデリミタとして使用され、in-listパラメータの値が配列にトークン化されます。カンマが検出されなかった場合は、デリミタには空白が使用されます。配列値パラメータについては、配列内の任意の要素がリスト内の要素に一致するかどうかがテストされます。

not-in-list = "comma-or-space-separated-list"

名前付きパラメータが指定されたリスト内の文字列のいずれかに一致しないかどうかがテストされます。デフォルトでは、文字列が完全一致するかどうかが比較されます。一致の比較で大/小文字を区別しない場合は、ignore-case="yes"属性も指定してください。

文字列内にカンマが検出された場合、そのカンマはデリミタとして使用され、not-in-listパラメータの値が配列にトークン化されます。カンマが検出されなかった場合は、デリミタには空白が使用されます。配列値パラメータについては、配列内の要素がいずれもリスト内の任意の要素に一致しないかどうかがテストされます。

例

2つの異なる条件がそれぞれ真であるかどうかをテストするには、例30-4のように<xsql:if-param>要素をネストして使用します。

例30-4 条件のテスト

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<!--
| Set page parameter 'some_param' to value "some_value" if parameter 'a'
| exists, and if parameter 'b' has a value equal to "X"
+-->
<xsql:if-param name="a" exists="yes">
<xsql:if-param name="b" equals="X">
<xsql:set-page-param name="some_param" value="some_value"/>
</xsql:if-param>
</xsql:if-param>
<!-- ... -->
</page>

<xsql:include-owa>

用途

データベース・ストアド・プロシージャによって生成されたXMLコンテンツを挿入します。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

ストアド・プロシージャは、標準のOracle Web Agent (OWA)パッケージ(HTPおよびHTF)を使用して、XMLタグをサーバー側ページ・バッファに出力します。その後、XSQL Page Processorが、動的に生成されたXMLコンテンツをフェッチおよび解析し、データ・ページに挿入します。ストアド・プロシージャは、整形式のXMLページを生成する必要があります。生成しなかった場合は、該当するエラーが表示されます。

使用上の注意

HTPパッケージを使用してXML要素を作成するラッパー・プロシージャを作成できます。XSQLページでは、<xsql:include-owa>を使用してそのラッパー・プロシージャを起動できます。

構文

このアクションの構文は、次のとおりです。PL/SQL_blockは、HTPまたはHTFパッケージを使用するプロシージャを起動するPL/SQLブロックです。

<xsql:include-owa>
PL/SQL_block
</xsql:include-owa>

属性

表30-6に、このアクションがサポートするオプションの属性を示します。

表30-6 <xsql:include-owa>の属性

の属性 " width="100%">

属性名

説明

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。これらのパラメータの値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

error-statement = "boolean"

noに設定すると、生成されたすべての<xsql-error>要素への違反SQL文の挿入が抑制されます。有効値は、yes(デフォルト)およびnoです。

例

プロジェクトのステータスを更新する、UpdateStatusという名前のPL/SQLプロシージャを作成するとします。このプロシージャでは、HTPを使用して<UpdateStatus>データグラムを出力します。このデータグラムは、エラーが発生しなかった場合は要素<Success/>を含み、1つ以上のエラーが発生した場合は要素<Success/>を含みます。

例30-5に、XSQLページからUpdateStatusをコールする方法を示します。この例では、字句置換ではなく、SQLバインド変数を使用して、SQL挿入攻撃を防ぎます。

例30-5 ストアド・プロシージャで作成したXMLコンテンツの挿入

<xsql:include-owa connection="demo"
bind-params="project status"
xmlns:xsql="urn:oracle-xsql">
UpdateStatus( ?,? );
</xsql:include-owa>

ユーザーが無効なプロジェクト・ステータス番号をWebベースのフォームに入力するとします。例30-5に示すように、このフォームからXSQLページに入力パラメータをポストします。XSQLプロセッサによって次のデータグラムが戻されます。このデータグラムは、XSLTスタイルシートでHTMLエラー・ページに変換できます。

<UpdateStatus>
<Error Field="status">Status must be 1, 2, 3, or 4</Error>
</UpdateStatus>

<xsql:include-param>

用途

1つのパラメータの名前と値のXML表示を挿入します。この方法は、関連付けられたXSLTスタイルシートがXPath式を使用してパラメータ値を参照する必要がある場合に有効です。

構文

このアクションの構文は、次のとおりです。paramnameはパラメータの名前です。

<xsql:include-param name="paramname" />

このname属性は必須で、値を挿入する必要があるパラメータの名前を指定します。

属性

name属性は必須で、オプションの属性はありません。

例

例30-6は、XPATHを使用してパラメータの値を取得し、XMLで表示します。

例30-6 パラメータ値のXML表示の挿入

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql"
xmlns:p="http://www.companysite.com/products">
<xsql:set-page-param name="productid"
xpath="/p:Products/productid"/>
<xsql:include-param name="productid"/>
</page>

データグラムに挿入するXML文書のフラグメントは次のようになります。

<productid>12345</productid>

次の例のように配列パラメータ名を使用して、値を配列として処理するように設定するとします。

<xsql:include-param name="productid[]"/>

すべての配列値は次の例のようなXML文書のフラグメントによって反映されます。

<productid>
<value>12345<value>
<value>33455</value>
<value>88199</value>
</productid>

この配列パラメータ名の使用例のproductidが単一の値のパラメータである場合、フラグメントは次の例のように単一の要素の配列と同様になります。

<productid>
<value>12345<value>
</productid>

<xsql:include-posted-xml>

用途

ポストされたXML文書をXSQLページに挿入します。XML文書ではなくHTML形式をポストした場合、挿入されるXMLは、<xsql:include-request-params>アクションによって挿入されるものと類似したものになります。

構文

このアクションの構文は、次のとおりです。

<xsql:include-posted-xml/>

属性

なし。

例

例30-7は、ポストされたXML文書を挿入するサンプルXSQLページを示します。

例30-7 ポストされたXMLの挿入

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsql" href="somepage.xsql"?>
<page connection="demo"
xmlns:xsql="urn:oracle-xsql">
<xsql:include-posted-xml/>
</page>

<xsql:include-request-params>

用途

リクエスト内のすべてのパラメータのXML表示をデータグラムに挿入します。ページのリクエスト時、ページ内のアクション・ハンドラ要素は、リクエストに使用可能なパラメータを示すXML要素のツリーに置き換えられます。

この方法は、関連付けられたXSLTスタイルシートがXPath式を使用してリクエスト・パラメータ値を参照する必要がある場合に有効です。

使用上の注意

XSQLサーブレットを使用してページを処理する場合、挿入されるXMLの形式は例30-8のようになります。

例30-8 リクエスト・パラメータの挿入

<request>
<parameters>
<paramname>value1</paramname>
<ParamName2>value2</ParamName2>
...
</parameters>
<session>
<sessVarName>value1</sessVarName>
...
</session>
<cookies>
<cookieName>value1</cookieName>
...
</cookies>
</request>

XSQLコマンドライン・ユーティリティまたはXSQLRequestクラスを使用する場合、XMLの形式は例30-11のようになります。

例30-9 リクエスト・パラメータの挿入

<request>
<parameters>
<paramname>value1</paramname>
<ParamName2>value2</ParamName2>
...
</parameters>
</request>

この方法では、値が<parameters>、<session>または<cookies>の子要素であるため、リクエスト・パラメータとセッション・パラメータまたはCookieを識別できます。

構文

このアクションの構文は、次のとおりです。

<xsql:include-request-params/>

属性

なし。

例

例30-10に、すべてのリクエスト・パラメータをデータ・ページに挿入するサンプルXSQLページを示します。

例30-10 リクエスト・パラメータの挿入

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsql" href="cookie_condition.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:include-request-params/>
</page>

cookie_condition.xslスタイルシートは、siteuser Cookieが存在するかどうかに基づいて出力形式を選択します。例30-11に、スタイルシートの一部分を示します。

例30-11 スタイルシートの条件のテスト

<xsl:choose>
<xsl:when test="/page/request/cookies/siteuser">
...
</xsl:when>
<xsl:otherwise>
...
</xsl:otherwise>
</xsl:choose>

<xsql:include-xml>

用途

ローカル・リソース、リモート・リソースまたはデータベース・ドリブンのXMLリソースのXMLコンテンツをデータグラムに挿入します。リソースは、URLまたはSQL文で指定できます。サーバーは、静的XMLファイルまたはサーブレットやCGIプログラムなどのプログラム・リソースから動的に作成されたXMLの形式でリソースを提供できます。

構文

このアクションの構文は、次のとおりです。URLは、他のWebサイトからXMLを取得するための相対URLまたはHTTPベースの絶対URLです。

<xsql:include-xml href="URL"/>

または、次の構文を使用できます。SQL_statementは、1つのCLOB列またはVARCHAR2列の値を含む1つの行を選択するSQL SELECT文です。

<xsql:include-xml>
SQL_statement
</xsql:include-xml>

href属性とSQL文は、相互に排他的です。どちらか一方が指定されている場合は、他方を指定できません。

属性

表30-7に、このアクションがサポートする属性を示します。太字の属性は必須です。

表30-7 <xsql:include-xml>の属性

の属性 " width="100%">

属性名

説明

href="URL"

挿入するXMLリソースの絶対URL、相対URLまたはパラメータ化されたURL。リソースには静的ファイルの動的ソースを指定できます。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。これらの名前の値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

例

例30-12は、データベース問合せにより取得したXML文書を挿入します。このXMLコンテンツは、ユーザー定義型のCLOB値メンバー・フィールドです。挿入するXMLは、XMLTypeではなく、VARCHAR2またはCLOBの列から取得する必要があります。

例30-12 XML文書のインクルード

<?xml version="1.0"?>
<xsql:include-xml bind-params="id" connection="demo"
xmlns:xsql="urn:oracle-xsql">
SELECT x.document.contents doc FROM xmldoc x
WHERE x.docid = ?
</xsql:include-xml>

<xsql:include-xsql>

用途

XSQLページのXML出力を別のページに挿入します。オプションで他のXSQLページから変換されたコンテンツを作成するページを作成できます。

使用上の注意

集計されているページに<?xml-stylesheet?>処理命令が含まれている場合は、結果が集計される前にこのスタイルシートが適用されます。そのため、<xsql:include-xsql>を使用して、XSLTスタイルシートを連鎖させることができます。

1つのXSQLページが<xsql:include-xsql>を使用して他のページを集計する場合、ネストしたページはリクエスト・レベルのすべてのパラメータを参照できます。XSQLサーブレットが処理するページでは、セッション・レベルのパラメータおよびCookieを参照できます。集計側のページのプライベート・パラメータは、ネストしたページからは参照できません。

構文

このアクションの構文は、次のとおりです。XSQL_pageは、挿入するXSQLページの相対URLまたは絶対URLです。

<xsql:include-xsql href="XSQL_page"/>

属性

表30-8に、このアクションがサポートする属性を示します。太字の属性は必須です。それ以外の属性はオプションです。

表30-8 <xsql:include-xsql>の属性

の属性 " width="100%">

属性名

説明

href="string"

挿入するXSQLページの相対URLまたは絶対URL。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列Errorに設定する必要があります。任意のパラメータ名を有効な値として指定できます。

reparse = "boolean"

挿入されたXSQLページの出力を挿入前に再解析するかどうかを指定します。有効値は、no(デフォルト)またはyesです。

この属性は、挿入側のページが要素として処理する必要があるXML文書のフラグメントのテキストを、挿入されたXSQLページが選択している場合に有効です。

例

例30-13は、ディスカッション・フォーラムのカテゴリを示すXSQLページを表示します。

例30-13 Categories.xsql

<?xml version="1.0"?>
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT name
FROM categories
ORDER BY name
</xsql:query>

例30-14に、例30-13のページの結果を、現行のフォーラムで最新のトピック10個を示すページに挿入する方法を示します。

例30-14 TopTenTopics.xsql

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<top-ten-topics connection="demo" xmlns:xsql="urn:oracle-xsql">
<topics>
<xsql:query max-rows="10">
SELECT subject
FROM topics
ORDER BY last_modified DESC
</xsql:query>
</topics>
<categories>
<xsql:include-xsql href="Categories.xsql"/>
</categories>
</top-ten-topics>

また、<xsql:include-xsql>を使用して、挿入されたページに対してXSLTスタイルシートを適用することもできます。次のXSLTスタイルシートを作成するとします。

- cats-as-html.xsl(HTMLでのトピックのレンダリング用)

- cats-as-wml.xsl(WMLでのトピックのレンダリング用)

この場合、2つの異なるタイプのデバイスに対応するための1つの方法は、各デバイス用に異なるXSQLページを作成することです。例30-15は、Categories.xsqlを集計し、cats-as-html.xslスタイルシートを適用するXSQLページを示します。

例30-15 HTMLCategories.xsql

<?xml version="1.0"?>
<!-- HTMLCategories.xsql -->
<?xml-stylesheet type="text/xsl" href="cats-as-html.xsl"?>
<xsql:include-xsql href="Categories.xsql" xmlns:xsql="urn:oracle-xsql"/>

例30-16は、Categories.xsqlを集計し、cats-as-html.xslスタイルシートを適用してワイヤレス・デバイスに配信するXSQLページを示します。

例30-16 WMLCategories.xsql

<?xml version="1.0"?>
<!-- WMLCategories.xsql -->
<?xml-stylesheet type="text/xsl" href="cats-as-wml.xsl"?>
<xsql:include-xsql href="Categories.xsql" xmlns:xsql="urn:oracle-xsql"/>

<xsql:insert-param>

用途

パラメータの値を表またはビューに挿入します。このタグは、クライアントが整形式のXML文書をHTTPパラメータまたは個別のHTMLフォーム・フィールドのテキストとしてポストする場合に使用します。

XML SQL Utility(XSU)とXSLTを組み合せると、XMLを特定の表に対して適切な正規の形式に変換できます。変換後、結果として戻る正規のXMLをXSUで挿入できます。特定のデータベース表では、正規のXML形式は、その表に対するSELECT *問合せからのXML出力の1行によって指定されます。

構文

このアクションの構文は、次のとおりです。table_or_view_nameは、挿入するXSQLページの相対URLまたは絶対URLです。

<xsql:insert-param table="table_or_view_name" name="string"/>

属性

表30-9に、<xsql:insert-param>アクションに対して使用できるオプションの属性を示します。

表30-9 <xsql:insert-param>の属性

の属性 " width="100%">

属性名

説明

name="string"

挿入されるXMLを値に含むパラメータの名前。

table="string"

XMLデータの挿入に使用する表、ビューまたはシノニムの名前。

transform = "URL"

挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

columns = "string"

値を挿入する1つ以上の列名のリスト。指定する列名は空白またはカンマで区切ります。列名を指定すると、指定された列のみが挿入されます。列名を指定しない場合は、すべての列が挿入され、値がXML文書に表示されない列にはNULL値が指定されます。

commit = "boolean"

yesに設定すると、挿入が正常に実行された後に、現行の接続に対するコミットがコールされます。有効値は、yes(デフォルト)およびnoです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるintegerを指定すると、integerのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。デフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。

date-format = "string"

挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、Errorに設定する必要があります。任意のパラメータ名を有効な値として指定できます。

例

例30-17は、データベースに挿入するHTMLフォーム・パラメータxmlfieldの内容を解析および変換します。

例30-17 HTMLフォーム・パラメータに含まれるXMLの挿入

<?xml version="1.0"?>
<xsql:insert-param name="xmlfield" table="image_metadata_table"
transform="field-to-rowset.xsl" connection="demo" xmlns:xsql="urn:oracle-xsql"/>

<xsql:insert-request>

用途

XML文書またはHTMLフォームからポストされたデータを受け入れ、XML SQL Utility(XSU)を使用して、ターゲット表またはビューに正規の形式のXML文書のコンテンツを挿入します。

HTMLフォームをポストすると、ポストされたXML文書はHTTPリクエスト・パラメータ、Cookieおよびセッション変数からマテリアライズされます。XML文書は次の形式になります。

<request>
<parameters>
<param1>value1</param1>
:
</paramN>valueN</paramN>
</parameters>
:
</request>

XSUとXSLTを組み合せると、XML文書を特定の表に対して適切な正規の形式に変換できます。XSQLエンジンを使用して、結果として戻る正規のXMLがXSUで挿入されます。特定のデータベース表では、正規のXML形式は、その表に対するSELECT *問合せからのXML出力の1行によって指定されます。

使用上の注意

データベース・ビューをINSERTのターゲットにする場合、そのビューに対するINSTEAD OF INSERTトリガーを作成し、ポストされたデータの処理をさらに自動化できます。たとえば、ビューのINSTEAD OF INSERTトリガーは、PL/SQLを使用してレコードの有無を確認し、その確認結果に応じてINSERTまたはUPDATE のどちらを実行するかを効果的に選択できます。

構文

このアクションの構文は、次のとおりです。

<xsql:insert-request table="table"/>

属性

表30-10に、<xsql:insert-request>アクションに対して使用できるオプションの属性を示します。

表30-10 <xsql:insert-request>の属性

の属性 " width="100%">

属性名

説明

table = "string"

XMLデータの挿入に使用する表、ビューまたはシノニムの名前。

transform = "URL"

挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

columns = "string"

挿入されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

commit = "boolean"

yes(デフォルト)に設定すると、挿入が正常に実行された後に、現行の接続に対するCOMMITがコールされます。有効値は、yesおよびnoです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるintegerを指定すると、integerのバッチ単位のレコードが挿入されるたびにCOMMITが発行されます。数値を指定しない場合は、デフォルトのバッチ・サイズは0(ゼロ)で、プロセッサによって途中でコミットされることはありません。

date-format = "string"

挿入中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列Errorに設定する必要があります。任意のパラメータ名を有効な値として指定できます。

例

例30-18は、挿入用にポストされたXML文書またはHTMLフォームのコンテンツを解析および変換します。

例30-18 パラメータに受信したXMLの挿入

<?xml version="1.0"?>
<xsql:insert-request
table="purchase_order"
transform="purchseorder-to-rowset.xsl"
connection="demo"
xmlns:xsql="urn:oracle-xsql"/>

<xsql:query>

用途

SQLのSELECT文を実行し、問合せの結果セットの正規のXML表示をデータ・ページに挿入します。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

構文

このアクションの構文は、次のとおりです。

<xsql:query>
SELECT_Statement
</xsql:query>

任意の有効なSQLのSELECT文でSELECT_Statementプレースホルダを置換できます。使用したSELECT文によって行が生成されない場合、次のようにネストした<xsql:no-rows-query>要素を含めることによって、代替の問合せを作成できます。

<xsql:query>
SELECT_Statement
<xsql:no-rows-query>
Fallback_SELECT_Statement
</xsql:no-rows-query>
</xsql:query>

<xsql:no-rows-query>要素自体が、任意のネスト・レベルまでネストした<xsql:no-rows-query>要素を含むことができます。<xsql:no-rows-query>に対して使用可能なオプションは、<xsql:query>アクション・ハンドラ要素の場合と同じです。

属性

表30-11に示すオプションの属性を指定すると、<xsql:query>アクションによって取得されるデータおよび生成されるXMLを様々な面で制御できます。

表30-11 <xsql:query>の属性

の属性 " width="100%">

属性名

説明

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。これらのパラメータの値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

date-format = "string"

問合せ中のXML内の書式化された日付列と属性の値に対して使用する日付書式マスク。有効値はjava.text.SimpleDateFormatクラスの場合と同じです。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

error-statement = "boolean"

noに設定すると、生成されたすべての<xsql-error>要素への違反SQL文の挿入が抑制されます。有効値は、yes(デフォルト)およびnoです。

fetch-size = "integer"

データベース・ラウンドトリップごとにフェッチするレコードの数。指定しない場合は、XSQLConfig.xml内の/XSQLConfig/processor/default-fetch-size構成設定で指定されているデフォルト値が使用されます。

id-attribute = "string"

結果セット内の各行を一意に識別するためのデフォルトのnum属性のかわりに使用するXML属性名。この属性の値が空の文字列である場合は、行のID属性が抑制されます。

id-attribute-column = "string"

結果セット内の列の大/小文字を区別した名前。この値は、行IDの属性値として各行に指定する必要があります。デフォルトでは、行カウントが行IDの属性値として使用されます。

include-schema = "boolean"

yesに設定すると、結果セットの構造を記述するインラインXML Schemaが挿入されます。有効値は、yesおよびno(デフォルト)です。

max-rows = "integer"

オプションでskip-rows属性で示される行数をスキップした後にフェッチする行の最大数。指定しない場合は、デフォルトですべての行がフェッチされます。

null-indicator = "boolean"

NULL="Y"属性が列の要素に挿入され、列の値がnullであることを通知するかどうかを指定します。デフォルトでは、値がNULLである列は出力されません。有効値は、yesおよびno(デフォルト)です。

row-element = "string"

問合せ結果のrowsetに対するデフォルトの<ROW>のかわりに使用するXML要素名。結果セット内の各行に対して含まれる<ROW>要素の生成を抑制するには、空の文字列を設定します。

rowset-element = "string"

問合せ結果のrowsetに対するデフォルトの<ROWSET>のかわりに使用するXML要素名。含まれる<ROWSET>要素の生成を抑制するには、空の文字列を設定します。

skip-rows = "integer"

結果セットから行をフェッチする前にスキップする行の数。max-rowsと組み合せて、問合せ結果のステートレス・ページングを行うこともできます。

tag-case = "string"

有効値は、lowerおよびupperです。指定しない場合は、デフォルトで、問合せで対応するXML要素名として指定されている列名の大/小文字が使用されます。

例

例30-20に、単純なXSQLページを示します。

例30-19 Hello World

<?xml version="1.0"?>
<xsql:query connection="xmlbook" xmlns:xsql="urn:oracle-xsql">
SELECT 'Hello, World!' AS text     FROM DUAL</xsql:query>

例30-20をhello.xsqlという名前で保存しブラウザで実行すると、XSQLページ・プロセッサにより次のXMLが戻されます。

<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<TEXT>Hello, World!</TEXT>
</ROW>
</ROWSET>

デフォルトでは、問合せによって生成されたXMLはその結果セットの列構造を反映し、要素名は列名と一致します。次のようなネストした構造を持つ、結果内の列は、その構造を反映するネストした要素を生成します。

- オブジェクト型

- コレクション型

- CURSOR式

異なる型の列を含み、1行を戻す典型的な問合せの結果は、例30-20のようになる場合があります。

例30-20 ネストした構造の例

<ROWSET>
<ROW id="1">
<VARCHARCOL>Value</VARCHARCOL>
<NUMBERCOL>12345</NUMBERCOL>
<DATECOL>12/10/2001 10:13:22</DATECOL>
<OBJECTCOL>
<ATTR1>Value</ATTR1>
<ATTR2>Value</ATTR2>
</OBJECTCOL>
<COLLECTIONCOL>
<COLLECTIONCOL_ITEM>
<ATTR1>Value</ATTR1>
<ATTR2>Value</ATTR2>
</COLLECTIONCOL_ITEM>
<COLLECTIONCOL_ITEM>
<ATTR1>Value</ATTR1>
<ATTR2>Value</ATTR2>
</COLLECTIONCOL_ITEM>
</COLLECTIONCOL>
<CURSORCOL>
<CURSORCOL_ROW>
<COL1>Value1</COL1>
<COL2>Value2</COL2>
</CURSORCOR_ROW>
</CURSORCOL>
</ROW>
</ROWSET>

<ROW>要素は、結果セット内の行ごとに繰り返されます。問合せで標準SQL列別名を使用して、結果セット内の列の名前を変更できます。これによって、生成されたXML要素の名前も変更されます。列別名は、XML要素には無効な名前を持つ列に対しては必須です。

たとえば、例30-21の<xsql:query>アクションでは、計算された式のデフォルト列名が無効なXML要素名であるため、エラーが発生します。

例30-21 エラーが発生する問合せ

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT TO_CHAR(hire_date,'DD-MON')
FROM   employees
</xsql:query>

この問題は、例30-22のような列別名を使用して解決できます。

例30-22 列別名を使用した問合せ

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT TO_CHAR(hire_date,'DD-MON') AS hiredate FROM   employees
</xsql:query>

<xsql:ref-cursor-function>

用途

REF CURSORを戻す任意のストアド・ファンクションを実行し、問合せの結果セットを正規のXML形式に挿入します。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

このタグは、問合せの内容を指定し、その問合せにカーソルを戻すストアド・プロシージャを起動する場合に使用します。この方法でこのタグを使用すると、問合せを非表示にして、直接参照されないようにすることができるため、軽度のセキュリティが施されます。

構文

このアクションの構文は、次のとおりです。SCHEMA_NAMEはオプションのデータベース・スキーマ名です。PACKAGE_NAMEはオプションのPL/SQLパッケージ名です。FUNCTION_NAME(必須)は、PL/SQLファンクションの名前です。

<xsql:ref-cursor-function>
[SCHEMA_NAME.][PACKAGE_NAME.]FUNCTION_NAME(args);
</xsql:ref-cursor-function>

属性

オプションの属性は、<xsql:ref-cursor-function>でfetch-sizeを使用できないことを除き、表30-11に示す<xsql:query>アクションの属性と同じです。

例

PL/SQLの動的SQL機能を使用すると、結果セットへのカーソル・ハンドルをXSQL Page Processorに戻す前に、ファンクションで条件付きの動的問合せを作成できます。ファンクションの戻り値はREF CURSOR型である必要があります。例30-23のPL/SQLパッケージについて考えてみます。

例30-23 DynCursor PL/SQLパッケージ

CREATE OR REPLACE PACKAGE DynCursor IS
TYPE ref_cursor IS REF CURSOR;
FUNCTION DynamicQuery(id NUMBER) RETURN ref_cursor;
END;
CREATE OR REPLACE PACKAGE BODY DynCursor IS
FUNCTION DynamicQuery(id NUMBER) RETURN ref_cursor IS
the_cursor ref_cursor;
BEGIN
IF id = 1 THEN -- Conditionally return a dynamic query as a REF CURSOR
OPEN the_cursor  -- An employees Query
FOR 'SELECT employee_id, email FROM employees';
ELSE
OPEN the_cursor  -- A departments Query
FOR 'SELECT department_name, department_id FROM departments';
END IF;
RETURN the_cursor;
END;
END;

<xsql:ref-cursor-function>は、例30-24の構文によって、このファンクションが戻したREF CURSORの動的結果を挿入できます。

例30-24 REF CURSOR関数の実行

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<xsql:ref-cursor-function connection="demo" xmlns:xsql="urn:oracle-xsql">
DynCursor.DynamicQuery(1);
</xsql:ref-cursor-function>

<xsql:set-cookie>

用途

HTTP Cookieの値を設定します。デフォルトでは、Cookieの値は現行のブラウザの存続期間中、存続します。ただし、その存続期間は、オプションのmax-age属性を指定して変更できます。Cookieに割り当てられる値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、SQLのSELECT文の結果から指定することもできます。

この機能はHTTPプロトコル固有であるため、このアクションは、それが使用されているXSQLページがXSQLサーブレットによって処理されている場合にのみ有効です。このアクションは、XSQLコマンドライン・ユーティリティまたはXSQLRequestプログラムAPIによって処理されているXSQLページで検出された場合は、何もしません。

使用上の注意

SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。この使用方法では、この使用方法を適用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

単一のSQL文の結果に基づいて複数のCookie値を設定する必要がある場合、name属性を使用しないでください。かわりに、names属性を使用して、1つ以上のCookie名を空白またはカンマで区切ったリストを指定できます。

構文

このアクションの構文は、次のとおりです。paramnameはパラメータの名前です。

<xsql:set-cookie name="paramname" value="value"/>

または、次の構文を使用できます。SQL_statementはSQLのSELECT文です。paramnameはパラメータの名前です。

<xsql:set-cookie name="paramname">
SQL_statement
</xsql:set-cookie>

name属性またはnames属性のいずれかが必要です。value属性と含まれるSQL文は、相互に排他的です。選択リストの列数は、設定されているCookieの数と一致している必要があります。一致していない場合は、エラー・メッセージが戻されます。

属性

表30-12に、このアクションがサポートする属性を示します。太字の属性は必須です。その他はすべてオプションです。

表30-12 <xsql:set-cookie>の属性

の属性 " width="100%">

属性名

説明

name = "string"

値を設定するCookieの名前。nameまたはnamesを使用する必要があります。両方は使用できません。

names = "string string ..."

値を設定するCookie名を空白またはカンマで区切ったリスト。nameまたはnamesを使用する必要があります。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

domain = "string"

Cookieの値が有効で読取り可能なドメイン。domainが明示的に設定されていない場合は、デフォルトで、そのCookieを作成するドキュメントの完全修飾ホスト名(server.biz.comなど)に設定されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定します。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

Cookieに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesおよびno(デフォルト)です。

immediate = "boolean"

Cookieの割当てを現在のページにすぐに表示するかどうかを指定します。通常、現行のリクエストで設定されたCookieは、ブラウザが後続のリクエストでCookieをサーバーに送信するまでは、表示されません。有効値は、yesおよびno (デフォルト)です。

max-age = "integer"

Cookieの存続期間の最大値(秒)を設定します。デフォルトでは、Cookieが現行ブラウザ・セッションの終了時に期限切れになるように設定されます。

only-if-unset = "boolean"

Cookieが存在しない場合にのみCookieを割り当てるかどうかを指定します。有効値は、yesおよびno(デフォルト)です。

path = "string"

Cookieの値が有効で読取り可能なドメイン内の相対URLパス。パスが明示的に設定されていない場合は、デフォルトで、そのCookieを作成するドキュメントのURLパスに設定されます。

value = "string"

Cookieに割り当てる値を設定します。

例

例30-25は、HTTP Cookieにパラメータchoiceの値を設定します。

例30-25 Cookieへのパラメータ値の設定

<?xml version="1.0"?>
<xsql:set-cookie name="last_selection"
value="{@choice}" xmlns:xsql="urn:oracle-xsql"/>

例30-3は、HTTP Cookieにデータベースから選択した値を設定します。

例30-26 Cookieへのデータベースで生成した値の設定

<?xml version="1.0"?>
<xsql:set-cookie name="shopping_cart_id" bind-params="user"
connection="demo"       xmlns:xsql="urn:oracle-xsql">
SELECT cartmgr.new_cart_id(UPPER(?)) FROM DUAL
</xsql:set-cookie>

例30-4は、1つのSELECT文の結果に基づいて3つのCookieを設定します。

例30-27 3つのCookieの設定

<?xml version="1.0"?>
<xsql:set-cookie names="paramname1 paramname2 paramname3"
connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT expression_or_column1, expression_or_column2, expression_or_column3
FROM table
WHERE clause_identifying_a_single_row
</xsql:set-cookie>

<xsql:set-page-param>

用途

ページのプライベート・パラメータの値を設定します。この値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、別の方法として、SQLのSELECT文の結果から指定することもできます。

使用上の注意

SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。このアクションを使用するには、そのアクションを使用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

value属性またはSQL文を指定するもう1つの方法として、xpath属性を指定して、ページ・レベルのパラメータをXPath式の値に設定できます。XPath式は、XSQL Page ProcessorにポストされたXML文書またはHTML形式に対して評価されます。xpath属性の値には、任意の有効なXPath式を指定できます。オプションで、他のXSQLアクション・ハンドラ要素と同様に、XSQLパラメータを属性値の一部として使用して作成できます。

ページのプライベート・パラメータが設定されると、後続のアクション・ハンドラは、この値を{@po_id}などの字句パラメータとして使用できます。または、SQL操作をサポートするアクション・ハンドラのbind-params属性でその名前を参照することによって、SQLバインド・パラメータ値として使用できます。

name属性を使用するのではなく、単一のSQL文の結果に基づいて複数のセッション・パラメータ値を設定する必要がある場合は、names属性を使用できます。1つ以上のセッション・パラメータ名を空白またはカンマで区切ったリストを指定できます。

構文

このアクションの構文は、次のとおりです。paramnameはパラメータの名前です。またvalueは値です。

<xsql:set-page-param name="paramname" value="value"/>

または、次の構文を使用できます。SQL_statementはSQLのSELECT文です。paramnameはパラメータの名前です。

<xsql:set-page-param nname="paramname">
SQL_statement
</xsql:set-page-param>

または、次の構文を使用できます。paramnameはパラメータの名前です。expressionはXPath式です。

<xsql:set-page-param name="paramname" xpath="expression"/>

name属性またはnames属性のいずれかが必要です。value属性と含まれるSQL文は、相互に排他的です。

属性

表30-13に、このアクションがサポートする属性を示します。太字の属性は必須です。その他はすべてオプションです。

表30-13 <xsql:set-page-param>の属性

の属性 " width="100%">

属性名

説明

name = "string"

値を設定する、ページのプライベート・パラメータの名前。

names = "string string ..."

値を設定するページ・パラメータ名を空白またはカンマで区切ったリスト。name属性またはnames属性のいずれかを使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。これらのパラメータの値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

ページ・レベルのパラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesまたはno(デフォルト)です。

quote-array-values = "boolean"

パラメータ名が単一の値のパラメータ名(たとえば、myparam)で、treat-list-as-array="yes"を指定している場合、quote-array-values="yes"を指定すると、カンマで値が区切られる前に各文字列トークンが一重引用符で囲まれます。有効値は、yesおよびno(デフォルト)です。

treat-list-as-array = "boolean"

パラメータに割り当てられた文字列値を、割当て前に別の値の配列にトークン化するかどうかを指定します。文字列中にカンマが存在する場合、トークンの区切りにそのカンマが使用されます。それ以外の場合は、空白が使用されます。有効値は、yesおよびnoです。デフォルト値は、設定中のパラメータ名が配列パラメータ名(たとえば、myparam[])である場合はyes、設定中のパラメータ名が単一の値のパラメータ名(たとえば、myparam)である場合はnoです。

value = "string"

パラメータに割り当てる値を設定します。

xpath = "XPathExpression"

XSQL Page ProcessorにポストされたXML文書またはHTML形式に対して評価されたXPath式に、パラメータの値を設定します。

例

例30-28は、単一のSQL文の結果に基づいて複数のパラメータ値を設定します。

例30-28 複数のページ・パラメータの設定

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<xsql:set-page-param names="paramname1 paramname2 paramname3"
connection="demo" xmlns:xsql="urn:oracle-xsql>
SELECT expression_or_column1, expression_or_column2, expression_or_column3
FROM table
WHERE clause_identifying_a_single_row
</xsql:set-page-param>

例30-29は、ページ・レベルのパラメータにデータベースから選択した値を設定し、xsql:query属性の値として使用します。

例30-29 データベースで生成した値のパラメータへの設定

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:set-page-param name="max-rows-pref">
SELECT max_rows
FROM user_profile
WHERE userid = {@userid}
</xsql:set-page-param>
<xsql:query max-rows="{@max-rows-pref}">
SELECT title, url
FROM newsstory
ORDER BY date_entered DESC
</xsql:query>
</page>

<xsql:set-session-param>

用途

HTTPセッション・レベルのパラメータの値を設定します。セッション・レベルのパラメータの値は、現行ブラウザ・ユーザーのHTTPセッションの存続期間中、存続します。HTTPセッションは、Webサーバーによって制御されます。この値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、SQLのSELECT文の結果から指定することもできます。

この機能はJavaサーブレットに固有であるため、このアクションは、それが使用されているXSQLページがXSQLサーブレットによって処理されている場合にのみ有効です。このアクションは、XSQLコマンドライン・ユーティリティまたはXSQLRequestプログラムAPIによって処理されているXSQLページで使用した場合は、何もしません。

使用上の注意

SQL文を使用する方法では、XSQLプロセッサによって単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。この使用方法では、この使用方法を適用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

単一のSQL文の結果に基づいて複数のセッション・パラメータ値を設定する場合、name属性を使用しないでください。かわりに、names属性を使用して、1つ以上のセッション・パラメータ名を空白またはカンマで区切ったリストを指定できます。

構文

このアクションの構文は、次のとおりです。paramnameはパラメータの名前です。またvalueは値です。

<xsql:set-session-param name="paramname" value="value"/>

または、次の構文を使用できます。SQL_statementはSQLのSELECT文です。paramnameはパラメータの名前です。

<xsql:set-session-param name="paramname">
SQL_statement
</xsql:set-session-param>

name属性またはnames属性のいずれかが必要です。value属性と含まれるSQL文は、相互に排他的です。

属性

表30-14に、このアクションがサポートするオプションの属性を示します。太字の属性は必須です。その他はすべてオプションです。

表30-14 <xsql:set-session-param>の属性

の属性 " width="100%">

属性名

説明

name = "string"

値を設定するセッション・レベルの変数の名前。name属性またはnames属性のいずれかを使用します。両方は使用できません。

names = "string string ..."

値を設定するセッション・パラメータ名を空白またはカンマで区切ったリスト。name属性またはnames属性のいずれかを使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。パラメータの値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定します。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

セッション・レベルのパラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesおよびno(デフォルト)です。

only-if-unset = "boolean"

セッション変数が存在しない場合にのみセッション変数を割り当てるかどうかを指定します。有効値は、yesおよびno(デフォルト)です。

quote-array-values = "boolean"

パラメータ名が単一の値のパラメータ名(たとえば、myparam)で、treat-list-as-array="yes"を指定している場合、quote-array-values="yes"を指定すると、カンマで値が区切られる前に各文字列トークンが一重引用符で囲まれます。有効値は、yesおよびno(デフォルト)です。

treat-list-as-array = "boolean"

パラメータに割り当てられた文字列値を、割当て前に別の値の配列にトークン化するかどうかを指定します。文字列中にカンマが存在する場合、トークンの区切りにそのカンマが使用されます。それ以外の場合は、空白が使用されます。有効値は、yesおよびnoです。デフォルト値は、設定中のパラメータ名が配列パラメータ名(たとえば、myparam[])である場合はyes、設定中のパラメータ名が単一の値のパラメータ名(たとえば、myparam)である場合はnoです。

value = "string"

パラメータに割り当てる値を設定します。

例

例30-30は、単一のSELECT文の結果に基づいて複数のセッション・パラメータ値を設定します。

例30-30 セッション・パラメータの設定

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:set-session-param names="paramname1 paramname2 paramname3">
SELECT expression_or_column1, expression_or_column2, expression_or_column3
FROM   table
WHERE  clause_identifying_a_single_row
</xsql:set-session-param>
<!-- ... -->
</page>

<xsql:set-stylesheet-param>

用途

最上位のXSLTスタイルシート・パラメータの値を設定します。この値には、静的テキストと他のパラメータ値を組み合せて指定できます。また、SQLのSELECT文の結果から指定することもできます。スタイルシート・パラメータ値は、現行のページの処理中に使用されるすべてのスタイルシートに対して設定できます。

使用上の注意

SQL文を使用する方法では、単一行が結果セットからフェッチされ、パラメータに最初の列の値が割り当てられます。この使用方法では、この使用方法を適用するXSQLページのドキュメント要素にconnection="connname"属性を指定し、データベース接続を指定する必要があります。

単一のSQL文の結果に基づいて複数のスタイルシート・パラメータ値を設定する場合、name属性を使用しないでください。かわりに、names属性を使用して、1つ以上のスタイルシート・パラメータ名を空白またはカンマで区切ったリストを指定できます。

構文

このアクションの構文は、次のとおりです。paramnameはパラメータの名前です。またvalueは値です。

<xsql:set-stylesheet-param name="paramname" value="value"/>

または、次の構文を使用できます。SQL_statementはSQLのSELECT文です。paramnameはパラメータの名前です。

<xsql:set-stylesheet-param name="paramname">
SQL_statement
</xsql:set-stylesheet-param>

name属性またはnames属性のいずれかが必要です。value属性と含まれるSQL文は、相互に排他的です。

属性

表30-15に、このアクションがサポートするオプションの属性を示します。太字の属性は必須です。その他はすべてオプションです。

表30-15 <xsql:set-stylesheet-param>の属性

の属性 " width="100%">

属性名

説明

name = "string"

値を設定する最上位のスタイルシート・パラメータの名前。

names = "string string ..."

値を設定する最上位のスタイルシート・パラメータ名を空白またはカンマで区切ったリスト。name属性またはnames属性を使用します。両方は使用できません。

bind-params = "string"

順序付けられ、空白で区切られた1つ以上のXSQLパラメータ名のリスト。パラメータの値は、SQL文内の該当する順序位置にあるJDBCバインド変数にバインドするために使用されます。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、文字列'Error'に設定する必要があります。任意のパラメータ名を有効な値として指定できます。

ignore-empty-value = "boolean"

スタイルシート・パラメータに割当て中の値が空の文字列である場合に、その割当てを無視するかどうかを指定します。有効値は、yesおよびno(デフォルト)です。

value = "string"

パラメータに割り当てる値を設定します。

例

例30-31は、スタイルシートを関連付け、<xsql:set-stylesheet-param>アクション・ハンドラ要素を使用して、XSQLページ・パラメータp_tableの値を最上位のXSLTスタイルシート・パラメータtableに割り当てます。

例30-31 スタイルシート・パラメータの設定

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<page connname="xmlbook" connection="{@p_connname}">
<xsql:query null-indicator="yes" xmlns:xsql="urn:oracle-xsql">
<![CDATA[
SELECT *
FROM {@p_table}
WHERE rownum < 2
]]>
</xsql:query>
<xsql:set-stylesheet-param name="table" value="{@p_table}"
xmlns:xsql="urn:oracle-xsql" />
</page>

<xsql:update-request>

用途

XML文書またはHTMLフォームからポストされたデータを受け入れ、XML SQL Utility(XSU)を使用して、ターゲット表またはビューから正規の形式のXML文書のコンテンツを更新します。

XSUとXSLTを組み合せると、XML文書を特定の表に対して適切な正規の形式に変換できます。変換後、結果として戻る正規のXMLをXSUで更新できます。特定のデータベース表では、正規のXML形式は、その表に対するSELECT *問合せからのXML出力の1行によって指定されます。

構文

このアクションの構文は、次のとおりです。

<xsql:update-request table="table_name"/>

属性

表30-3に、<xsql:update-request>アクションに対して使用できる属性を示します。太字の属性は必須です。

表30-16 <xsql:update-request>の属性

の属性 " width="100%">

属性名

説明

table = "string"

XMLデータの更新に使用する表、ビューまたはシノニムの名前。

key_columns = "string string ..."

空白またはカンマで区切られた1つ以上の列名のリスト。プロセッサは、ポストされたXML文書に指定されたこれらの名前の値によって、更新する既存の行を識別します。

transform = "URL"

更新されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

columns = "string"

更新されるドキュメントを正規のROWSET/ROW形式に変換するために使用するXSLT変換の相対URLまたは絶対URL。

commit = "boolean"

yes(デフォルト)に設定すると、更新が正常に実行された後に、現行の接続に対するCOMMITがコールされます。有効値は、yesおよびnoです。

commit-batch-size = "integer"

0(ゼロ)以外の正数であるintegerを指定すると、integerのバッチ単位のレコードが更新されるたびにCOMMITが発行されます。数値を指定しない場合は、デフォルトのバッチ・サイズは0(ゼロ)で、途中でコミットされることはありません。

date-format = "string"

更新中のXML内の日付フィールド値を解析するために使用する日付書式マスク。有効値は、java.text.SimpleDateFormatクラスの有効値です。

error-param = "string"

ページのプライベート・パラメータの名前。このアクションの処理中に致命的でないエラーが発生した場合は、Errorに設定する必要があります。任意のパラメータ名を有効な値として指定できます。

例

例30-32は、更新用にポストされたXML文書またはHTMLフォームのコンテンツを解析および変換します。

例30-32 パラメータに受信したXMLの更新

<?xml version="1.0"?>
<xsql:update-request table="purchase_order"   key-columns="department_id"
connection="demo"        transform="doc-to-departments.xsl"
xmlns:xsql="urn:oracle-xsql/>

31 XDK標準

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

- XDKがサポートするXML標準

- XDKがサポートするキャラクタ・セット

XDKがサポートするXML標準

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

- XDKがサポートするXML標準の概要

- XDK for JavaのXML標準

XDKがサポートするXML標準の概要

表31-1に、XDKコンポーネントがサポートする標準を示します。

表31-1 XDKがサポートするXML標準の概要

標準

Java

C

C++

仕様のURL

DOM 1.0

フル

フル

フル

http://www.w3.org/TR/DOM-Level-1

DOM 2.0 Core

フル

フル

フル

http://www.w3.org/TR/DOM-Level-2-Core

DOM 2.0 Events

フル

フル

フル

http://www.w3.org/TR/DOM-Level-2-Events

DOM 2.0 Transversal and Range

フル

フル

フル

http://www.w3.org/TR/DOM-Level-2-Traversal-Range

DOM 3.0 Load and Save

一部サポート脚注1

サポート対象外

サポート対象外

http://www.w3.org/TR/2003/CR-DOM-Level-3-LS-20031107

DOM 3.0 Validation

フル脚注2

サポート対象外

サポート対象外

http://www.w3.org/TR/2003/CR-DOM-Level-3-Val-20030730

JAXP 1.1(JSR標準)

フル

適用不可

適用不可

http://www.oracle.com/technetwork/java/index.html

JAXP 1.2(JSR標準)

フル

適用不可

適用不可

http://www.oracle.com/technetwork/java/index.html

SAX 1.0

フル

フル

フル

http://www.saxproject.org

SAX 2.0 Core

フル

フル

フル

http://www.saxproject.org

SAX 2.0 Extension

フル

フル

フル

http://www.saxproject.org

XML 1.0(Second Edition)

フル

フル

フル

http://www.w3.org/TR/REC-xml

XML Base

XSLT内のみ

サポート対象外

サポート対象外

http://www.w3.org/TR/xmlbase

XML Namespaces 1.0

フル

フル

フル

http://www.w3.org/TR/REC-xml-names

XML Pipeline Definition Language 1.0(ノート)

一部サポート脚注3

サポート対象外

サポート対象外

http://www.w3.org/TR/xml-pipeline

XML Schema Language 1.0

フル

フル脚注4

フル脚注4

http://www.w3.org/TR/xmlschema-0

XPath 1.0

フル

フル

フル

http://www.w3.org/TR/xpath

XPath 2.0 Language(草案、2005年4月4日付)

フル

サポート対象外

サポート対象外

http://www.w3.org/TR/2005/WD-xpath20-20050404

XPath 2.0データ・モデル(草案、2005年4月4日付)

フル

サポート対象外

サポート対象外

http://www.w3.org/TR/2005/WD-xpath-datamodel-20050404/

XQuery 1.0 and XPath 2.0 Functions and Operators(草案、2005年4月4日付)

フル

サポート対象外

サポート対象外

http://www.w3.org/TR/2005/WD-xpath-functions-20050404

XSLT 1.0

フル

フル

フル

http://www.w3.org/TR/xslt

XSLT 2.0(草案、2005年4月4日付)

一部サポート脚注5

サポート対象外

サポート対象外

http://www.w3.org/TR/2005/WD-xslt20-20050404/

脚注1 「DOMレベル3 Load and Save」では、DOM 3.0 CoreとLoad and Saveとの関係を説明しています。

脚注2 「DOM 3.0 Validation」では、DOM 3.0 CoreとValidationとの関係を説明しています。

脚注3 「XDK for JavaのためのPipeline Definition Language標準」では、標準のサポートされない部分について説明しています。

脚注4 Schema Processorでは、この仕様とhttp://www.w3.org/2001/05/xmlschema-errataで公開されている「XML Schema 1.0 Specification Errata」に規定された機能がフル・サポートされます。

脚注5 「XDK for JavaのXSLT標準」では、XSLT標準のサポートされない部分について説明しています。

XDK for JavaのXML標準

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

- XDK for JavaのDOM標準

- XDK for JavaのXSLT標準

- XDK for JavaのJAXB標準

- XDK for JavaのためのPipeline Definition Language標準

XDK for JavaのDOM標準

注意:
Oracle Database 10gリリース2では、Java XDKでDOMレベル3.0 Load and SaveおよびValidation仕様の勧告候補バージョンが実装されています。オラクル社は、DOMレベル3.0 Load and SaveおよびValidationの勧告の実装を含めたリリースまたはパッチの作成を計画しています。これらの勧告に準拠するため、下位互換性のない変更を行う場合があります。この間、DOM Load and SaveおよびValidationの実装に関する下位互換性は保証されません。勧告に準拠するようにJava XDKを更新した後、オラクル社の通常の下位互換性に関する方針がOracle DOM Load and SaveおよびValidationの実装に適用されます。

DOM APIはDOMレベル3 ValidationおよびDOMレベル3 Load and Saveの勧告候補をサポートしています。

DOMレベル3 Load and Save

DOMレベル3 Load and Saveモジュールを使用すると、ソフトウェア開発者は、準拠する製品内にXMLコンテンツをロードおよび保存できます。DOM 3.0 CoreインタフェースDOMConfigurationは、DOM 3 Load and Saveで参照されます。DOM 3.0 Coreはサポートされていませんが、このインタフェースの制限付きの実装を使用できます。

LSParserでは、charset-overrides-xml-encoding構成パラメータはサポートされていません。LSParserでは、次の構成パラメータのオプション設定はサポートされていません。

- disallow-doctype (true)

- ignore-unknown-character-denormalizations (false)

- namespaces (false)

- supported-media-types-only (true)

LSSerializerでは、discard-default-content構成パラメータはサポートされていません。LSSerializerでは、次の構成パラメータのオプション設定はサポートされていません。

- canonical-form (true)

- format-pretty-print (true)

- ignore-unknown-character-denormalizations (false)

- normalize-characters (true)

DOM 3.0 Validation

DOM 3.0 Validationを使用すると、ユーザーは、XML Schemaからのメタデータ定義の取得、DOM操作の妥当性の問合せ、およびXML Schemaに対するDOM文書またはサブツリーの検証が可能です。

Validationで参照されるDOM 3 Core機能の一部が実装されていますが、Core自体はサポートされていません。DOM CoreのNameListおよびDOMStringListは、検証のためにサポートされています。検証はXMLスキーマに基づいているため、これらの機能を使用する前にDTDをXMLスキーマに変換する必要があります。

XDK for JavaのXSLT標準

XSLTプロセッサは、XSLT 2.0、XPath 2.0およびXPath/XQuery共有データ・モデルの現在の草案にサポートを追加します。

注意:
Oracle Database 10gリリース2のリリース時点では、W3C XSLTおよびXPathのワーキング・グループはXSLT 2.0およびXPath 2.0の勧告を公開していません。オラクル社では、XSLT 2.0およびXPath 2.0仕様が勧告になるまで、その進展に追随していきます。この期間中、XSLT 2.0およびXPath 2.0の展開に従うため、以前のリリースやパッチ・セットとの下位互換性がないXSLT 2.0およびXPath 2.0実装のアップデートをリリースせざるを得ない場合があります。この間、XSLT 2.0およびXPath 2.0実装に関するデータベース・リリースやパッチ・セット間の下位互換性は保証されません。XSLT 2.0およびXPath 2.0仕様が勧告になった後は、XSLT 2.0およびXPath 2.0勧告の実装を取り入れたリリースやパッチ・セットを作成していきます。勧告の公開後は、オラクル社の通常の下位互換性に関する方針がXSLT 2.0およびXPath 2.0の実装に適用されます。XSLT 2.0およびXPath 2.0仕様の状況に関する最新情報については、http://www.w3.orgを参照してください。

仕様の次の機能は、現行リリースではサポートされていません。

- スキーマ・インポートおよび静的入力機能はサポートされていませんが、XPath 2.0データ・モデルで規定されているXMLスキーマの組込み入力機能はサポートされています。

- schema-elementおよびschema-attributeのノードテストはサポートされていません。

- XSLT命令xsl:numberは、XSLT 1.0のセマンティクスおよび構文を使用します。

- use-when標準属性はサポートされていません。

- プロセッサでは、xsl:paramのrequired属性はサポートされていません。

- トンネル・パラメータはサポートされていません。

- 正規表現命令はXSLTではサポートされていません。

- XPath 2.0関数fn:tokenize、fn:matchesおよびfn:replaceはサポートされていません。

- format-dateTime、format-dateおよびformat-time関数はサポートされていません。

- xsl:attribute、xsl:comment、xsl:messageのコンテンツ・モデルと、xsl:keyおよびxsl:sortのキー値の計算方法は1.0の動作のままです。

- xsl:copy、xsl:elementおよびリテラル結果要素の属性[xsl:]inherit-namespacesはサポートされていません。

XPath 2.0およびXSLT 2.0に関するW3Cの仕様が更新された結果、動作が10gリリース1と異なる部分があります。10gリリース1対応の動作では、システム・プロパティoracle.xdkjava.compatibility.version=10.1.0が設定されます。

XPath 2.0 - 10gリリース1と10gリリース2との相違点

1. RangeExprの(m to n)でm > nの場合の動作が変更されました。以前は逆の順序で(n to m)と処理されていました。2005年4月の草案に従って、空の順序が戻されます。

2. isnot演算子が2005年4月の草案に従って削除されました。

3. getEffectiveBooleanValueの定義(fn:boolean)が2005年4月の草案に従って更新されました。空の文字列値を指定すると、falseが戻されるのではなく、例外(FORG006)が発生します。getEffectiveBooleanValueで処理されないすべてのケースで例外(FORG006)が発生します。XPath 1.0のfn:booleanの動作には変更はありません。

XSLT 2.0 - 10gリリース1と10gリリース2との相違点

2004年11月の草案に従って、normalize-unicodeがnormalization-formに変更され、有効な属性値が"yes" | "no"から"NFC" | "NFD" | "NKFC" | "NKFD" | \x{2026}\x{2026}に変わりました。

XDK for JavaのJAXB標準

Oracle Database XDKにおけるJAXB仕様の実装では、次の機能はサポートされていません。

- Javadocの生成

- XML Schemaコンポーネント"any"および置換グループ

XDK for JavaのためのPipeline Definition Language標準

XML Pipeline ProcessorがW3Cノートから次の点で変更されています。

- DOMParserProcessおよびSAXParserProcessを処理するパーサーがXMLパイプラインに追加されています(セクション1)。

- 使用可能なパイプライン入力に関する最終ターゲット出力が最新のものになっているかどうかを確認するには、最終ターゲット出力のみを確認します。XML Pipeline Processorでは各プロセスの中間出力が最新であるかどうかは判断されません(セクション2.2)。

- select属性では、二重引用符("...")の間にあるものはすべてリテラル文字列と考えられます。

- 1つのプロセスで同じInformation Setが作成された場合、XML Pipeline Processorではエラーが発生します(セクション2.4.2.3)。

- <document>要素はサポートされていません(セクション2.4.2.8)。

XDKがサポートするキャラクタ・セット

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

- XDK for Javaがサポートするキャラクタ・セット

- XDK for Cがサポートするキャラクタ・セット

XDK for Javaがサポートするキャラクタ・セット

XML Schema Processor for Javaは、次のエンコーディングを使用するドキュメントをサポートします。

- BIG

- EBCDIC-CP-*

- EUC-JP

- EUC-KR

- GB2312

- ISO 2022-JP

- ISO 2022-KR

- ISO 8859-1からISO 8859-9

- ISO 10646-UCS-2

- ISO 10646-UCS-4

- KOI8-R

- Shift_JIS

- US-ASCII

- UTF-8

- UTF-16

XDK for Cがサポートするキャラクタ・セット

XDK Parser for Cでは、300を超えるIANAキャラクタ・セットがサポートされています。サポートされているキャラクタ・セットには、次のものがあります。

- UTF-8

- UTF-16

- UTF16-BE

- UTF16-LE

- US-ASCII

- ISO 10646-UCS-2

- ISO-8859-{1-9、13-15}

- EUC-JP

- SHIFT_JIS

- BIG5

- GB2312

- GB_2312-80

- HZ-GB-2312

- KOI8-R

- KSC5601

- EUC-KR

- ISO 2022-CN

- ISO 2022-JP

- ISO 2022-KR

- WINDOWS-{1250-1258}

- EBCDIC-CP-{US、CA、NL、WT、DK、NO、FI、SE、IT、ES、GB、FR、HE、BE、CH、ROECE、YU、IS、AR}

- IBM{037、273、277、278、280、284、285、297、420、424、437、500、775、850、852、855、857、858、860、861、863、865、866、869、870、871、1026、01140、01141、01142、01143、01144、01145、01146、01147、01148}

前述のキャラクタ・セットの別名を使用できます。また、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録A「キャラクタ・セット」に指定されたキャラクタ・セットは、IW7IS960を除いて使用できます。

A Oracle XDK for Java XMLエラー・メッセージ

この付録では、XMLインタフェースの実行中にOracle XDK for Javaを使用するアプリケーションで発生する可能性のあるエラー・メッセージを示します。

- XMLパーサー・エラー・メッセージ

- DOMエラー・メッセージ

- XSLT変換エラー・メッセージ

- XPathエラー・メッセージ

- XMLスキーマ検証エラー・メッセージ

- スキーマ表現制約のエラー・メッセージ

- スキーマ・コンポーネント制約のエラー・メッセージ

- XSQLサーバー・ページのエラー・メッセージ

- XMLパイプラインのエラー・メッセージ

- Java API for XML Binding(JAXB)のエラー・メッセージ

関連項目:
XQueryエラー・メッセージについては、http://www.w3.org/TR/xquery/#id-errorsを参照してください。

XMLパーサー・エラー・メッセージ

XML-20000からXML-20999の範囲のエラー・メッセージは次のとおりです。

XML-20003: 行string、列stringでトークン"string"が欠落しています

入力データに予期されたトークンが見つかりませんでした。

処置: 入力データを確認して更新し、構文エラーを修正してください。

XML-20004: 行string、列stringでキーワードstringが欠落しています

原因: 入力データに予期されたキーワードが見つかりませんでした。

処置: 入力データを確認し、正しいキーワードに更新してください。

XML-20005: 行string、列stringでキーワードstringやstringが欠落しています

原因: 入力データに予期されたキーワードが見つかりませんでした。

処置: 入力データを確認し、正しいキーワードに更新してください。

XML-20006: 行string、列stringに予期しないテキストがあります。EOFが必要です

原因: ルート要素の終了タグの後にさらにテキストが見つかりました。

処置: ルート要素の終了タグの後には、コメント、PIまたは空白しか続けることができません。終了タグ後の余分なテキストを削除してください。

XML-20007: 行string、列stringで要素の宣言のコンテンツ・モデルが欠落しています

原因: 要素の宣言に必要なコンテンツ・モデル仕様が欠落しています。XML 1.0 2nd Editionの生成規則[45]を参照してください。

処置: 必要なコンテンツ仕様を要素の宣言に追加してください。

XML-20008: 行string、列stringでコンテンツ・モデルの要素名が欠落しています

原因: 要素宣言のコンテンツ・モデルが無効です。コンテンツ・パーティクルに要素名が必要です。XML 1.0 2nd Editionの生成規則[48]を参照してください。

処置: 要素名を追加し、コンテンツ仕様の構文を修正してください。

XML-20009: 行string、列stringの処理の指示のターゲット名stringは予約済です

原因: ターゲット名XML: xmlなどは、XML仕様の将来のバージョンにおける標準化用に予約されています。XML 1.0 2nd Editionの生成規則[17]を参照してください。

処置: PIがXML宣言を意味する場合、宣言はファイルの先頭にあることを確認してください。それ以外の場合、PIの名前を変更してください。

XML-20010: 行string、列stringの未解析のエンティティ宣言に表記法の名前がありません

原因: 未解析のエンティティ宣言で使用されている表記法の名前が、宣言された表記法に一致しませんでした。XML 1.0 2nd Editionの生成規則[76]を参照してください。

処置: DTDに表記法の宣言を追加してください。

XML-20011: 行string、列stringの属性リスト宣言で属性の型が欠落しています

原因: 属性リスト宣言で属性の型が欠落していました。CDATA、ID、IDREF、IDREFS、ENTITY、ENTITIES、NMTOKEN、NMTOKENSのいずれか1つの型を追加する必要があります。XML 1.0 2nd Editionの生成規則[52]、[53]を参照してください。

処置: 属性の宣言を確認して修正してください。

XML-20012: 行string、列stringで空白が欠落しています

原因: 必要な空白が欠落していました。

処置: 空白を追加して構文エラーを修正してください。

XML-20013: 行string、列stringのエンティティ値の文字stringが無効です

原因: エンティティ値で無効な文字が使用されました。文字&、%および"または'(値デリミタに基づく)は無効です。XML 1.0 2nd Editionの生成規則[9]を参照してください。

処置: 文字のかわりにエンティティまたは文字参照を使用してください。たとえば、&のかわりに&amp;または&#38;を使用できます。

XML-20014: 行string、列stringのコメントには"--"を使用できません

原因: 「--」を使用したためにコメントで構文エラーが発生しました。XML 1.0 2nd Editionの生成規則[15]を参照してください。

処置: コメントを修正し、「--」はコメントの最後の「-->」の一部としてのみ使用してください。

XML-20015: 行string、列stringのテキストには"]]>"を使用できません

原因: 「]]>」はテキストには使用できません。CDATAセクションの終了マーカーとしてのみ使用します。XML 1.0 2nd Editionの生成規則[14]を参照してください。

処置: &gt;または>の文字参照を使用してテキスト・コンテンツを修正してください。

XML-20016: 行string、列stringでは、状態変化インジケータの前に空白を使用できません

原因: コンテンツ仕様で状態変化インジケータの前には空白を使用できません。たとえば、<!ELEMENT x (a,b) *>は無効です。XML 1.0 2nd Editionの生成規則[47]、[48]を参照してください。

処置: 余分な空白を削除してコンテンツ仕様を修正してください。

XML-20017: 行string、列stringの混合コンテンツでは、状態変化インジケータ"string"を使用できません

原因: 混合コンテンツの宣言では、状態変化を使用できません。たとえば、<!ELEMENT x (#PCDATA)?>は無効です。XML 1.0 2nd Editionの生成規則[51]を参照してください。

処置: 構文を修正して状態変化インジケータを削除してください。

XML-20018: 行string、列stringの混合コンテンツでは、コンテンツ・リストを使用できません

原因: 混合コンテンツの宣言では、コンテンツ・リストを使用できません。たとえば、<!ELEMENT x (#PCDATA | (a,b))>は無効です。XML 1.0 2nd Editionの生成規則[51]を参照してください。

処置: 構文を修正してコンテンツ・リストを削除してください。

XML-20019: 行string、列stringの混合コンテンツ宣言では、要素"string"が重複しています

原因: 混合コンテンツ宣言で、重複した要素名が見つかりました。たとえば、<!ELEMENT x (#PCDATA | a | a)>は無効です。XML 1.0 2nd Editionの生成規則[51]を参照してください。

処置: 重複した要素名を削除してください。

XML-20020: 行string、列stringでは、ルート要素"string"がDOCTYPE名"string"と一致しません

原因: 失敗: ドキュメント・タイプ宣言の名前はルート要素の要素型に一致する必要があります。例: <?xml version="1.0"?> <!DOCTYPE greeting [ <!ELEMENT greeting (#PCDATA)> ]> <salutation>Hello!</salutation> 文書のルート要素(salutation)が、DTDで宣言されたルート要素(greeting)に一致していません。

処置: 文書を修正してください。

XML-20021: 行string、列stringの要素の宣言"string"が重複しています

原因: DTDで要素が2回宣言されています。

処置: 重複した宣言を削除してください。

XML-20022: 要素"string"には、行string、列stringに複数のID属性があります

原因: 失敗: 要素型に複数のID属性は指定できません。

処置: 重複したID属性の宣言を削除して、文書を修正してください。

XML-20023: 行string、列stringの要素stringのID属性stringは、#IMPLIEDまたは#REQUIREDである必要があります

原因: 失敗: ID属性には、デフォルトとして#IMPLIEDまたは#REQUIREDを宣言する必要があります。

処置: 属性宣言を修正してください。

XML-20024: 行string、列stringで要素"string"の必須属性"string"が欠落しています

原因: 失敗: デフォルトの宣言がキーワード#REQUIREDである場合、属性リスト宣言に型のすべての要素の属性を指定する必要があります。

処置: 必要な属性を指定して、入力文書を修正してください。

XML-20025: ID値: "string"が重複しています

原因: ID型の値はName生成規則に一致する必要があります。1つのXML文書において、同じ名前がこの型の値として複数回出現することはできません。すなわち、ID値によって、その値を取る要素が一意に識別される必要があります。

処置: 重複するID値を削除して、入力文書を修正してください。

XML-20026: IDREFのID値"string"が未定義です

原因: 失敗: IDREF型の値はID属性の値に一致する必要があります。

処置: IDREFに対応するIDを追加するかIDREFを削除して、文書を修正してください。

XML-20027: 要素"string"の属性"string"には、行string、列stringに無効な列挙型の値"string"があります

原因: 失敗: この型の値は宣言でNmtokenトークンの1つに一致する必要があります。

処置: 属性値を修正し、列挙値の1つに一致させてください。

XML-20028: 要素"string"の属性"string"は、行string、列stringに無効な値"string"があり、"string"にする必要があります

原因: 失敗: 属性のデフォルト値が#FIXEDキーワードで宣言されている場合、その属性のインスタンスはデフォルト値に一致する必要があります。

処置: 属性値を更新し、デフォルトの固定値に一致させてください。

XML-20029: 属性のデフォルトは、行string、列stringではREQUIRED、IMPLIEDまたはFIXEDにする必要があります

原因: 宣言されたデフォルト値は宣言された属性型の字句制約に適合させる必要があります。

処置: 属性のデフォルト宣言にREQUIRED、IMPLIEDまたはFIXEDのいずれかを使用してください。

XML-20030: 行string、列stringで、要素"string"のコンテンツ・テキストが無効です

原因: その要素では、コンテンツにテキストを使用できません。要素が有効であるのは、要素宣言に一致する宣言(名前が要素型に一致する)があり、次のいずれかが当てはまる場合です。

宣言が子に一致し、一連の子要素がコンテンツ・モデルの正規表現によって生成された言語に属します。開始タグと最初の子要素間、子要素間または最後の子要素と終了タグ間に空白(非終端記号Sに一致する文字)が置かれることがあります。空白のみを含むCDATAセクションは非終端記号Sに一致せず、これらの位置には配置できないことに注意してください。

処置: 予期されていないテキストを削除して、コンテンツを修正してください。

XML-20031: 行string、列stringの要素"string"のコンテンツに含まれる要素"string"が無効です

原因: 要素に無効なコンテンツがあります。要素が有効であるのは、要素宣言に一致する宣言(名前が要素型に一致する)があり、次のいずれかが当てはまる場合です。

1. 宣言が子に一致し、一連の子要素がコンテンツ・モデルの正規表現によって生成された言語に属します。開始タグと最初の子要素間、子要素間または最後の子要素と終了タグ間に空白(非終端記号Sに一致する文字)が置かれることがあります。空白のみを含むCDATAセクションは非終端記号Sに一致せず、これらの位置には配置できないことに注意してください。

2. 宣言はMixedに一致します。コンテンツは、文字データ、および型がコンテンツ・モデルの名前に一致する子要素から構成されます。

処置: 予期されていない要素を削除して、コンテンツを修正してください。

XML-20032: 行string、列stringの要素"string"のコンテンツは不完全です

原因: 要素に無効なコンテンツがあります。要素が有効であるのは、要素宣言に一致する宣言(名前が要素型に一致する)があり、次のいずれかが当てはまる場合です。

1. 宣言が子に一致し、一連の子要素がコンテンツ・モデルの正規表現によって生成された言語に属します。開始タグと最初の子要素間、子要素間または最後の子要素と終了タグ間に空白(非終端記号Sに一致する文字)が置かれることがあります。空白のみを含むCDATAセクションは非終端記号Sに一致せず、これらの位置には配置できないことに注意してください。

2. 宣言はMixedに一致します。コンテンツは、文字データ、および型がコンテンツ・モデルの名前に一致する子要素から構成されます。

処置: 予期されていない要素を削除して、コンテンツを修正してください。

XML-20033: 行string、列stringのエンティティ"string"に対する置換テキストが無効です

原因: パラメータ・エンティティの置換テキストはマークアップ宣言で正しくネストする必要があります。つまり、マークアップ宣言(前述のマークアップ宣言)の最初の文字または最後の文字のどちらか一方がパラメータ・エンティティ参照の置換テキストに含まれている場合、両方の文字が同じ置換テキストに含まれている必要があります。

処置: エンティティ値を修正してください。

XML-20034: 行string、列stringで、要素の終了タグ"string"が開始タグ"string"と一致しません

原因: 要素の終了タグの名前は開始タグの要素型に一致する必要があります。

処置: 終了タグまたは開始タグを修正し、もう一方のタグに一致させてください。

XML-20035: 行string、列stringでは、要素"string"の属性"string"が重複しています

原因: 同じ開始タグまたは空要素タグに属性名を2回以上使用することはできません。

処置: 重複した属性を削除してください。

XML-20036: 行string、列stringの属性値の文字stringが無効です

原因: 属性値で無効な文字が使用されました。文字&、<および"または'(値デリミタに基づく)は無効です。XML 1.0 2nd Editionの生成規則[10]を参照してください。

処置: 文字のかわりにエンティティまたは文字参照を使用してください。たとえば、&のかわりに&amp;または&#38;を使用できます。

XML-20037: 行string、列stringの属性"string"の外部エンティティ"string"への参照が無効です

原因: 属性値には、外部エンティティへの直接または間接エンティティ参照を含めることはできません。

処置: 文書を修正し、属性の外部エンティティへの参照を削除してください。

XML-20038: 行string、列stringの要素"string"の未解析エンティティ"string"への参照が無効です

原因: エンティティ参照には、未解析エンティティの名前を含めないでください。未解析エンティティは、ENTITY型またはENTITIES型と宣言された属性値でのみ参照できます。

処置: 文書を修正し、コンテンツの未解析エンティティへの参照を削除してください。

XML-20039: 行string、列stringの属性リスト宣言で、属性の型stringが無効です

原因: 属性リスト宣言で無効な属性の型が使用されました。CDATA、ID、IDREF、IDREFS、ENTITY、ENTITIES、NMTOKEN、NMTOKENSのいずれか1つの型を追加する必要があります。XML 1.0 2nd Editionの生成規則[52]、[53]を参照してください。

処置: 属性の宣言を確認して修正してください。

XML-20040: 行string、列stringの要素の内容に無効な文字stringがあります

原因: 文字参照を使用して参照される文字はCharの生成規則に一致する必要があります。

処置: 無効な文字または文字参照を削除して、文書を修正してください。

XML-20041: 行string、列stringでは、エンティティ参照"string"がそれ自身を参照しています

原因: 解析されたエンティティには、直接、間接に関係なく、それ自身への再帰的参照を含むことはできません。

処置: 文書を修正してください。

XML-20042: Nmtoken: "string"が無効です

原因: この型の値は宣言のNmtokenトークンの1つに一致する必要があります。また、有効なNmtokenであることが必要です。

処置: 属性値を修正してください。

XML-20043: 行string、列stringのパブリック識別子に無効な文字stringがあります

原因: パブリック識別子に無効な文字が使用されました。XML 1.0 2nd Editionの生成規則[12]、[13]を参照してください。

処置: パブリック識別子を修正してください。

XML-20044: 行string、列stringで使用されているネームスペースの接頭辞"string"が宣言されていません

原因: 接頭辞は有効範囲内の名前空間宣言に定義されていませんでした。

処置: 名前空間宣言を追加し、接頭辞を定義してください。

XML-20045: 行string、列stringの要素"string"の属性"string"は、未解析のエンティティである必要があります

原因: ENTITY型の値はName生成規則に一致する必要があります。ENTITIES型の値は複数のNameに一致する必要があります。各NameはDTDに宣言された未解析エンティティの名前に一致する必要があります。

処置: 属性値を修正し、未解析エンティティを参照してください。

XML-20046: 行string、列stringの未解析のエンティティ"string"で使用されている表記法"string"が宣言されていません

原因: この型の値は宣言に含まれた表記法の名前の1つに一致する必要があります。宣言のすべての表記法名は宣言する必要があります。

処置: 未解析のエンティティ宣言の表記法名を修正してください。

XML-20047: 要素の宣言"string"が欠落しています

原因: 属性宣言で参照された要素宣言がDTDに見つかりませんでした。

処置: 要素宣言を追加して、DTDを修正してください。

XML-20048: 行string、列stringのエンティティの宣言"string"が重複しています

原因: エンティティ宣言の重複に関する警告。

処置: 処置は不要です。

XML-20049: 行string、列stringでパラメータ・エンティティ宣言でのNDATAの使用方法が無効です

原因: パラメータ・エンティティ宣言にNDATA宣言が見つかりました。これは、通常の未解析のエンティティ宣言でのみ使用できます。XML 1.0 2nd Editionの生成規則[72]、[74]を参照してください。

処置: エンティティ宣言を修正してください。

XML-20050: 行string、列stringの属性の宣言"string"が重複しています

原因: 属性宣言の重複に関する警告。

処置: 処置は不要です。

XML-20051: 行string、列stringの表記法の宣言"string"が重複しています

原因: 特定の名前を宣言できる表記法の宣言は1つのみです。

処置: 重複する表記法を削除して、文書を修正してください。

XML-20052: 行string、列stringで使用されている属性"string"が宣言されていません

原因: 属性宣言がDTDに見つかりませんでした。

処置: 属性宣言を追加して、DTDを修正してください。

XML-20053: 行string、列stringで使用されている要素"string"が宣言されていません

原因: 要素宣言がDTDに見つかりませんでした。

処置: 要素宣言を追加して、DTDを修正してください。

XML-20054: 行string、列stringで使用されているエンティティ"string"が宣言されていません

原因: エンティティ宣言がDTDに見つかりませんでした。

処置: 要素宣言を追加して、DTDを修正してください。

XML-20055: NodeFactoryのcreateDocumentにより無効なドキュメントが戻されました

原因: NodeFactoryのcreateDocument関数で戻された文書は無効です。NULLであるか、サポートされていないクラスのインスタンスでした。

処置: NodeFactoryの実装を修正し、XMLDocumentまたはそのサブクラスのインスタンスを戻すようにしてください。

XML-20056: SAX機能"string"が無効です

原因: 指定されたSAX機能は有効な機能名ではありませんでした。

処置: 有効な機能のリストは、ドキュメントを参照してください。

XML-20057: SAX機能"string"に無効な値"string"が渡されました

原因: SAX機能に指定された値は有効ではありませんでした。

処置: 機能および対応する値の有効なリストは、ドキュメントを参照してください。

XML-20058: SAXプロパティ"string"が無効です

原因: 指定されたSAXプロパティは有効なプロパティ名ではありませんでした。

処置: プロパティの有効なリストは、ドキュメントを参照してください。

XML-20059: SAXプロパティ"string"に無効な値が渡されました

原因: SAXプロパティに指定された値は有効ではありませんでした。

処置: プロパティおよび対応する値の有効なリストは、ドキュメントを参照してください。

XML-20060: URL "string"のオープン中にエラーが発生しました

原因: 指定されたURLのオープン中にエラーが発生しました。

処置: URLを確認し、データを読み取れるように適切な処置を行ってください。

XML-20061: UTF8エンコード・データのバイト・ストリーム"string"が無効です

原因: 入力データに、UTF8エンコーディング・スキームに対して無効なw.r.tであるバイトが含まれていました。

処置: 入力データを修正してください。

XML-20062: 5バイトのUTF8エンコーディングはサポートされていません

原因: XMLパーサーでは、5バイトのUTF8エンコーディング・スキームをサポートしていません。また、無効なUTF8文字が誤って5バイトのUTF8エンコーディングと解釈された可能性もあります。

処置: データに無効なUTF8バイトがある場合、入力を修正してください。それ以外の場合で5バイトのUTF8をサポートする必要があるときは、Oracleサポートに連絡してください。

XML-20063: 6バイトのUTF8エンコーディングはサポートされていません

原因: XMLパーサーでは、6バイトのUTF8エンコーディング・スキームをサポートしていません。また、無効なUTF8文字が誤って6バイトのUTF8エンコーディングと解釈された可能性もあります。

処置: データに無効なUTF8バイトがある場合、入力を修正してください。それ以外の場合で6バイトのUTF8をサポートする必要があるときは、Oracleサポートに連絡してください。

XML-20064: XML文字"string"が無効です

原因: 入力データに無効なXML文字が見つかりました。

処置: 入力データを修正してください。

XML-20065: エンコーディング"string"は、XML宣言のエンコーディング"string"と一致しません

原因: データのエンコーディング(自動検出またはユーザー指定による)はXML宣言に指定されたエンコーディングに一致しませんでした。

処置: XML宣言を修正し、データのエンコーディングに一致させてください。

XML-20066: エンコーディング"string"はサポートされていません

原因: XMLパーサーでは、指定されたエンコーディングをサポートしていません。

処置: エンコーディングのサポートが必要な場合、Oracleサポートに連絡してください。

XML-20067: EntityResolverのresolveEntityにより無効なInputSourceが戻されました

原因: EntityResolverによりInputSourceの無効なインスタンスが戻されました。Reader、InputStream、SystemIdのいずれも初期化されていない場合、またはSystemIdが無効な場合、InputSourceは無効になる可能性があります。

処置: EntityResolverクラスを修正し、InputSourceの有効なインスタンスを戻すようにしてください。

XML-20100: ''string''が必要です。

XML-20101: stringまたはstringが必要です。

XML-20102: ''string''、''string''または''string''が必要です。

XML-20103: コンテンツ・モデルのトークンが無効です。

XML-20104: ID''string''の要素が見つかりません。

XML-20105: ENTITY型の属性値''string''が未解析のエンティティと一致しません。

XML-20106: 表記法''string''が見つかりません。

XML-20107: 要素''string''の宣言が見つかりません。

XML-20108: ルート要素の開始が必要です。

XML-20109: 名前'xml'を持つPIは、ドキュメントの始めのみに使用できます。

XML-20110: 混合コンテンツ宣言には#PCDATAが必要です。

XML-20111: 混合コンテンツ宣言で要素''string''が反復しています。

XML-20112: 外部DTD ''string''のオープン中にエラーが発生しました。

XML-20113: 入力ソース(string)をオープンできません。

XML-20114: 条件文の開始構文が無効で、'['が必要です。

XML-20115: 条件文の最後に']]>'が必要です。

XML-20116: エンティティ''string''は、最初の定義を使用してすでに定義済です。

XML-20117: パラメータエンティティ宣言でNDATAは使用できません。

XML-20118: NDATA値が必須です。

XML-20119: エンティティ値は引用符で始まる必要があります。

XML-20120: エンティティ値が正しく形成されていません。

XML-20121: 終了タグが開始タグ''string''と一致しません。

XML-20122: 属性の'='が欠落しています。

XML-20123: 終了タグの'>'が欠落しています。

XML-20124: 1つの属性を同じ開始タグに複数回使用できません。

XML-20125: 属性値は引用符で始まる必要があります。

XML-20126: 属性値に含まれる'<'が無効です。

XML-20127: 属性値に外部エンティティへの参照は使用できません。

XML-20128: 要素内容で未解析エンティティへの参照は使用できません。

XML-20129: ネームスペースの接頭辞''string''が使用されましたが宣言されていません。

XML-20130: ルート要素名はDOCTYPE名と一致する必要があります。

XML-20131: 要素''string''はすでに宣言されています。

XML-20132: 要素に複数のID属性を含めることはできません。

XML-20133: 属性型が欠落しています。

XML-20134: ID属性は、#IMPLIEDまたは#REQUIREDを宣言される必要があります。

XML-20135: 属性''string''は、最初の定義を使用してすでに定義されています。

XML-20136: 表記法''string''はすでに宣言されています。

XML-20137: 属性''string''が使用されましたが宣言されていません。

XML-20138: REQUIRED属性''string''が指定されていません。

XML-20139: ID値''string''が一意ではありません。

XML-20140: IDREF値''string''がID属性値と一致しません。

XML-20141: 属性値''string''は宣言済の列挙値の1つである必要があります。

XML-20142: 不明な属性型です。

XML-20143: 属性値の最後に認識されないテキストがあります。

XML-20144: FIXED型の属性値がデフォルト値''string''と等しくありません。

XML-20145: 要素''string''のコンテンツに予期しないテキストがあります。

XML-20146: 要素''string''の内容に予期しないテキストがあります。要素''string''と予想されます。

XML-20147: ''string''の内容に無効な要素''string''があります。終了タグが必要です。

XML-20148: ''string''の内容に無効な要素''string''があります。要素''string''が必要です。

XML-20149: 要素''string''が使用されましたが宣言されていません。

XML-20150: 要素stringは不完全であり、要素''string''が必要です。

XML-20151: エンティティ''string''が使用されましたが宣言されていません。

XML-20170: UTF8エンコーディングが無効です。

XML-20171: XML文字(string)が無効です。

XML-20172: 5バイトのUTF8エンコーディングはサポートされていません。

XML-20173: 6バイトのUTF8エンコーディングはサポートされていません。

XML-20180: ユーザー指定のNodeFactoryによりNULLのポインタが戻されました。

XML-20190: 空白が必要です。

XML-20191: DTDを終了するには'>'が必要です。

XML-20192: DTDに予期しないテキストがあります。

XML-20193: 予期しないEOFです。

XML-20194: 出力ストリームに書込みできません。

XML-20195: PrintWriterでは、エンコーディングはサポートされていません。

XML-20200: ''string''のかわりに''string''が必要です。

XML-20201: stringのかわりにstringが必要です。

XML-20202: stringをstringにする必要があります。

XML-20205: ''string''が必要です。

XML-20206: stringまたはstringが必要です。

XML-20210: 予期しないstringです。

XML-20211: ''string''はstringでは使用できません。

XML-20220: InputSourceが無効です。

XML-20221: テキストに無効な文字があります。

XML-20230: エンコーディングのstringからstringへの変更が無効です。

XML-20231: エンコーディング''string''は現在サポートされていません。

XML-20240: InputSourceをオープンできません。

XML-20241: エンティティstringをオープンできません。

XML-20242: 外部DTD ''string''のオープン中にエラーが発生しました。

XML-20250: エンティティ''string''が欠落しています。

XML-20251: エンティティ''string''に循環実体参照があります。

XML-20280: 文字(string)が無効です。

XML-20281: NMTokenは少なくとも1つのNMCharを含む必要があります。

XML-20282: PubIdLiteralにはstringを使用できません。

XML-20284: コンテンツ・モデルのオプション文字の前にある空白が無効です。

XML-20285: 混合コンテンツ・モデルが無効です。

XML-20286: 混合コンテンツ・モデルでは、コンテンツ・リストは使用できません。

XML-20287: 混合コンテンツ・モデルでは、コンテンツ・パーティクルは使用できません。

XML-20288: 属性宣言のデフォルト宣言が無効です。

XML-20500: SAX機能''string''が認識されていません。

XML-20501: SAX機能''string''はサポートされていません。

XML-20502: SAXプロパティ''string''は認識されていません。

XML-20503: SAXプロパティ''string''がサポートされていません。

DOMエラー・メッセージ

XML-21000からXML-21999の範囲のエラー・メッセージは次のとおりです。

XML-21000: 無効なサイズstringが指定されました

原因: DOM関数に無効なサイズまたはカウントが渡されました。

処置: 渡す引数を有効な値に修正してください。

XML-21001: 無効な索引stringが指定されました。0からstringの間に指定する必要があります

原因: DOM関数に無効な索引が渡されました。

処置: 渡す引数をエラー・メッセージの範囲に指定された有効な値に修正してください。

XML-21002: 祖先を子ノードとして追加できません

原因: DOM操作で、祖先ノードを子として追加しようとしました。この操作は、ツリーの一貫性がなくなる可能性があるため、許可されません。

処置: アプリケーションを確認し、使用方法を修正してください。

XML-21003: 型stringのノードは型stringのノードに追加できません

原因: DOM仕様では、DOM操作で使用されている親子の組合せが許可されていません。

処置: DOM仕様を参照し、使用方法を修正してください。

XML-21004: 文書ノードには、子としてstringノードを1つのみ含めることができます

原因: XMLを整形式にするには、文書ノードに子として1つの要素ノードしか持たないようにする必要があります。アプリケーションでは、2番目の要素ノードを追加しようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21005: 型stringのノードは属性リストに追加できません

原因: 属性リスト(NamedNodeMapのインスタンス)には、属性ノードしか含めることができません。

処置: NamedNodeMapの使用方法を修正してください。

XML-21006: 異なるドキュメントに属するノードは追加できません

原因: 追加しようとしているノードは異なる文書で作成されました。DOM仕様では、文書間でのノードの使用を許可していません。

処置: ノードを追加する前に、importNodeまたはadoptNodeを使用してノードを文書間で移動してください。

XML-21007: 名前の文字stringが無効です

原因: 渡された修飾名またはローカル名は無効でした。

処置: 名前を修正し、有効な文字のみを使用してください。

XML-21008: 型stringのノードには値を設定できません

原因: 指定された型のノードには値を設定できません。

処置: DOM関数の使用方法を修正してください。

XML-21009: エンティティの子または実体参照ノードは変更できません

原因: エンティティの子または実体参照ノードは読取り専用ノードであり、変更できません。

処置: DOM関数の使用方法を修正してください。

XML-21010: DTDのコンテンツは変更できません

原因: DTDおよびすべてのコンテンツは読取り専用であり、変更できません。

処置: DOM関数の使用方法を修正してください。

XML-21011: 属性を削除できません。現行の要素内に見つかりません

原因: 現行の要素に属さない属性を削除しようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21012: ノードを削除または置換できません。これは現行ノードの子ではありません

原因: 現行ノードに子として属さないノードを削除しようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21013: パラメータstringが認識されません

原因: DOMパラメータは認識されませんでした。

処置: 有効なパラメータのリストは、ドキュメントを参照してください。

XML-21014: パラメータstringの値stringはサポートされていません

原因: DOMパラメータは認識されませんでした。

処置: 有効なパラメータのリストは、ドキュメントを参照してください。

XML-21015: 別の要素に属する属性は追加できません

原因: 別の要素に属する属性を追加しようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21016: 接頭辞stringに対するネームスペースstringが無効です

原因: 接頭辞xmlおよびxmlnsの名前空間は固定されており、その名前空間を使用する必要があります。

処置: 接頭辞の名前空間を修正してください。名前空間はxml = http://www.w3.org/XML/1998/namespace、xmlns = http://www.w3.org/2000/xmlns/です。

XML-21017: 修飾名: stringが無効です

原因: DOM関数に渡された修飾名は無効でした。

処置: 修飾名を修正してください。

XML-21018: 接頭辞stringのネームスペース宣言"string"と"string"が競合します

原因: DOMツリーには、同じ接頭辞に対して競合する名前空間宣言があります。そのようなDOMツリーはシリアライズできません。

処置: DOMツリーを修正した後、出力してください。

XML-21019: stringオブジェクトは連結解除されました

原因: オブジェクトは連結解除されました。連結解除されたオブジェクトに対する操作はサポートされていません。オブジェクトは範囲オブジェクトまたはイテレータ・オブジェクトです。

処置: アプリケーションの使用方法を修正してください。

XML-21020: 無効な境界が指定されています。型stringのノードを部分的に選択することはできません

原因: 範囲に指定された境界は無効でした。部分選択はテキスト・ノードに対してのみ可能です。

処置: アプリケーションの使用方法を修正してください。

XML-21021: 型stringのノードでは範囲操作stringはサポートされていません

原因: 指定されたノード型では、範囲操作はサポートされていません。

処置: 各範囲操作のノード型の制限については、DOMのドキュメントを参照してください。

XML-21022: イベント型: stringが無効です

原因: 渡されたイベント型は無効でした。

処置: アプリケーションの使用方法を修正してください。

XML-21023: 型stringのノードには、接頭辞は使用できません

原因: アプリケーションでは、接頭辞が使用できないノードに接頭辞を設定しようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21024: 型stringのノードには、インポートは使用できません

原因: アプリケーションでは、DOCUMENT型またはDOCUMENT FRAGMENT型のノードをインポートしようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21025: 型stringのノードでは名前変更できません

原因: アプリケーションでは、ELEMENT型またはATTRIBUTE型以外のノードをインポートしようとしました。

処置: アプリケーションの使用方法を修正してください。

XML-21026: ノードで表現できない文字: string

原因: ノードに無効な文字があります。たとえば、CDATAセクションに終了文字があります。

処置: 適切なDOM構成パラメータを設定してください。

XML-21027: ノードのネームスペースの正規化エラー: string

原因: このノードには名前空間の修正を実行できません。

処置: 名前空間の正規化をfalseに設定してください。

XML-21997: THICK DOMでサポートされていない機能

原因: サポートされていないTHICK(たとえば、XDBベース)DOMの関数がコールされました。

処置: THICK DOMでサポートされていない関数のかわりに使用できる方法については、XDKのドキュメントを参照してください。

XML-21998: システム・エラーが発生しました: string

原因: 非DOM関連のシステム・エラーが発生しました。

処置: メッセージに埋め込まれたORAエラーを確認し、考えられる原因について開発者に問い合せてください。

XSLT変換エラー・メッセージ

XML-22000からXML-22999の範囲のエラー・メッセージは次のとおりです。

XML-22000: XSLファイル(string)の解析中にエラーが発生しました。

XML-22001: XSLスタイルシートは、XSLTネームスペースには属していません。

XML-22002: インクルードXSLファイル(string)の処理中にエラーが発生しました。

XML-22003: 出力ストリーム(string)に書込みできません。

XML-22004: 入力XML文書(string)の解析中にエラーが発生しました。

XML-22005: 入力XMLストリーム(string)の読取り中にエラーが発生しました。

XML-22006: 入力XML URL(string)の読取り中にエラーが発生しました。

XML-22007: 入力XMLリーダー(string)の読取り中にエラーが発生しました。

XML-22008: ネームスペースの接頭辞''string''が使用されましたが宣言されていません。

XML-22009: 属性''string''が''string''に見つかりません。

XML-22010: ''string''に要素''string'が見つかりません。

XML-22011: XML PIに次のコンテンツを構成できません: ''string''。

XML-22012: XMLのコメントに次のコンテンツを構成できません: ''string''。

XML-22013: 式にエラーがあります: ''string''

XML-22014: 相対位置パスの前にノードセットが必要です。

XML-22015: 関数''string''が見つかりません。

XML-22016: 拡張関数ネームスペースは''string''で始まる必要があります。

XML-22017: string関数にはリテラルが必要です。'stringが見つかりました。

XML-22018: string関数に解析エラーが発生しました。

XML-22019: ''string''のかわりに''string''が必要です。

XML-22020: 拡張関数の引数にエラーがあります。

XML-22021: 外部文書: ''string''の解析中にエラーが発生しました。

XML-22022: 述語のテストでエラーが発生しました。ノードセットの型ではありません。

XML-22023: リテラルが一致しません。

XML-22024: 不明な乗算演算子です。

XML-22025: 式のエラー: 空文字列です。

XML-22026: EOFに不明な式があります: string。

XML-22027: 属性値テンプレートに閉じカッコ}が見つかりません。

XML-22028: 式の値タイプ''string''がstringで認識されません。

XML-22029: ''string''の子''string''は変換できません。

XML-22030: 属性値''string''は''string''に必要ありません。

XML-22031: 変数が未定義です: ''string''。

XML-22032: 属性値テンプレートの式の外側に単一のカッコ( )が見つかりました。

XML-22033: トークンが認識されません: ''!''

XML-22034: 接頭辞''string''のネームスペース定義が見つかりません。

XML-22035: 軸''string''が見つかりません

XML-22036: stringをstringに変換できません。

XML-22037: サポートされない機能です: ''string''。

XML-22038: パス式にノードセットが必要です。

XML-22039: 拡張ファンクション・エラー: ''string''のコンストラクタの起動でエラーが発生しました。

XML-22040: 拡張関数エラー: ''string''のオーバーロード型コンストラクタ

XML-22041: 拡張関数エラー: ''string''にコンストラクタが見つかりません

XML-22042: 拡張関数エラー: オーバーロード型メソッド''string''

XML-22043: 拡張関数エラー: メソッドで''string''が見つかりません

XML-22044: 拡張関数エラー: ''string''の起動時にエラーが発生しました: ''string''

XML-22045: 拡張関数エラー: クラスで''string''が見つかりません

XML-22046: 現行のテンプレートがNULLの場合は、インポートの適用をコールできません。

XML-22047: ''string''コンテキストの''string''のインスタンス化が無効です。

XML-22048: ''string''要素の子は''string''要素の他のすべての要素の子より前に置く必要があります。

XML-22049: テンプレート''string''が起動されましたが未定義です。

XML-22050: 変数''string''の定義が重複しています。

XML-22051: パターンとして使用される場合に、1つの変数またはパラメータへの1つのリテラルか参照のみがid()関数で使用できます

XML-22052: ''string''という名前のソート・キーは定義されていません

XML-22053: unparsed-text()でエンコーディングを検出できません。指定してください

XML-22054: ネームスペースが''string''でローカル名が''string''のXSL:functionは定義されていません

XML-22055: 範囲式は''string''ではないxs:integerデータ型のみを受入できます

XML-22056: 4つのグループ属性のうちの1つのみをxsl:for-each-groupに含める必要があります

XML-22057: ''string''は、''string''のみを子にできます

XML-22058: xsl:functionの不正な子です

XML-22059: xsl:functionの不正な子順序です

XML-22060: 処理を終了します

XML-22061: <xsl:message>の終了属性は、「yes」か「no」です

XML-22062: ''string''には少なくとも1つの''string''の子が必要です

XML-22063: QNameが''string''の文字マップに定義がありません

XML-22064: 同じ名前の''string''と、同じインポート優先順位のある文字マップを定義できません

原因: 必要な子が見つかりませんでした。

処置: エラー・メッセージのフリーズが終了した後、エラーがスローされます(必要な子要素がなければ何もできません)。

XML-22065: 1つ以上の''string''を''string''下に定義する必要があります

原因: 必要な子が欠落しています。

処置: 必要な子がなければ何もできないため、エラーがスローされます。

XML-22066: 選択属性が存在する場合は、''string'' 指示の順序コンストラクタが空である必要があります

原因: この指示では、選択属性と順序コンストラクタは相互に排他的です。

処置: なし。エラーがスローされます。

XML-22067: 使用属性が存在する場合は、''string'' 指示の順序コンストラクタが空である必要があります。

原因: この指示では、使用属性と順序コンストラクタは相互に排他的です。

処置: なし。エラーがスローされます。

XML-22068: 固定属性を含めることができるのは、主ソート・キーのみです。

原因: 2次ソート・キーに固定属性があります。

処置: なし。エラーがスローされます。

XML-22069: ''string''または''string''のみを使用できます。

原因: ユーザーの入力ミスです。

処置: なし。エラーがスローされます。

XML-22101: この型のDOMSourceノードはサポートされていません。

XML-22103: DOMResultはこの種類のノードにできません。

XML-22106: 無効なStreamSource - InputStream、ReaderおよびSystemIdがNULLです。

XML-22107: 無効なSAXSource - InputSourceがNULLです。

XML-22108: 無効なソース - URL書式が正しくありません。

XML-22109: SAXイベントの報告中に内部エラーが発生しました。

XML-22110: TransformerHandlerに無効なStreamResultが設定されています。

XML-22111: TransformerHandlerの結果セットが無効です。

XML-22112: ネームスペースURIで}が欠落しています。

XML-22113: ネームスペースURIは{で始まる必要があります。

XML-22117: URL形式に問題(NULL、不正な書式、'href'の欠落または'='の欠落)があります。

XML-22121: 関連付けられたスタイルシートを取得できません。

XML-22122: 無効なStreamResult - OutputStream、WriterおよびSystemIdがNULLです。

XML-22900: 内部エラー条件が発生しました。

XPathエラー・メッセージ

XML-23000からXML-23999の範囲のエラー・メッセージは次のとおりです。

XML-23002: 内部XPATHエラー

原因: これは、XPath/XQueryデータ・モデルまたはXPath F&Oで戻されたエラーです。

処置: XPath式を確認してください。

XML-23003: XPath 2.0機能のスキーマ要素/スキーマ属性はサポートされません

原因: このエラーは、kindtestスキーマ要素またはスキーマ属性を使用したため、発生しました。これらは今回のリリースではサポートされていません。

処置: kindtestスキーマ要素またはスキーマ属性の使用箇所を削除してください。

XML-23006: 値が必要なタイプと一致しません

原因: 評価フェーズ中、型エラーがありました。値は、XPath 2.0のSequenceTypeマッチングの一致規則で指定された必要な型に一致しませんでした。

処置: スタイルシートを変更し、正しい型を反映させてください。

XML-23007: FOAR0001: ゼロで分割されました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23008: FOAR0002: 数値操作でオーバーフロー/アンフローが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23009: FOCA0001: 10進数にキャスティング中にエラーが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23010: FOCA0002: 字句の値が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23011: FOCA0003: 入力値は整数としては大きすぎます

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23012: FOCA0004: 整数にキャスティング中にエラーが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23013: FOCA0005: NaNは、浮動小数点の値/ダブル値として指定されました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23014: FOCH0001: codepointが無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23015: FOCH0002: 照合はサポートされていません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23016: FOCH0003: 正規化フォームがサポートされていません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23017: FOCH0004: 照合では照合単位をサポートしていません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23018: FODC0001: コンテキスト文書がありません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23019: FODC0002: リソースの取得中にエラーが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23020: FODC0003: リソースの内容の解析中にエラーが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23021: FODC0004: fn:collection()に対する引数が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23022: FODT0001: 日付/時間の計算でオーバーフローが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23023: FODT0002: 継続期間の計算でオーバーフローが発生しました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23024: FONC0001: コンテキスト・アイテムが未定義です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23025: FONS0002: デフォルトのネームスペースは定義済です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23026: FONS0003: ネームスペースに対する接頭辞が未定義です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23027: FONS0004: 接頭辞に対するネームスペースが見つかりません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23028: FONS0005: 静的コンテキストにおけるベースURIが未定義です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23029: FORG0001: キャスト/コンストラクタに対する値が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23030: FORG0002: fn:resolve-uri()に対する引数が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23031: FORG0003: 1つ以上のアイテムを含むシーケンスを使用してzero-or-oneがコールされました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23032: FORG0004: アイテムを含まないシーケンスを使用してfn:one-or-moreがコールされました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23033: FORG0005: アイテムを含まない、または1つ以上のアイテムを含むシーケンスを使用してexactly-oneがコールされました

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23034: FORG0006: 引数タイプが無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23035: FORG0007: 関数を集計する引数が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23036: FORG0008: fn:dateTimeに対する引数の両方に、指定されたタイムゾーンがあります

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23037: FORG0009: fn:resolve-uriに対するベースURI引数は絶対URIではありません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23038: FORX0001: 正規表現フラグが無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23039: FORX0002: 正規表現が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23040: FORX0003: 正規表現は長さがゼロの文字列と一致します

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23041: FORX0004: 置換文字列が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23042: FOTY0001: タイプ・エラーです

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23043: FOTY0011: コンテキスト・アイテムはノードではありません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23044: FOTY0012: アイテムは比較できません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23045: FOTY0013: タイプは等しく定義されていません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23046: FOTY0014: タイプ例外です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23047: FORT0001: パラメータ数が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23048: FOTY0002: タイプ定義が見つかりません

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23049: FOTY0021: ノード・タイプが無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23050: FOER0000: 未確認エラーです

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23051: FODC0005: fn:docに対する引数が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XML-23052: FODT0003: タイムゾーン値が無効です

原因: XPath 2.0 F&O仕様エラーです。

処置: XPath式を確認してください。

XMLスキーマ検証エラー・メッセージ

XML-24000からXML-24099の範囲のエラー・メッセージは次のとおりです。

XML-24000: 内部エラー

原因: 処理中に予期しないエラーが発生しました。

処置: エラーを報告してください。

XML-24001: 属性"string"は、行string、列stringに必要ありません

原因: [cvc-assess-attr.1] 所有者要素に属性は予期されていません。

処置: 所有者要素の型に属性宣言を追加してください。

XML-24002: 要素宣言"string"が見つかりません。

原因: [cvc-assess-elt.1.1.1.1] プロセッサによって検証用に要求された要素宣言が欠落していました。

処置: スキーマに要素宣言を追加するか、スキーマに準拠するようインスタンス・ドキュメントを変更してください。

XML-24003: コンテキストにより決定される要素の宣言"string"が欠落しています。

原因: [cvc-assess-elt.1.1.1.2] コンテキストによって要求された要素宣言がスキーマに欠落していました。

処置: スキーマに要素宣言を追加してください。

XML-24004: 要素"string"の宣言が欠落しています。

原因: [cvc-assess-elt.1.1.1.3] コンテキストにより決定される宣言はスキップされず、要素に一致する宣言はスキーマに見つかりませんでした。

処置: スキーマに要素宣言を追加するか、スキップ対象のコンテキストにより決定される宣言を変更してください。

XML-24005: 要素"string"は評価されていません

原因:[cvc-assess-elt.2]

XML-24006: 要素"string"は評価が不正確です

原因:[cvc-assess-elt.2]

XML-24007: 要素"string"の属性宣言"string"が欠落しています

原因: [cvc-attribute.1] 属性宣言が要素宣言から欠落していました。

処置: スキーマに属性宣言を追加してください。

XML-24008: 属性"string"の型が欠落しています

原因: [cvc-attribute.2] 属性宣言の型定義が欠落しています。

処置: 属性宣言のデータ型を指定してください。

XML-24009: 属性値"string"が無効です

原因: [cvc-attribute.3] 属性値が型に対して無効です。

処置: インスタンスの属性値を修正してください。

XML-24010: 属性値"string"と固定値"string"が一致しません

原因: [cvc-au] 属性の正規化された値が、宣言された固定値と異なっていました。

処置: 属性値を必要な値に変更してください。

XML-24011: 要素"string"の型は抽象です。

原因: [cvc-complex-type.1] この要素の型は抽象として指定されました。

処置: 型定義から抽象属性を削除してください。

XML-24012: 空コンテンツ・タイプの要素"string"には子を使用できません

原因: [cvc-complex-type.2.1] コンテンツ・タイプは空と指定されましたが、実際のコンテンツは空ではありませんでした。

処置: コンテンツを空にするか、この要素のコンテンツ・タイプを変更してください。

XML-24013: 要素の子"string"は、単純コンテンツには使用できません

原因: [cvc-complex-type.2.2] 要素は単純コンテンツで宣言されていますが、インスタンスには要素の子がありました。

処置: この要素には文字コンテンツのみを使用してください。

XML-24014: 要素のみのコンテンツには、文字"string"を使用できません

原因: [cvc-complex-type.2.3] 要素のみのコンテンツが設定された要素のコンテンツに文字が出現しました。

処置: この要素には要素の子のみを使用してください。

XML-24015: 行string、列stringで要素"string"に複数のID属性があります

原因:[cvc-complex-type.2.5] 属性のワイルド・カードに一致するID型またはその派生型の属性が複数あります。

処置: IDまたはID派生型の属性を複数使用しないでください。

XML-24016: 行string、列stringの文字列の値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は文字列型に対して無効でした。

処置: 宣言された型に合せて値を修正してください。

XML-24017: 行string、列stringのブール値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はブール型に対して無効でした。

処置: ブール型に合せて値を修正してください。有効な値は「0: 1」、「true」および「false」です。

XML-24018: 行string、列stringの10進値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は10進値に解析できませんでした。

処置: 10進型に合せてデータ値を修正してください。

XML-24019: 行string、列stringの浮動小数点の値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は浮動小数点値に解析できませんでした。

処置: 文字列型に合せて値を修正してください。

XML-24020: 行string、列stringのダブル値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はIEEE 754-1985に指定された有効なダブル書式ではありませんでした。

処置: ダブル書式に合せて値を修正してください。

XML-24021: 行string、列stringの継続期間"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に定義された正しい拡張日時書式ではありませんでした。

処置: PnYnMnDTnHnMnS書式に合せて値を修正してください。

XML-24022: 行string、列stringの日付値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効なカレンダ日付書式ではありませんでした。

処置: CCYY-MM-DD書式に合せて値を修正してください。

コメント: cvc-datatype-valid.1.2.2

XML-24023: 行string、列stringのdateTime値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された日付と時刻の有効な組合せ書式ではありませんでした。

処置: オプションのタイムゾーンで、CCYY-MM-DDThh:mm:ss書式に合せて値を修正してください。

XML-24024: 行string、列stringの時間値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効な時間書式ではありませんでした。

処置: オプションのタイムゾーンで、DDThh:mm:ss書式に合せて値を修正してください。

XML-24025: 行string、列stringのgYearMonth値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効な右側切捨て日付書式ではありませんでした。

処置: CCYY-MM書式に合せて値を修正してください。

XML-24026: 行string、列stringのgYear値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効な右側切捨て日付書式ではありませんでした。

処置: CCYY書式に合せて値を修正してください。

XML-24027: 行string、列stringのgMonthDay値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効な左側切捨て日付書式ではありませんでした。

処置: 値を必要な--MM-DD書式に修正してください。

XML-24028: 行string、列stringのgDay値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効な左側切捨て日付書式ではありませんでした。

処置: 値を必要な---DD書式に修正してください。

XML-24029: 行string、列stringのgMonth値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はISO 8601に指定された有効な左右切捨て日付書式ではありませんでした。

処置: 値を必要な--MM--書式に修正してください。

XML-24030: 行string、列stringのhexBinary値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は有効な16進エンコード・バイナリではありませんでした。

処置: hexBinary型に合せて値を修正してください。

XML-24031: 行string、列stringのbase64Binary値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はbase64エンコーディングに対して無効でした。

処置: base64バイナリ・エンコーディングに合せて値を修正してください。

XML-24032: 行string、列stringのanyURI値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はRFC 2396およびRFC 2732Iで指定された有効な書式ではありませんでした。

処置: anyURI型に合せて値を修正してください。

XML-24033: 行string、列stringのQName値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は有効なQName書式ではありませんでした。

処置: QName型に合せて値を修正してください。

XML-24034: 行string、列stringのNOTATION値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はNOTATION型の有効な値ではありませんでした。

処置: NOTATION型に合せて値を修正してください。

XML-24035: 行string、列stringのnormalizedString値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は有効なnormalizedString値ではありませんでした。

処置: normalizedString型に合せて値を修正してください。

XML-24036: 行string、列stringのトークン値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はトークン型の有効な値ではありませんでした。

処置: トークン型に合せて値を修正してください。

XML-24037: 行string、列stringの言語値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は言語型の有効な値ではありませんでした。

処置: 言語型に合せて値を修正してください。

XML-24038: 行string、列stringのNMTOKEN値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はNMTOKEN型の有効な値ではありませんでした。

処置: NMTOKEN型に合せて値を修正してください。

XML-24039: 行string、列stringのNMTOKENS値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はNMTOKEN型の有効なリストではありませんでした。

処置: NMTOKENS型に合せて値を修正してください。

XML-24040: 行string、列stringの名前値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は名前型の有効な値ではありませんでした。

処置: 名前型に合せて値を修正してください。

XML-24041: 行string、列stringのNCName値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はNCName型の有効な値ではありませんでした。

処置: NCName型に合せて値を修正してください。

XML-24042: 行string、列stringのID値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はID型の有効な値ではありませんでした。

処置: ID型に合せて値を修正してください。

XML-24043: 行string、列stringのIDREF値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はIDREF型の有効な値ではありませんでした。

処置: IDREF型に合せて値を修正してください。

XML-24044: 行string、列stringのENTITY値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はENTITY型の有効な値ではありませんでした。

処置: ENTITY型に合せて値を修正してください。

XML-24045: 行string、列stringのENTITIES値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はENTITY値の有効なリストではありませんでした。

処置: ENTITIES型に合せて値を修正してください。

XML-24046: 行string、列stringの整数値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字は整数型の有効な値ではありませんでした。

処置: 整数型に合せて値を修正してください。

XML-24047: 行string、列stringのnonPositiveInteger値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はnonPositiveInteger型の有効な値ではありませんでした。

処置: nonPositiveInteger型に合せて値を修正してください。

XML-24048: negativeInteger値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はnegativeInteger型の有効な値ではありませんでした。

処置: negativeInteger型に合せて値を修正してください。

XML-24049: 行string、列stringのLONG値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はLONG型の有効な値ではありませんでした。

処置: LONG型に合せて値を修正してください。

XML-24050: 行string、列stringのint値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はint型の有効な値ではありませんでした。

処置: int型に合せて値を修正してください。

XML-24051: 行string、列stringのshort値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はshort型の有効な値ではありませんでした。

処置: short型に合せて値を修正してください。

XML-24052: 行string、列stringのバイト値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はバイト型の有効な値ではありませんでした。

処置: バイト型に合せて値を修正してください。

XML-24053: 行string、列stringのnonNegativeInteger値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はnonNegativeInteger型の有効な値ではありませんでした。

処置: nonNegativeInteger型に合せて値を修正してください。

XML-24054: 行string、列stringのunsignedLong値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はunsignedLong型の有効な値ではありませんでした。

処置: unsignedLong型に合せて値を修正してください。

XML-24055: 行string、列stringのunsignedInt値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はunsignedInt型の有効な値ではありませんでした。

処置: unsignedInt型に合せて値を修正してください。

XML-24056: 行string、列stringのunsignedShort値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はunsignedShort型の有効な値ではありませんでした。

処置: unsignedShort型に合せて値を修正してください。

XML-24057: 行string、列stringのunsignedByte値"string"が無効です

原因: [cvc-datatype-valid.1.2.2] 文字はunsignedByte型の有効な値ではありませんでした。

処置: unsignedByte型に合せて値を修正してください。

XML-24058: 値"string"は1つのメンバー型に対して有効である必要があります

原因: [cvc-datatype-valid.1.2.3] 文字は共用体のすべてのメンバー型に対して無効でした。

処置: 最低1つのメンバー型に合せてデータ値を修正してください。

XML-24059: 行string、列stringでは、要素"string"は必要ありません

原因: [cvc-elt.1]

XML-24060: 要素"string"は抽象です

原因:[cvc-elt.2] 抽象と宣言された要素がインスタンス文書で使用されました。

処置: 要素を抽象として宣言しないでください。

XML-24061: NULLにできない要素"string"

原因: [cvc-elt.3.1] 属性xsi:nilがありました。要素宣言はNULLにできないため、この属性は使用できません。

処置: 要素からxsi:nil属性を削除してください。

XML-24062: nilコンテンツ"string"は、文字または要素の子に使用できません

原因: [cvc-elt.3.2.1] 要素はnilに指定されましたが、文字または要素の子がありました。

処置: すべての要素コンテンツを削除するか、nil属性を削除してください。

XML-24063: nil要素が固定値の制約を満たしていません

原因: [cvc-elt.3.2.2] 要素に固定値がありますが、インスタンスのコンテンツは空でした。

処置: 要素からnil属性を削除してください。

XML-24064: xsi:typeは、行string、列stringではQNameではありません

原因: [cvc-elt.4.1] xsi:type属性の値がQNameではありませんでした。

処置: 型を参照する有効なQNameに値を変更してください。

XML-24065: xsi:type"string"は型定義に分解されません

原因: [cvc-elt.4.2] xsi:typeで指定された参照先の型が存在しませんでした。

処置: xsi:typeの値を修正し、有効な型定義を指すようにしてください。

XML-24066: ローカル型"string"は、要素"string"の型から有効に導出されていません

原因: [cvc-elt.4.3] xsi:typeで参照された型は元の型から導出されませんでした。

処置: 制約に適合するように参照型を変更するか、元の型から導出された別の型を使用してください。

XML-24067: 値"string"は列挙されていません

原因: [cvc-enumeration-valid] 値が列挙制約内の値ではありませんでした。

処置: 列挙に指定された有効な値を使用してください。

XML-24068: 型"string"に対するファセット"string"が無効です

原因: [cvc-facet-valid] 指定されたデータ値は制約ファセットに違反しています。

処置: データ値を修正してください。

XML-24069: 行string、列stringの値"string"の小数点以下の桁数が多すぎます

原因: [cvc-fractionDigits-valid] 指定された数値はfractionDigits制約ファセットに違反していました。

処置: 小数点以下の桁数を減らしてください。

XML-24070: 行string、列stringでID参照"string"のID定義が欠落しています

原因: [cvc-id.1] 検証ルート用のID/IDREF表にIDバインディングがありません。

処置: ID参照のIDを定義してください。

XML-24071: 行string、列stringのID "string"が重複しています

原因: [cvc-id.2] 同じIDが複数回定義されていました。

処置: 重複するID属性を削除してください。

XML-24072: キー・シーケンス"string"が重複しています

原因: [cvc-identity-constraint] 文書に重複したキー・シーケンスがあり、一意性制約に違反しています。

処置: 文書を修正してキー・シーケンスを一意にするか、違反しないようにxpathを変更してください。

XML-24073: ターゲット・ノード・セットは、キー"string"の修飾ノード・セットと一致しません

原因: [cvc-identity-constraint.4.2.1] キー制約に空のキー・シーケンスがありました。

処置: ターゲット・ノード・セットのすべての要素に空ではないキー・シーケンスがあるようにしてください。

XML-24074: キー・シーケンスの要素メンバー"string"はNULLにできます

原因: [cvc-identity-constraint.4.2.3] キー・シーケンスのメンバーとして選択された要素はNULLにできますが、これは許可されていません。

処置: スキーマを変更し、対応する要素宣言をNULLにできないようにしてください。

XML-24075: キー参照"string"のキー・シーケンスが欠落しています

原因: [cvc-identity-constraint.4.3] キー参照で空のキー・シーケンスを参照しました。

処置: キー参照のすべてのキー・シーケンスに参照先キーの対応するキー・シーケンスがあるようにしてください。

XML-24076: 値"string"の長さが正しくありません

原因: [cvc-length-valid] 値の長さは長さファセットに指定されたものと同じではありませんでした。

処置: 正しい長さのデータ値を使用してください。

XML-24077: 値"string"がmaxExclusive以上です

原因: [cvc-maxExclusive-valid] データ値はmaxExclusiveファセットに指定された範囲外です。

処置: データ値を修正してください。

XML-24078: 値"string"がmaxInclusiveを超えています

原因: [cvc-maxInclusive-valid] データ値はmaxInclusiveファセットに指定された範囲外です。

処置: データ値を修正してください。

XML-24079: 値の長さ"string"はmaxLengthを超えています

原因: [cvc-maxLength-valid] データ値の長さがmaxLengthを上回っています。

処置: データ値の長さをmaxLengthより小さくしてください。

XML-24080: 値"string"はminExclusive以下です

原因: [cvc-minExclusive-valid] データ値が値範囲の下限を下回っています。

処置: minExclusiveより大きいデータ値を使用してください。

XML-24081: 値"string"はminInclusive未満です

原因: [cvc-minInclusive-valid] データ値は小さすぎます。

処置: minInclusiveの値以上のデータ値を使用してください。

XML-24082: 値"string"はminLength未満です

原因: [cvc-minLength-valid] 値の長さはminLengthに指定された長さ未満でした。

処置: minLength以上の長さのデータ値を使用してください。

XML-24083: 要素"string"のコンテンツのワイルドカード・パーティクルは実行されませんでした

原因: [cvc-particle.1.1] ワイルドカード・パーティクルのminOccursに適合していませんでした。

処置: ワイルドカードに一致する要素をコンテンツに増やしてください。

XML-24084: 要素パーティクル"string"が実行されませんでした

原因: [cvc-particle.1.2] 要素パーティクルのminOccursに適合していませんでした。

処置: 要素宣言に一致する要素または置換グループのメンバーを増やしてください。

XML-24085: 要素"string"のコンテンツのモデル・グループ"string"は実行されませんでした

原因: [cvc-particle.1.3] モデル・グループ・パーティクルのminOccursに適合していませんでした。

処置: モデル・グループに一致する要素をコンテンツに増やしてください。

XML-24086: パターン・ファセット"string"に対してリテラル"string"が無効です

原因: [cvc-pattern-valid] リテラルはパターン制約ファセットに一致しませんでした。

処置: 字句データを修正し、パターン・ファセットに一致させてください。

XML-24087: 型"string"が未定義です

原因: [cvc-resolve-instance.1] 型参照を型の定義に解決できませんでした。

処置: スキーマに型定義を追加してください。

XML-24088: 属性"string"が宣言されていません

原因: [cvc-resolve-instance.2] 属性参照を属性宣言に解決できませんでした。

処置: スキーマに属性宣言を追加してください。

XML-24089: 要素"string"が宣言されていません

原因: [cvc-resolve-instance.3] 要素参照を要素宣言に解決できませんでした。

処置: スキーマに要素宣言を追加してください。

XML-24090: 属性グループ"string"が未定義です

原因: [cvc-resolve-instance.4] 属性グループ参照を属性グループの定義に解決できませんでした。

処置: スキーマで属性グループ定義を定義してください。

XML-24091: モデル・グループ"string"が未定義です

原因: [cvc-resolve-instance.5] モデル・グループ参照をモデル・グループの定義に解決できませんでした。

処置: スキーマでモデル・グループを定義してください。

XML-24092: 表記法"string"が宣言されていません

原因: [cvc-resolve-instance.6] 表記法参照を表記法宣言に解決できませんでした。

処置: スキーマに表記法宣言を追加してください。

XML-24093: 行string、列stringの値"string"の桁数が多すぎます

原因: [cvc-totalDigits-valid] 数値の桁数がtotalDigitsファセットの値を超えました。

処置: 数値を小さくしてください。

スキーマ表現制約のエラー・メッセージ

XML-24100からXML-24199の範囲のエラー・メッセージは次のとおりです。

XML-24100: 要素"string"はXMLスキーマのネームスペースに属する必要があります

原因: XMLスキーマ文書の要素にスキーマの名前空間がありませんでした。

処置: XMLスキーマの名前空間http://www.w3.org/2001/XMLSchemaを指定してください。

XML-24101: 場所"string"からスキーマを作成できません

原因: [schema_reference.2] プロセッサが指定されたスキーマの場所からスキーマを見つけることができませんでした。

処置: スキーマの場所を修正してください。

XML-24102: ターゲットのネームスペース"string"によりスキーマを解決できません

原因: [schema_reference.3] プロセッサが指定された名前空間に基づいてスキーマを取得できませんでした。

処置: スキーマの名前空間を修正してください。

XML-24103: 行string、列stringの注釈表現が無効です

原因:[src-annotation]

XML-24104: 行string、列stringに複数の注釈があります

原因: [src-annotation] コンポーネントに複数の注釈要素がありました。

処置: 余分な注釈を削除してください。

XML-24105: 注釈は、行string、列stringの先頭の要素である必要があります

原因: [src-annotation] 注釈はコンポーネントの先頭の要素ではありませんでした。

処置: 注釈をコンポーネントのコンテンツの先頭に移動してください。

XML-24106: 行string、列stringでは、属性の宣言の前に属性のワイルドカードがあります

原因: 属性ワイルドカードが属性宣言の前にありました。

処置: 属性ワイルドカードを宣言の最後に移動してください。

XML-24107: 複数の属性ワイルドカードがあります

原因: [src-attribute.1] 複数のanyAttributeが宣言されました。

処置: 余分な属性ワイルドカードを削除してください。

XML-24108: デフォルト"string"と固定"string"の両方が存在します

原因: [src-attribute.1] 属性宣言にデフォルト属性と固定属性の両方がありました。

処置: デフォルト属性または固定属性のいずれかを削除してください。

XML-24109: デフォルト値"string"が属性使用方法"string"と競合します

原因: [src-attribute.2] デフォルトと使用方法の両方があり、使用方法の値がオプションではありません。

処置: デフォルトまたは使用方法の値のいずれかを削除してください。

XML-24110: 名前か参照属性が欠落しています

原因: [src-attribute.3.1] 名前および参照属性のどちらも宣言にありませんでした。

処置: 宣言に名前または参照を追加してください。

XML-24111: 名前と参照の両方が属性宣言に表示されています

原因: [src-attribute.3.1] 属性宣言に名前と参照属性の両方がありました。

処置: 宣言に名前または参照を追加してください。

XML-24112: 参照がフォーム、型または子simpleTypeと競合します

原因: [src-attribute.3.2] 属性は参照であり、フォーム、型または子simpleTypeが指定されました。

処置: 参照を名前に変更するか、フォーム、型、子のいずれかまたはすべてを削除してください。

XML-24113: 型属性が子simpleTypeと競合します

原因: [src-attribute.4] 型属性と子simpleTypeの両方がありました。

処置: 型参照または型定義を削除してください。

XML-24114: 属性ワイルドカードの共通部分は表示できません

原因: [src-attribute_group.2] 定義された複数の属性ワイルドカードは、1つのワイルドカードでは表現できません。

処置: 表示できない属性ワイルドカードを削除してください。

XML-24115: 循環属性グループ参照"string"

原因: [src-attribute_group.3] 属性グループが再定義以外で循環参照されました。

処置: 循環参照を削除してください。

XML-24116: 循環グループ参照"string"

原因: グループが再定義以外で循環参照されました。

処置: 循環参照を削除してください。

XML-24117: complexContentのベース型"string"は複合型ではありません

原因: [src-ct.1] 単純型から複合コンテンツがあるcomplexTypeが導出されました。

処置: ベース型を複合型に変更してください。

XML-24118: ベース型"string"には単純コンテンツが必要です

原因: [src-ct.2] 単純コンテンツを持つcomplexTypeが、複合コンテンツを持つcomplexTypeから導出されました。

処置: ベース型を単純型(派生が拡張である場合)、またはsimpleContent複合型に変更してください。

XML-24119: 要素参照"string"を含むプロパティが指定されました

原因: [src-element.2.2] 要素参照にcomplexType、simpleType、key、keyref、uniqueの子またはnillable、form、default、blockまたはtype属性も含まれていました。

処置: 競合する属性または子を削除してください。

XML-24120: simpleTypeとcomplexTypeの両方を要素宣言"string"に含めることはできません

原因: [src-element.3] 要素宣言にcomplexTypeおよびsimpleTypeの両方の子がありました。

処置: simpleTypeまたはcomplexTypeのいずれかの子を削除してください。

XML-24121: インポートされたネームスペース"string"は、ネームスペース"string"と異なる必要があります

原因: [src-import.1.1] インポートの名前空間はインポート元スキーマのターゲットの名前空間と同じでした。

処置: インポートを包含に変更してください。

XML-24122: ターゲットのネームスペース"string"が必要です

原因: [src-import.1.2] インポートされた名前空間が指定されましたが、インポートされたスキーマにありませんでした。

処置: 要素インポートの名前空間属性を削除するか、インポートされたスキーマにターゲットの名前空間を追加してください。

XML-24123: ネームスペース"string"が予想されるtargetNamespace "string"と異なります

原因: [src-import.3.1] 指定された名前空間はインポートされた実際のtargetNamespaceとは異なりました。

処置: インポート要素の名前空間属性を修正してください。

XML-24124: targetNamespace "string"はスキーマには必要ありません

原因: [src-import.3.2] 非名前空間スキーマが指定されましたが、実際のスキーマにはtargetNamespaceがありました。

処置: インポートされたスキーマのtargetNamespace属性を削除してください。

XML-24125: "string"からスキーマを含めることができません

原因: [src-include.1] プロセッサが指定された場所からスキーマを含めることができませんでした。

処置: URLおよびURLリゾルバが正しいことを確認してください。

XML-24126: 含まれているtargetNamespace "string"は"string"と同じである必要があります

原因: [src-include.2.1] 異なるtargetNamespaceでスキーマを含めようとしました。

処置: 含めるかわりにインポートを使用してください。

XML-24127: 非ネームスペーススキーマには、ターゲットの名前空間"string"のスキーマを含めることはできません

原因: [src-include.2.2] targetNamespaceがないスキーマでtargetNamespaceがあるスキーマを含めようとしました。

処置: 含めるかわりにインポートを使用してください。

XML-24128: itemType属性が子simpleTypeと競合します

原因: [src-list-itemType-or-simpleType] リストの単純型宣言にitemType属性と子simpleTypeの両方がありました。

処置: itemType属性または子simpleTypeのいずれかを削除してください。

XML-24129: QName "string"の接頭辞を解決できません

原因: [src-qname] Qnameの接頭辞がありますが、有効範囲内のどの名前空間にマップされませんでした。

処置: 接頭辞に対応する名前空間を宣言してください。

XML-24130: 再定義済のスキーマのネームスペースが異なります。行string、列string

原因: 再定義先スキーマのtargetNamespaceが再定義元スキーマのtargetNamespaceと同じではありませんでした。

処置: 再定義先スキーマのtargetNamespaceを修正してください。

コメント: src-redefine.3.1

XML-24131: 非ネームスペーススキーマは、ターゲット・ネームスペースのないスキーマのみ再定義できます

原因: [src-redefine.3.2] 非名前空間スキーマで名前空間があるスキーマを再定義しようとしました。

処置: 再定義先スキーマからtargetNamespace属性を削除してください。

XML-24132: 型派生"string"は制限である必要があります

原因: [src-redefine.5] simpleTypeまたはcomplexTypeが再定義にありましたが、派生は制限ではありませんでした。

処置: 型の再定義を変更し、制限にしてください。

XML-24132: 行string、列stringで、型"string"がそれ自身を再定義する必要があります

原因: [src-redefine.5] simpleTypeまたはcomplexTypeが再定義にありましたが、ベース型はそれ自身ではありませんでした。

処置: ベース型自身を再定義するように、ベース型を変更してください。

XML-24133: 再定義では、グループ"string"に自己参照を1つのみ含めることができます

原因: [src-redefine.6.1.1] 再定義にグループが1つ存在しますが、そのコンテンツにはそのグループへの自己参照が複数含まれています。

処置: グループ再定義の余分な自己参照を削除してください。

XML-24134: グループ"string"の自己参照には、minOccursやmaxOccursを含めないでください

原因: [src-redefine.6.1.2] 再定義でグループ自己参照に1以外の値を持つminOccursまたはmaxOccursが指定されました。

処置: minOccursまたはmaxOccurs属性を削除してください。

XML-24135: 再定義済のグループ"string"は元のグループの制限ではありません

原因: [src-redefine.6.2.2] 再定義にあるグループは、自己参照はありませんが、元のグループの有効な制限ではありませんでした。

処置: グループのコンテンツを変更し、元のグループの有効な制限にしてください。

XML-24236: 属性グループ"string"の再定義には、自己参照を1つのみ含めることができます

原因: [src-redefine.7.1] 再定義にattributeGroupがあり、そのコンテンツに複数の自己参照がありました。

処置: 余分な自己参照を削除してください。

XML-24136: 再定義済の属性グループ"string"は、元のグループの制限である必要があります

原因: [src-redefine.7.2.2] 再定義にあるattributeGroupは自己参照を持ちませんが、元のグループの有効な制限ではありませんでした。

処置: 属性グループのコンテンツを変更し、元のグループの有効な制限にしてください。

XML-24137: 制限にベースと子simpleTypeの両方を含めないでください

原因:[src-restriction-base-or-simpleType]

XML-24138: 単純型制限には、ベース属性か子simpleTypeのいずれかが必要です

原因: [src-simple-type.2] 単純型制限にベース属性および子simpleTypeのどちらもありませんでした。

処置: ベース属性または子simpleTypeのいずれかを追加してください。

XML-24139: itemTypeや子simpleTypeのどちらもリストに存在しません

原因: [src-simple-type.3] リスト定義にitemType属性または子simpleTypeが欠落しています。

処置: itemTypeまたは子simpleTypeのいずれかを追加してください。

XML-24140: itemTypeとsimpleTypeの子を両方ともリスト型に含めることはできません。

原因: [src-simple-type.3] リスト定義にitemType属性および子simpleTypeの両方がありました。

処置: itemTypeまたは子simpleTypeのいずれかを削除してください。

XML-24141: 循環共用体型は禁止されています

原因: [src-simple-type.4] 共用体型の一部のメンバー型が、その共用体型を参照していました。

処置: 循環参照を削除してください。

XML-24142: ファセット"string"は複数回指定できません

原因: [src-single-facet-value] 列挙およびパターン以外の同じファセットが複数回指定されましたが、これは許可されていません。

処置: 余分なファセットを削除してください。

XML-24143: UNIONには、memberTypesと子simpleTypeのいずれかが必要です

原因: [src-union-memberTypes-or-simpleTypes] 共用体型のmemberTypesおよびsimpleTypeが両方とも欠落していました。

処置: memberTypesを指定するか、子simpleTypeを追加してください。

XML-24144: ファセットは制限にのみ使用できます

原因: [st-restrict-facets] 派生は制限ではありませんが、ファセットの子がありました。

処置: ファセットの子を削除してください。

スキーマ・コンポーネント制約のエラー・メッセージ

XML-24200からXML-24399の範囲のエラー・メッセージは次のとおりです。

XML-24201: 属性"string"の宣言が重複しています

原因: [ag-props-correct.1] 属性グループ定義に同じ名前空間と名前を持つ複数の属性宣言がありました。

処置: 重複した属性宣言を削除してください。

XML-24202: ID型の属性を複数使用できません

原因: [ag-props-correct.2] ID型の複数の属性宣言がありました。

処置: このような属性宣言は、他の型に変更してください。

XML-24203: 値制約"string"が無効です

原因: [a-props-correct.2] 固定値またはデフォルト値は属性の型に適合しませんでした。

処置: 固定値の有効なデフォルト型を使用してください。

XML-24204: 値制約"string"は、ID型に使用できません

原因: [a-props-correct.3] ID型の属性には固定値またはデフォルト値の制約がありました。

処置: 値制約を削除してください。

XML-24205: 属性宣言で固定値"string"が"string"と一致しません

原因: [au-props-correct.2] 属性参照で、参照先宣言の値と異なる固定値が指定されました。

処置: 固定値を属性宣言に指定されたものと同じ値に修正してください。

XML-24206: 値制約を修正し、属性宣言に含まれるものと一致させる必要があります

原因: [au-props-correct.2] 属性参照でデフォルト値が指定されましたが、参照先宣言には固定値が設定されていました。

処置: 属性参照からデフォルト値を削除してください。

XML-24207: xPath式"string"が無効です

原因: [c-fields-xpaths.1] XPathの値は、XPath 1.0で指定された有効なXPath式ではありませんでした。

処置: 正しいXPathを使用してください。

XML-24208: フィールドxPath "string"が無効です

原因: [c-fields-xpaths.2] XPathの値はフィールドの制限されたXPath構文に適合しませんでした。

処置: XPath式を修正してください。

XML-24209: 全グループの要素"string"のmaxOccursは、0か1である必要があります

原因: [cos-all-limited] 全グループの一部の要素に1より大きいmaxOccursがありました。

XML-24210: グループはすべてコンテンツ・タイプを形成する必要があります。

原因: 全グループは別のモデル・グループに含まれていました。

処置: 全グループをコンテンツ・タイプの最上位にしてください。

コメント: cos-all-limited

XML-24211: グループはすべてコンテンツ・タイプを形成する必要があります。

原因: 全グループは別のモデル・グループに含まれていました。

処置: 全グループをコンテンツ・タイプの最上位にしてください。

XML-24212: 型"string"では、ファセット"string"は使用できません

原因: [cos-applicable-facets] 単純型に適用できないファセットが使用されました。

処置: ファセットを削除してください。

XML-24213: ワイルドカードの共通部分は表示できません

原因: [cos-aw-intersect] 属性グループの2つのワイルドカードに異なる負の名前空間がありました。

処置: 負の名前空間があるワイルドカードを1つのみ使用してください。

XML-24214: ベース型では"string"の派生は使用できません

原因: [cos-ct-derived-ok.1] ベース型のfinalで派生を使用できませんでした。

処置: ベース型のfinalの値から派生メソッドを削除してください。

XML-24215: 複合型"string"は、型"string"の派生ではありません

原因: [cos-ct-derived-ok.2] ベース型から派生型への派生の連鎖がありませんでした。

処置: 派生の連鎖を修正してください。

XML-24216: 拡張されたコンテンツ・タイプにパーティクルを指定する必要があります

原因: [cos-ct-extends.1.4.2.1] 複合型の拡張のコンテンツ・タイプは空でした。

処置: 拡張のコンテンツ・タイプにパーティクルを追加してください。

XML-24217: コンテンツ・タイプ"string"は、ベース型のコンテンツ・タイプ"string"と競合します

原因: [cos-ct-extends.1.4.2.2.2] ベース型のコンテンツ・タイプは空ではなく、指定されたコンテンツ・タイプと同じではありませんでした。

処置: 指定されたコンテンツ・タイプをベース型のものに一致させてください。

XML-24218: ローカル要素宣言"string"が矛盾しています

原因: コンテンツの複数の要素に同じ名前と名前空間がありますが、同じ型を参照しませんでした。

処置: 名前と名前空間が等しいすべての要素の型参照を同じにしてください。

コメント: cos-element-consistent

XML-24219: 要素"string"は、要素"string"の有効な代替ではありません

原因:[cos-equiv-derived-ok-rec]

XML-24220: itemType "string"はリストにできません

原因: [cos-list-of-atomic] リスト型のitemTypeはそれ自体がリストでした。

処置: リストのitemTypeとしてアトミック型または共用体型を使用してください。

XML-24221: 循環共用体"string"は使用できません

原因: [cos-no-circular-union] 共用型の名前と名前空間がそのmemberTypeの1つに一致しました。

処置: すべての循環参照を削除してください。

XML-24222: パーティクル"string"が未確定です

原因: [cos-nanambig] コンテンツ・タイプのパーティクルがUnique Particle Attrition(UPA)制約に違反しました。

処置: コンテンツ・タイプのパーティクルを確定してください。

XML-24223: パーティクル拡張子が無効です

原因:[cos-particle-extend]

XML-24224: パーティクル制限が無効です

原因:[cos-particle-extend]

XML-24225: 単純型"string"では制限は使用できません

原因: [cos-st-derived-ok] 派生は制限ですが、制限はベース型のfinalにありました。

処置: ベース型のfinalから制限を削除してください。

XML-24226: ベース型"string"からの派生が無効です

原因: [cos-st-derived-ok] 派生は「type derivaton OK (simple)」制約に違反しました。

処置: 派生を制約に適合させてください。

XML-24227: 基本型ではリスト"string"を制限できません

原因: [cos-st-restricts.1.1] ベース型はリストです。

XML-24228: 制限ではベース型はur-typeにできません

原因: [cos-st-restricts.1.1] anySimipleTypeを直接制限しようとしました。

XML-24229: リストのベース型は、リストまたはur-typeである必要があります

原因: [cos-st-restricts.2.3]

XML-24230: UNIONのベース型は、UNIONまたはur-typeである必要があります

原因: [cos-st-restricts.3.3]

XML-24231: 要素のデフォルト"string"は、混合コンテンツを空にできる必要があります

原因: [cos-valide-default] 要素にデフォルト制約がありますが、混合コンテンツ・タイプは空にできませんでした。

処置: デフォルト値制約を削除してください。

XML-24232: 要素のデフォルト"string"には、混合コンテンツまたは単純コンテンツが必要です

原因: [cos-valide-default] 要素にデフォルト値制約がありますが、コンテンツ・タイプは要素のみであるか空でした。

処置: デフォルト値制約を削除してください。

XML-24233: 要素のデフォルト"string"は、コンテンツ・タイプに対して有効である必要があります

原因: [cos-valide-default] 要素のデフォルト値制約はその型に対して無効でした。

処置: デフォルト値を修正するか削除してください。

XML-24234: キー参照"string"のフィールド・カーディナリティが不正です

原因: [c-props-correct] キー参照と参照先キーとの間でフィールドの数が異なっていました。

処置: キー参照と参照先キーのフィールド数が同じになるようにしてください。

XML-24235: 複合型は、単純型"string"のみ拡張できます

原因: [ct-props-correct] 複合型は単純型から導出されましたが、派生は拡張ではありませんでした。

処置: 制限を拡張に変更してください。

XML-24236: 循環型定義"string"

原因: [ct-props-correct] 型がそれ自身の派生連鎖内にありました。

処置: 再帰的派生を削除してください。

XML-24237: ベース型"string"は複合型である必要があります

原因: [derivation-ok-restriction.1] 複合型は単純型から制限されていました。

処置: 複合型からの制限を変更してください。

XML-24238: 属性"string"はベース型では使用できません

原因: [derivation-ok-restriction.2] ベース型に対して制限の属性が使用できませんでした。

処置: 属性使用の制限を修正してください。

XML-24239: 制限に必須属性"string"がありません

原因: [derivation-ok-restriction.3] 制限の属性使用は、ベース型の属性使用のサブセットではありませんでした。

処置: 属性使用の制限を修正してください。

XML-24240: ベース型"string"に対応する属性ワイルドカードがありません

原因: [derivation-ok-restriction.4] 制限には、ベース型の属性ワイルドカードに対応しない属性ワイルドカードがありました。

処置: 派生を修正してください。

XML-24241: ベース型"string"には、単純コンテンツまたは空にできるコンテンツを含める必要があります

原因: [derivation-ok-restriction.5.1] コンテンツ・タイプは単純ですが、ベース型には複合でないか空にできない複合コンテンツがあります。

処置: 単純から要素のみにコンテンツ・タイプを変更してください。

XML-24242: ベース型"string"には、空の内容または空にできるコンテンツ内容を含める必要があります

原因: [derivation-ok-restriction.5.2] コンテンツ・タイプは空ですが、ベース型には単純コンテンツか、空にできない複合コンテンツが含まれていました。

処置: 単純から要素のみにコンテンツ・タイプを変更してください。

XML-24243: NOTATIONには列挙型ファセットが必要です

原因: [enumeration-required-notation] NOTATION型は列挙型ファセットなしで使用されました。

処置: NOTATIONに対して列挙型ファセットを指定してください。

XML-24244: 列挙の値"string"が無効です

原因: [enumeration-valid-restriction] 列挙の値は型に対して無効でした。

処置: 無効な値を修正してください。

XML-24245: デフォルト値"string"は無効な要素型です

原因: [e-props-correct.2] デフォルト値は要素の型に対して無効でした。

処置: デフォルト値を修正してください。

XML-24246: substitutionGroup "string"が無効であり、型が無効です

原因: [e-props-correc.3] 要素の型は、要素のsubstitutionGroupの型からの有効な派生ではありませんでした。

処置: 型を修正するか、substitutionGroupを削除してください。

XML-24247: ID型には値制約"string"を使用できません

原因: [e-props-correct.4] 型はID型またはその派生ですが、値制約がありました。

処置: 値制約を削除してください。

XML-24248: fractionDigits "string"がtotalDigits "string"より大きい値です

原因: [fractionDigits-totalDigits] fractionDigitsの値が、totalDigitsより大きい値でした。

処置: fractionDigitsをtotalDigits以下にしてください。

XML-24249: 長さファセットは、minLengthやmaxLengthとともに指定できません

原因: [length-minLength-maxLength] 長さとminLengthまたはmaxLengthが指定されました。

処置: 長さファセットを削除してください。

XML-24250: 長さ"string"がベース型の長さと同じではありません

原因: [length-valid-restriction] 指定された長さがベース型の長さと同じではありませんでした。

処置: 長さファセットを削除してください。

XML-24251: maxExclusiveは元の値より大きい値です

原因: [maxExclusive-valid-restriction] 制限されたmaxExclusiveが、ベース型の元の値より大きい値でした。

XML-24252: minInclusiveはmaxExclusive以上の値です

原因: [maxInclusive-maxExclusive] maxExclusive以上のminInclusiveが指定されました。

処置: minInclusiveをmaxExclusiveより小さい値にしてください。

XML-24253: maxLengthがベース型より大きい値です

原因: [maxLength-valid-restriction] ベース型の元の値より大きいmaxLengthが指定されました。

処置: maxLengthに小さい値を指定し、有効な制限にしてください。

XML-24254: 循環グループ"string"は禁止されています

原因: [mg-props-correct] 循環モデル・グループの参照です。

処置: モデル・グループ定義の循環参照を削除してください。

XML-24256: minExclusiveはmaxExclusive以下である必要があります

原因: [minExclusive-less-than-equals-to-maxExclusive] minExclusiveがmaxExclusiveより大きい値でした。

処置: minExclusiveの値を小さくしてください。

XML-24257: minExclusive "string"は、maxInclusiveより小さい必要があります

原因: [minExclusive-less-than-maxInclusive] 指定されたinExclusiveはmaxInclusive以上の値でした。

処置: minExclusiveに小さい値を指定してください。

XML-24258: minExclusive "string"が無効です

原因: [minExclusive-valid-restriction] 制限のminExclusiveはベース型のminExclusiveより小さい値でした。

処置: minExclusiveに大きい値を指定してください。

XML-24259: minExclusive "string"が無効です

原因: [minExclusive-valid-restriction] 制限のminExclusiveはベース型のminInclusiveより小さい値でした。

処置: minExclusiveに大きい値を指定してください。

XML-24260: minExclusive "string"が無効です

原因: [minExclusive-valid-restriction] 制限のminExlcusiveはベース型のmaxInclusiveより大きい値でした。

処置: minExclusiveに小さい値を指定してください。

XML-24261: minExclusive "string"が無効です

原因: [minExclusive-valid-restriction] 制限のminExclusiveはベース型のmaxExclusive以上の値でした。

処置: minExclusiveに小さい値を指定してください。

XML-24262: minInclusive "string"は、maxInclusiveより大きくしないでください

原因: [minInclusive-less-than-equal-to-maxInclusive] maxInclusiveより大きいminInclusiveが指定されました。

処置: minInclusiveに小さい値を指定してください。

XML-24263: minInclusiveとminExclusiveの両方は指定できません

原因: [minInclusive-minExclusive] 制限にminInclusiveとminExclusiveの両方が指定されました。

処置: minInclusiveまたはminExclusiveのいずれかを削除してください。

XML-24264: minInclusive "string"が無効です

原因: [minInclusive-valid-restriction] 制限のminInclusiveはベース型のminInclusive以下の値でした。

処置: ベース型の値より大きいminInclusiveを使用してください。

XML-24265: minInclusive "string"が無効です

原因: [minInclusive-valid-restriction] 制限のminInclusiveはベース型のminExclusiveより小さい値でした。

処置: ベース型のminExclusive以上のminInclusiveを使用してください。

XML-24267: minInclusive "string"が無効です

原因: [minInclusive-valid-restriction] 制限のminInclusiveはベース型のmaxInclusiveより大きい値でした。

処置: ベース型のmaxInclusive以下のminInclusiveを使用してください。

XML-24268: minInclusive "string"が無効です

原因: 制限のminInclusiveはベース型のmaxEnclusive以上でした。

処置: ベース型のmaxEnclusiveより小さいminInclusiveを使用してください。

コメント: minInclusive-valid-restriction

XML-24269: minLength "string"が無効です

原因: [minLength-less-than-equal-to-maxLength] 制限のminLengthはベース型のmaxLengthより大きい値でした。

処置: minLengthをベース型の長さの範囲内にしてください。

XML-24270: minLength "string"が無効です

原因: [minLength-valid-restriction] minLengthの値は制限のベース型の値より小さい値でした。

処置: minLengthの値を大きくしてください。

XML-24271: xmlns属性を宣言できません

原因: [no-xmlns] xmlnsという名前の属性が宣言されました。

処置: そのような宣言を削除してください。

XML-24272: targetNamespaceにxsiがありません

原因: [no-xsi] スキーマのターゲットの名前空間がhttp://www.w3.org/2001/XMLSchema-instanceに一致しました。

処置: 他のターゲットの名前空間を使用してください。

XML-24272: minOccursはmaxOccursより大きい値です

原因: [n-props-correct] パーティクルのminOccursはmaxOccursより大きい値でした。

処置: minOccursの値を小さくしてください。

XML-24281: maxOccursは1以上である必要があります

原因: [ p-props-correct] パーティクルのmaxOccursは1より小さい値でした。

処置: minExclusiveの値を大きくしてください。

XML-24282: 表記法プロパティが正しくありません

原因: [n-props-correct] 表記法宣言のプロパティが正しくありませんでした。

処置: 表記法宣言を修正してください。

XML-24283: パーティクルの範囲が有効な制限ではありません

原因: [range-ok] 制限の範囲は親パーティクルの範囲内にありませんでした。

XML-24284: 順序グループは選択グループの有効な派生ではありません

原因: 制限は制約「Particle Derivation OK (Sequence:Choice -- MapAndSum)」に適合しませんでした。

コメント: rcase-MapAndSum

XML-24285: 要素"string"は、要素"string"の有効な制限ではありません

原因: [rcase-NameAndTypeOK] 制限は制約「Particle Restriction OK」に適合しませんでした。

XML-24286: 要素"string"は、ワイルドカードの有効な制限ではありません

原因: [rcase-NSCompat] 制限は制約「Particle Restriction OK」に適合しませんでした。

XML-24287: グループはワイルドカードの有効な制限ではありません

Cause: [rcase-NSRecurseCheckCardinality] 制限は制約「Particle Restriction OK」に適合しませんでした。

XML-24288: すべてグループ化は有効な制限ではありません

原因: [rcase-NSSubset] 制限は制約「Particle Restriction OK(Any:Any -- NSSubset)」に適合しませんでした。

XML-24289: すべてか順序グループの制限が無効です

原因: [rcase-Recurse] 制限は制約「Particle Restriction OK(All:All, Seqiemce"Sequence:-- Recurse)」に適合しませんでした。

XML-24290: ワイルドカードは有効な制限ではありません

原因: [rcase-RecurseLax] ワイルドカードは別のワイルドカードから有効に制限されていませんでした。

XML-24291: 順序は、すべてに対する有効な制限ではありません

原因: 制限は制約「Particle Derivation OK (Sequence:All--RecurseUnordered)」に違反しました。

処置: 制限を修正してください。

コメント: rcase-RecurseUnordered

XML-24292: コンポーネント定義"string"が重複しています

原因: [sch-props-correct] 名前と名前空間が同じ2つのスキーマ・コンポーネントがありました。

処置: 重複した定義を削除してください。

XML-24293: 単純型定義プロパティが正しくありません

原因: [st-props-correct]

XML-24294: ワイルドカードはスーパーのサブセットではありません

原因: [w-props-correct] 名前空間制約はスーパーの制限ではありませんでした。

処置: 名前空間制約を修正してください。

XML-24295: totalDigits "string"は、ベース型の"string"を超えています

原因: [totalDigits-valid-restriction] 制限には、ベース型の値より大きい値のtotalDigitsが指定されました。

処置: totalDigitsの値を小さくしてください。

XML-24296: whiteSpace "string"は、ベース型の"string"を制限できません

原因: [whiteSpace-valid-restriction] 制限のwhiteSpaceがreplaceまたはpreserveで、ベースにはwhiteSpace collapseが指定されているか、制限にreplaceが指定され、ベースにはpreserveが指定されています。

処置: 競合するwhiteSpaceの値を削除してください。

XML-24297: 循環置換グループ"string"

原因: 置換グループが循環していました。

処置: 循環置換グループを削除してください。

XSQLサーバー・ページのエラー・メッセージ

XML-25000からXML-25999の範囲のエラー・メッセージは次のとおりです。

XML-25001: リクエストされたXSQLファイルが見つかりません。名前を確認してください。

XML-25002: プールからデータベース接続を取得できません: string

XML-25003: CLASSPATHで、構成ファイル''string''の検索に失敗しました。

XML-25004: データベース接続名を取得できませんでした: string

XML-25005: XSQLページは、整形式ではありません。

XML-25006: XSLTスタイルシートは、整形式ではありません: string

XML-25007: ページを処理するためのデータベース接続を取得できません。

XML-25008: XSLTスタイルシートが見つかりません: string

XML-25009: コマンドラインで欠落している引数

XML-25010: 作成中のエラー: string 標準出力を使用しています。

XML-25011: XSLTスタイルシートを処理中にエラーが発生: string

XML-25012: XSQLページを読み取れません

XML-25013: XSQLページのURIがNULLです。ファイル名の大文字/小文字が正確であるか確認してください。

XML-25014: 結果ページが空のドキュメントであるかまたは複数のドキュメント要素がありました。

XML-25015: XML文書の挿入中にエラーが発生

XML-25016: ポストしたXML文書の解析中にエラーが発生

XML-25017: 予期しないエラーが発生しました

XML-25018: スタイルシートstringの処理中に予期しないエラーが発生しました

XML-25019: スタイルシートstringの読取り中に予期しないエラーが発生しました

XML-25020: 構成ファイル''string''は、整形式ではありません。

XML-25021: シリアライザstringがXSQL構成ファイルに定義されていません

XML-25022: シリアライザ・クラスstringをロードできません

XML-25023: クラスstringは、XSQLシリアライザではありません

XML-25024: OutputStreamの取得後にレスポンスWriterを取得しようとしました

XML-25025: Writerの取得後にレスポンスOutputStreamを取得しようとしました

XML-25026: スタイルシートのURLは、信頼されないサーバーを指しています。

XML-25027: 組込みxsql:stringアクションに対するstringクラスのロードに失敗しました。

XML-25028: stringの読取り中にエラーが発生しました。名前の大文字/小文字を確認してください。

XML-25029: エラー・ハンドラのクラスstringをロードできません

XML-25030: クラスstringは、XSQL ErrorHandlerではありません

XML-25100: ''string''属性を指定してください。

XML-25101: スタイルシート・プール内の致命的なエラー

XML-25102: クラス''string''のインスタンス化中にエラーが発生

XML-25103: クラス''string''はロードできません

XML-25104: クラス''string''は、XSQLActionHandlerではありません

XML-25105: PL/SQLエージェントから戻されたXMLは、整形式ではありません

XML-25106: 無効なURL''string''

XML-25107: URL ''string''のロード中にエラーが発生

XML-25108: XML文書''string''は、整形式ではありません

XML-25109: データベースから戻されたXML文書は、整形式ではありません

XML-25110: パラメータ''string''のXML文書は、整形式ではありません

XML-25111: ''string''を含む問題

XML-25112: パラメータ値の読取り中にエラーが発生

XML-25113: XSL変換''string''のロード中にエラーが発生

XML-25114: パラメータ''string''には、NULL値があります

XML-25115: 処理対象の文書がポストされていません

XML-25116: 問合せの文が指定されていません

XML-25117: PL/SQL関数名が指定されていません

XML-25118: スタイルシートのURLは、信頼されないサーバーを指しています。

XML-25119: ''string''属性または''string''属性のいずれかを指定してください。

XML-25120: 選択した値は、想定されるstring値よりも少ない値です。

XML-25121: 複数のパラメータの設定に'xpath'は使用できません。

XML-25122: 複数のパラメータを設定するには、問合せを指定する必要があります

XML-25123: stringの読取り中にエラーが発生しました。名前の大文字/小文字を確認してください。

XML-25124: 他のエラー情報を出力中にエラーが発生しました。

XML-25125: (string)属性は、1つのみ指定できます。

XML-25126: いずれかの(string)属性を指定する必要があります

XMLパイプラインのエラー・メッセージ

XML-30000からXML-30999の範囲のエラー・メッセージは次のとおりです。

XML-30000: ''string''でエラーが無視されました: ''string''

原因: プロセス実行中に発生したエラーが無視されています。

処置: 処置は必要ありません。

XML-30001: プロセスの実行中にエラーが発生しました

原因: パイプライン・プロセスでラップされたコンポーネントのためにエラーが発生しました。

処置: 入力したXMLコンテンツの修正が必要なことがあります。

XML-30002: XMLの型''string''のみ使用できます。

コメント: 通常は発生しません。

XML-30003: 出力''string''の作成/書込み中にエラーが発生しました

原因: 指定された出力URLは無効である可能性があります。

XML-30004: 基本URL''string''の作成中にエラーが発生しました

原因: 基本URLに指定されたURLが無効でした。

処置: 指定された基本URLを修正してください。

XML-30005: 入力''string''の読取り中にエラーが発生しました

原因: 指定された入力URLは無効である可能性があります。

XML-30006: パイプ文書のエラー要素の処理中にエラーが発生しました

XML-30007: 依存プロセスで必要とされる出力のXML型への変換中にエラーが発生しました

XML-30008: 有効なパラメータ・ターゲットが必要です

原因: targetという名前のパラメータが欠落しているか無効です。

処置: ターゲット出力ラベルを指すパラメータtargetを追加してください。

XML-30009: 入力へのパイプ出力中にエラーが発生しました

XML-30010: プロセス定義要素''string''を定義する必要があります

原因: 要素procdefがありません。

処置: pipedocにプロセス定義を追加してください。

XML-30011: ContentHandlerは使用できません

原因: 依存プロセスに有効なContentHandlerが指定されていません。

処置: プロセスにgetContentHandler APIを実装してください。

XML-30012: パイプライン・コンポーネントは互換性がありません

原因: document/docfragに関してコンポーネント出力と入力が一致しませんでした。

処置: pipedocを修正し、互換性のあるコンポーネントを使用してください。

XML-30013: 出力ラベル''string''のプロセスが見つかりません

原因: 出力ラベルがターゲット・ラベルに一致したプロセスが使用できません。

処置: 出力ラベルがターゲット・パラメータのラベルに一致したプロセスをpipedocに作成してください。

XML-30014: パイプラインは未完了です。''string''と呼ばれる出力/外部パラメータ・ラベルが欠落しています

原因: 依存プロセスの出力ラベル名が正しくないか、依存プロセスが欠落しています。

処置: すべての依存入力に対応する出力があることを確認してください。

XML-30016: クラスをインスタンス化できません

原因: プロセスに関連付けられたプロセス定義要素にエラーがあったため、プロセスは作成できませんでした。

処置: プロセス定義のクラスを正しく指定してください。

XML-30017: ターゲットは最新のものであり、パイプラインは実行されません

原因: ターゲットが存在しないか、パイプライン入力がターゲットより新しいかのいずれかです。

処置: FORCEオプションを使用して、ターゲットが最新かどうかに関係なくパイプラインを実行してください。

Java API for XML Binding(JAXB)のエラー・メッセージ

XML-32000からXML-32999の範囲のエラー・メッセージは次のとおりです。

XML-32202: 複数の<schemaBindings>が定義されているため、問題が発生しました。

原因: <schema>要素の注釈要素に<schemaBindings>宣言の複数のインスタンスがありました。

処置: 注釈を更新し、重複した<schemaBinding>宣言を削除してください。

XML-32203: ノード"string"で複数の<typesafeEnumClass>の注釈が定義されているため、問題が発生しました。

原因: ノードの注釈要素に<class>宣言の複数のインスタンスがありました。

処置: 注釈を更新し、重複した<class>宣言を削除してください。

XML-32204: <class>宣言の"name"に許可されていないパッケージ名接頭辞"string"が含まれているため、問題が発生しました。

原因: <class>宣言の名前属性にパッケージ接頭辞があったため、障害が発生しました。

処置: <class>宣言のclassNameを更新してください。

コメント: パッケージ接頭辞はパッケージの現行値から継承されます。

XML-32205: ノード"string"でプロパティのカスタマイズが正しく指定されていないため、問題が発生しました。

原因: プロパティのカスタマイズは正しく指定されていないため、障害が発生しました。

処置: <property>のカスタマイズを更新してください。

XML-32206: ノード"string"で"javaType"のカスタマイズが正しく指定されていないため、問題が発生しました。

原因: プロパティのカスタマイズが正しく指定されていないため、障害が発生しました。

処置: <javaType>のカスタマイズを更新してください。

XML-32207: ノード"string"で"baseType"のカスタマイズの宣言時に問題が発生しました。

原因: baseTypeのカスタマイズが正しく指定されていないため、障害が発生しました。

処置: <baseType>のカスタマイズを更新してください。

XML-32208: ノード"string"で複数の"baseType"のカスタマイズが宣言されているため、問題が発生しました。

原因: 複数のbaseTypeのカスタマイズが宣言されたため、障害が発生しました。

処置: <baseType>のカスタマイズ宣言の1つを削除してください。

XML-32209: ノード"string"で複数の"javaType"のカスタマイズが宣言されているため、問題が発生しました。

原因: 複数のjavaTypeのカスタマイズが宣言されたため、障害が発生しました。

処置: <javaType>のカスタマイズ宣言の1つを削除してください。

XML-32210: "string"のカスタマイズで無効な値が指定されたため、問題が発生しました。

原因: globalBindingsのカスタマイズ宣言に無効な値が指定されていたため、障害が発生しました。

処置: globalBindingsのカスタマイズ値を確認し、修正してください。

XML-32211: 正しい<schemaBindings>のカスタマイズが指定されていないため、問題が発生しました。

原因: schemaBindingsのカスタマイズに無効な値が指定されていたため、障害が発生しました。

処置: schemaBindingsのカスタマイズ値を確認し、修正してください。

XML-32212: <class>のカスタマイズは、implClass宣言を使用した実装クラスの指定をサポートしていません。ノードstringで指定されたimplClass宣言は無視されました。

原因: implClassのカスタマイズ宣言がサポートされていないため、警告が発生しました。

XML-32213: <globalBindings>のカスタマイズは、java.util.Listを実装するユーザー固有クラスの指定をサポートしていません。collectionType宣言は無視されました。

原因: java.util.Listのユーザー指定の実装クラスがサポートされていないため、警告が発生しました。

B Oracle XDK for Java TXUエラー・メッセージ

この付録では、TXUインタフェースの実行中にOracle XDK for Javaを使用するアプリケーションで発生する可能性のあるエラー・メッセージを示します。

- 一般的なTXUエラー・メッセージ

- DLFエラー・メッセージ

- TransX情報メッセージ

- TransXエラー・メッセージ

- アサーション・メッセージ

- 使用方法の説明メッセージ

関連項目:
XQueryエラー・メッセージについては、http://www.w3.org/TR/xquery/#id-errorsを参照してください。

一般的なTXUエラー・メッセージ

TXU-0001からTXU-0099の範囲のエラー・メッセージは次のとおりです。

TXU-0001: 致命的なエラー

TXU-0002: エラー

TXU-0003: 警告

DLFエラー・メッセージ

TXU-0100からTXU-0199の範囲のエラー・メッセージは次のとおりです。

TXU-0100: 問合せ''string''にパラメータ''string''が見つかりません。

原因: 問合せにパラメータのプレースホルダがありません。

処置: 関連問合せの関連プレースホルダとしてIDを見つけることができるパラメータを指定してください。

TXU-0101: 非互換の属性''col''および''constant''が問合せ''string''の''string''で共存しています。

原因: 属性colおよびconstantは共存できません。

処置: colまたはconstant属性のいずれかを削除してください。

TXU-0102: ノード''string''が見つかりません。

原因: 文書に予期されているノードがありません。

処置: 欠落しているノードを指定してください。

TXU-0103: 要素''string''にコンテンツがありません。

原因: 要素にデータがありません。

処置: コンテンツを指定してください。

TXU-0104: SQL''string''を持つ要素''string''に''col''または''constant''属性がありません。

原因: 要素に必須属性colまたはconstantがありません。

処置: colまたはconstant属性を指定してください。

TXU-0105: SQL''string''の処理中にSQL例外''string''が発生しました。

原因: SQL実行中にエラーが発生しました。

処置: SQL文のエラーを解決してください。

TXU-0106: SQL''string''で選択された列''string''にデータがありません。

原因: SQL問合せがデータを戻しませんでした。

処置: データを指定するか、問合せを変更してください。

TXU-0107: データ型''string''はサポートされていません。

原因: サポートされていないデータ型を処理しようとしました。

処置: データ型をサポートされているデータ型に変更してください。

TXU-0108: 列''string''のMAXSIZE属性が欠落しています。

原因: サイズ単位属性が指定されましたが、MAXSIZEは指定されていません。

処置: MAXSIZE属性も指定してください。

TXU-0109: ''string''に対するstringのテキスト長がstringの最大長を超えています。

原因: テキスト・データの長さが長すぎます。

処置: 制限に合せてデータを短くするか、MAXSIZE属性を大きくしてデータベース列を十分な大きさにしてください。

TXU-0110: 行stringの列''string''が宣言されていません。

原因: データ・セクションの列が列セクションに宣言されていません。

処置: 列名を宣言された名前に変更してください。

TXU-0111: 行stringの''string''に列データがありません。

原因: 列は宣言されましたが、データは欠落しています。

処置: 名前属性が列名に一致するcol要素を指定してください。

TXU-0112: 列''string''の問合せパラメータ''string''が宣言されていません。

原因: 問合せパラメータで宣言されていない列を参照しています。

処置: 宣言された列を指定してください。

TXU-0113: 列\'\'string\'\'の問合せの属性\'\'string\'\'は非互換です。

原因: 問合せの列に指定された属性は使用できません。

処置: 属性または問合せのいずれかを削除してください。

TXU-0114: ''string''の行string、文字stringでDLF解析エラー(string)が発生しました。

原因: 報告されたように、形式にエラーがあります。

処置: 誤った部分を修正してください。

TXU-0115: 指定されたデータ文字列''string''の形式が無効です。

原因: 指定された日付文字列は指定された形式文字列に一致しません。

処置: 日付文字列が正しい日付形式であることを確認してください。

TransX情報メッセージ

TXU-0200からTXU-0299の範囲のエラー・メッセージは次のとおりです。

TXU-0200: ''string''で行が重複しています。

原因: データベースに重複した行があります。

処置: このメッセージはDuplicateRowExceptionで出力され、すでにデータベースに格納されている1つ以上の重複行があることをアプリケーションに通知します。

TransXエラー・メッセージ

TXU-0300からTXU-0399の範囲のエラー・メッセージは次のとおりです。

TXU-0300: ドキュメント''string''が見つかりません。

原因: 文書が見つかりませんでした。

処置: 文書の場所を変更するか、その場所に文書を用意してください。

TXU-0301: ファイル''string''を読み込めません。

原因: ファイルの読取り中にI/Oエラーが発生しました。

処置: I/Oの問題を解決してください。

TXU-0302: アーカイブ''string''が見つかりません。

原因: アーカイブ・ファイルが見つかりませんでした。

処置: CLASSPATHにTransXが正しく1回のみ指定されていることを確認してください。

TXU-0303: スキーマ''string''が''string''に見つかりません。

原因: DLFのスキーマ定義が見つかりませんでした。

処置: TransXアーカイブの破損していないコピーを入手してください。

TXU-0304: ''string''のアーカイブ・パスが見つかりません。

原因: アーカイブのパスを確認できませんでした。

処置: CLASSPATHにTransXが正しく1回のみ指定されていることを確認してください。

TXU-0305: ''string''をコールするstringにデータベース接続がありません。

原因: データベースに接続せずに操作が試行されました。

処置: 最初に接続をオープンしてください。

TXU-0306: 指定した表名がNULLです。; アクセスが拒否されました。

原因: テーブル名が指定されていません。

処置: テーブル名を指定してください。

TXU-0307: 参照キーが''string''を判別できませんでした。

原因: データ・ディクショナリが破損しています。

処置: データ・ディクショナリをリストアしてください。

TXU-0308: バイナリ・ファイル''string''が見つかりません。

原因: ファイル名が無効です。

処置: 適切なファイル名を指定してください。

TXU-0309: stringのファイル・サイズが最大値2,000バイトを超えています。

原因: ファイルが長すぎます。

処置: ファイル・サイズを減らしてください。

アサーション・メッセージ

TXU-0400からTXU-0499の範囲のエラー・メッセージは次のとおりです。

TXU-0400: ''string''のSQL文要素が欠落してます。

原因: 内部アサーションが失敗しました。

処置: Oracleカスタマ・サポートに連絡してください。

TXU-0401: ノード''string''が欠落しています。

原因: 内部アサーションが失敗しました。

処置: Oracleカスタマ・サポートに連絡してください。

TXU-0402: フラグ''string''が無効です。

原因: 内部アサーションが失敗しました。

処置: Oracleカスタマ・サポートに連絡してください。

TXU-0403: 内部エラー''string''

原因: 内部アサーションが失敗しました。

処置: Oracleカスタマ・サポートに連絡してください。

TXU-0404: 予期しない例外''string''

原因: 内部アサーションが失敗しました。

処置: Oracleカスタマ・サポートに連絡してください。

使用方法の説明メッセージ

TXU-0500からTXU-0599の範囲のエラー・メッセージは次のとおりです。

TXU-0500: XMLデータ変換ユーティリティ

TXU-0501: パラメータ

TXU-0502: JDBC接続文字列

TXU-0503: @記号を使用すると接続文字列情報を省略できます。

TXU-0504: "jdbc:oracle:thin:@"を指定します。

TXU-0505: データベース・ユーザー名

TXU-0506: データベース・パスワード

TXU-0507: データファイル名またはURL

TXU-0508: オプション:

TXU-0509: 既存行の更新

TXU-0510: 行がすでに存在する場合に例外が発生します。

TXU-0511: 事前定義済形式でデータを出力します。

TXU-0512: 事前定義済形式でデータを保存します。

TXU-0513: ロードするXMLを出力します。

TXU-0514: 更新するツリーを出力します。

TXU-0515: 検証を省略します。

TXU-0516: データ形式を検証し、ロードせずに終了します。

TXU-0517: 空白を保存します。

TXU-0518: 例:

C Oracle XDK for Java XSUエラー・メッセージ

この付録では、XSUインタフェースの実行中にOracle XDK for Javaを使用するアプリケーションで発生する可能性のあるエラー・メッセージを示します。

- エラー・メッセージのキーワードと構文

- 一般的なエラー・メッセージ

- 問合せエラー・メッセージ

- DMLエラー・メッセージ

- エラー・メッセージの項目

関連項目:
XQueryエラー・メッセージについては、http://www.w3.org/TR/xquery/#id-errorsを参照してください。

エラー・メッセージのキーワードと構文

XSUK-0001からXSUK-0099の範囲のエラー・メッセージは次のとおりです。

XSUK-0001: ドキュメント

XSUK-0002: 行セット

XSUK-0003: ROW

XSUK-0004: エラー

XSUK-0005: 番号

XSUK-0006: アイテム

一般的なエラー・メッセージ

XSUE-0000からXSUE-0099の範囲のエラー・メッセージは次のとおりです。

XSUE-0000: 内部エラー -- 例外''string''が見つかりました。

XSUE-0001: 内部エラー -- ''string''。

XSUE-0002: stringはスカラー列ではありません。行ID属性は、スカラー列からのみ値を取得できます。

XSUE-0003: ''string''は無効な列名です。

XSUE-0004: このオブジェクトはクローズしています。コール間でオブジェクトが暗黙的クローズ不可にするには、stringメソッドを参照します。

XSUE-0005: 行セットを囲むタグと行を囲むタグがどちらも省略されています。したがって、結果は最大で1行です。結果の行にはXML属性としてマークされない1列のみが含まれます。

XSUE-0006: 行セットを囲むタグと行を囲むタグがどちらも省略されています。整形式のXML文書を取得するために、結果は、複数の列を含む1行またはXML属性としてマークされない列を1つのみ含む複数の行で構成できます。

XSUE-0007: SQL名の解析に失敗 -- 無効な引数です。

XSUE-0008: 文字''string''はXMLタグ名に使用できません。

XSUE-0009: このメソッドはstringクラスによるサポートをしていません。stringクラスを使用してください。

XSUE-0010: バインド名の数とバインド値の数が等しくありません。

XSUE-0011: バインド値の数とSQL文のバインドの数が一致しません。

XSUE-0012: バインド名の識別子''string''はSQLの問合せに存在しません。

XSUE-0013: バインド識別子は0(ゼロ)ではなく、長さが必要です。

XSUE-0014: 指定されたルート・ノードはNULLです。

XSUE-0015: 無効なLOBロケータが指定されました。

XSUE-0016: ファイル''string''は存在しません。

XSUE-0017: oracle.sql.STRUCT(ADT)以外の型のoracle.sql.STRUCTオブジェクトを作成できません。

XSUE-0018: NULLは有効なDocumentHandlerではありません。

XSUE-0019: NULLおよび空文字列は、有効なネームスペースの別名ではありません。

XSUE-0020: このメソッドを使用するには、サブクラスでメソッドを上書きする必要があります。

XSUE-0021: 古いバージョンのgssライブラリが使用されています。そのため、sql-xmlのネーム・エスケープはサポートされません。

XSUE-0022: XMLTypeオブジェクトを不透明なベース型''string''から作成できません。

問合せエラー・メッセージ

XSUE-0100からXSUE-0199の範囲のエラー・メッセージは次のとおりです。

XSUE-0100: 無効なコンテキスト・ハンドルが指定されました。

XSUE-0101: 結果セットのFIRST行にネストされたカーソルがあります。この条件が発生するとDTDを生成できません。

XSUE-0102: ''string''は有効なIANAエンコーディングです。

XSUE-0103: 結果セットは"TYPE_FORWARD_ONLY"(スクロール不可)です; したがって、xsuでは読取り位置を変更できません。また、結果セットはコール元からxsuに渡されているため、xsuでは結果セットを再作成できません。

XSUE-0104: 入力文字が、正しく形成されたXMLstringで無効です。

DMLエラー・メッセージ

XSUE-0200からXSUE-0299の範囲のエラー・メッセージは次のとおりです。

XSUE-0200: XMLの要素タグ''string''がターゲット・データベース・オブジェクトのいずれの列/属性の名前とも一致しません。

XSUE-0201: NULLは無効な列名です。

XSUE-0202: キー列に指定された列''string''は表''string''に存在しません。

XSUE-0203: 更新された列に指定された列''string''は表''string''に存在しません。

XSUE-0204: 無効なREF要素 - ''string'' - 属性''string''がありません。

XSUE-0206: 更新ルーチンをコールする前にキーの値を指定する必要があります。string関数を使用します。

XSUE-0207: UpdateXML: 更新する列がありません。XML文書には更新する、キー以外の列が必要です。

XSUE-0208: キー列の配列は空にはできません。

XSUE-0209: キー列の配列は空にはできません。

XSUE-0210: 変更する行がありません -- 行を囲むタグがありません。行を囲むタグを正しく指定してください。

XSUE-0211: XML文書に''string''が見つかりました(ROW要素stringの処理中)。

XSUE-0212: string XML行が正常に処理されました。

XSUE-0213: すでに実行されたXML行のすべての変更はロールバックされました。

エラー・メッセージの項目

XSUE-0300からXSUE-0400の範囲のエラー・メッセージは次のとおりです。

XSUE-0300: 注意

XSUE-0301: 例外stringが見つかりました: string

XSUE-0302: 列

XSUE-0303: 名前

XSUE-0303: 無効

XSUE-0304: XML文書

XSUE-0305: テンプレート

用語集

アプリケーション・サーバー

アプリケーションおよびその環境をホストするために設計されたサーバーであり、サーバー・アプリケーションの実行を許可します。代表的な例はOracle Application Serverで、リモート・クライアントがインタフェースを制御する場合に、Java、C、C++およびPL/SQLアプリケーションをホストできます。

属性

要素のプロパティ。等号で区切られた名前および値で構成され、開始タグ内の要素名の後に含まれます。たとえば、<Price units='USD'>5</Price>では、units(単位)が属性でUSDがその値です。値は、一重または二重引用符で囲む必要があります。属性は、ドキュメントまたはDTD内に格納できます。要素には多くの属性を指定できますが、その取得順序は定義されません。

バイナリXML

コンパクトなスキーマ形式を使用したXML表現。

BLOB

「バイナリ・ラージ・オブジェクト」を参照してください。

コールバック

1つのプロセスに他のプロセスを開始させ、それを継続させるプログラム方法。2番目のプロセスは、アクションの結果、値または他のイベントとして1番目のプロセスをコールします。この方法は、継続的な対話を許可するユーザー・インタフェースを持つほとんどのプログラムに使用されています。

カートリッジ

JavaまたはPL/SQLのストアド・プログラム。データベースが新しいデータ型を理解および処理するために必要な機能を追加します。カートリッジは、Oracle8以上のOracle Database内の拡張フレームワークでインタフェースの役割を担います。Oracle Textはこの種類のカートリッジであり、データベース内に格納されたテキスト・ドキュメントの読取り、書込みおよび検索のサポートを追加します。

カスケーディング・スタイルシート

スタイル(フォント、カラー、間隔など)をWebドキュメントに追加するための単純なメカニズム。

CDATA

「文字データ」を参照してください。

文字データ(CDATA)

ドキュメント内の解析対象外のテキストは、CDATAセクションに格納されます。これによって、&、<、>などの、他に特別な機能を持つ文字を含めることができます。CDATAセクションは、要素の内容または属性内で使用できます。

子要素

親要素という別の要素内に完全に含まれた要素。たとえば、<Parent><Child></Child></Parent>は、Child要素がそのParent要素内にネストされていることを示します。

Class Generator

入力ファイルを受け入れ、対応する機能を持つ一連の出力クラスを作成するユーティリティ。XML Class Generatorの場合、入力ファイルはDTDであり、出力は、そのDTDに準拠するXML文書を作成するために使用できる一連のクラスです。

CLASSPATH

JVMがアプリケーションの実行に必要なクラスを検索するために使用する、オペレーティング・システムの環境変数。

Common Object Request Broker API (CORBA)

ネットワーク全体の分散オブジェクト間の通信用の、Object Management Groupによる標準。これらの自己完結型ソフトウェア・モジュールは、異なるプラットフォームまたはオペレーティング・システム上で実行しているアプリケーションで使用できます。CORBAオブジェクトとそのデータ形式、およびファンクションは、Java、C、C++、Smalltalk、COBOLなどの様々な言語にコンパイルできるインタフェース定義言語(IDL)で定義されます。

Common Oracle Runtime Environment (CORE)

Cで作成された関数のライブラリ。これによって開発者は、事実上すべてのプラットフォームおよびオペレーティング・システムに簡単に移植可能なコードを作成できます。

CORBA

「Common Object Request Broker API」を参照してください。

CSS

「カスケーディング・スタイルシート」を参照してください。

データグラム

XSQLサーブレットが処理したSQL問合せから、HTMLページに埋め込まれたリクエスタに戻されるテキストのフラグメント。XML形式の場合もあります。

DOCTYPE

XML文書内にDTDまたはその参照を指定するタグ名として使用される用語。たとえば、<!DOCTYPE person SYSTEM "person.dtd">では、ルート要素名がpersonとして、また外部DTDがperson.dtdとしてファイル・システム内に宣言されます。内部DTDは、DOCTYPE宣言内で宣言されます。

Document Object Model (DOM)

XML文書のインメモリー・ツリーベースのオブジェクト表現。要素および属性へのプログラム・アクセスを可能にします。DOMオブジェクトおよびそのインタフェースは、W3C勧告です。プログラム・アクセス用のAPIなど、XML文書のDocument Object Modelを指定します。DOMは、解析対象文書をオブジェクトのツリーとして表示します。

Document Type Definition(DTD)

XML文書の有効な構造を定義する一連の規則。DTDは、SGMLから書式を導出し、DOCTYPE要素を使用するか、またはDOCTYPE参照を介して外部ファイルを使用してXML文書内に含めることができるテキスト・ファイルです。

DOM

「Document Object Model」を参照してください。

DTD

「Document Type Definition」を参照してください。

要素

XML文書の基本論理単位。子、データ、属性とその値などの他の要素に対するコンテナとして機能します。要素は、<name>などの開始タグ、および</name>などの終了タグ、または空要素の場合、<name/>によって識別されます。

空要素

テキスト内容または子要素のない要素。属性およびその値のみを含む場合があります。空要素の書式は、<name/>、または<name></name>(タグの間には空白なし)です。

Enterprise JavaBean (EJB)

サーバー上のJVM内で実行する独立プログラム・モジュール。CORBAによってEJBのインフラストラクチャが提供され、コンテナ・レイヤーによって、サポートされたサーバーにセキュリティ、トランザクション・サポートおよびその他の共通機能が提供されます。

エンティティ

別の文字列、またはドキュメントのキャラクタ・セットに属さない特殊文字を表すことができる文字列。エンティティ、およびパーサーによってエンティティの代替となるテキストは、DTDに宣言されます。

eXtensible Markup Language (XML)

データ記述のオープン標準。SGML構文のサブセットを使用してWorld Wide Web Consortium(W3C)によって開発され、インターネットでの使用目的で設計されました。

eXtensible Stylesheet Language (XSL)

XML文書を変換またはレンダリングするために、スタイルシート内で使用される言語。W3CのXSLスタイルシートは、XSL Transformations (XSLT)およびXSL Formatting Objects (XSLFO)という2つのW3C勧告で構成されています。

XSLは2つのW3C勧告で構成されています。XSL Transformationsは1つのXML文書を別のXML文書に変換し、XSL Formatting ObjectsはXML文書の表示方法を指定します。XSLは、スタイルシートを表す言語です。XSLは、次の2つの部分で構成されます。

- XML文書を変換するための言語(XSLT)

- 書式設定セマンティクスを指定するためのXMLボキャブラリ(XSLFO)。

XSLTスタイルシートは、書式設定用ボキャブラリを使用するXML文書へのクラスのインスタンスの変換方法を記述して、XML文書のクラス表示を指定します。

eXtensible Stylesheet Language Formatting Object (XSLFO)

書式設定セマンティクスを指定するためのXML用語を定義する、W3Cの標準仕様。「FOP」を参照してください。

eXtensible Stylesheet Language Transformation (XSLT)

XSLTとも書きます。XML文書を別のドキュメントに変換する変換言語を定義する、W3CのXSL標準仕様です。

FOP

XSL Formatting Objectsによって駆動される出力フォーマッタ。FOPは、書式設定オブジェクト・ツリーを読み取って、結果ページを指定された出力にレンダリングするJavaアプリケーションです。出力形式には、現在、PDF、PCL、PS、SVG、XML(領域ツリー表現)、Print、AWT、MIFおよびTXTがサポートされています。主な出力ターゲットはPDFです。

HTTP

「Hypertext Transfer Protocol」を参照してください。

HTTPS

「Hypertext Transfer Protocol, Secure」を参照してください。

IDE

「統合開発環境」を参照してください。

infoset

多くの情報項目で構成される抽象データセットであるXML情報セットを示します。少なくとも1つの情報項目(文書ノード)がありますが、infosetは必ずしも有効なXMLである必要はありません。W3C勧告については、http://www.w3.org/TR/xml-infoset/を参照してください。

インスタンス・ドキュメント

XML文書は、XMLスキーマに対して検証されます。インスタンス・ドキュメントがスキーマの規則に準拠する場合、有効であると考えられます。

インスタンス化

JavaやC++などのオブジェクト・ベース言語で使用される用語で、特定のクラスのオブジェクト作成を示します。

統合開発環境(IDE)

ソフトウェアの開発を支援するために設計された、単一のユーザー・インタフェースから実行されるプログラム・セット。JDeveloperは、Java開発用のIDEであり、エディタ、コンパイラ、デバッガ、構文チェッカ、ヘルプ・システムなどを含みます。JDeveloperを使用すると、単一のユーザー・インタフェースを介してJavaソフトウェアを開発できます。

J2EE

「Java 2 Platform Enterprise Edition」を参照してください。

Java

Sun社によって開発およびメンテナンスされた高水準のプログラミング言語。Javaでは、アプリケーションがJVMという仮想マシン内で実行されます。JVMは、オペレーティング・システムに対するすべてのインタフェースの役割を担います。開発者は、このアーキテクチャによって、JVMを搭載するすべてのオペレーティング・システムまたはプラットフォームで実行するJavaアプリケーションを開発できます。

Java 2 Platform, Enterprise Edition

複数層のエンタープライズ・コンピューティングを定義するJavaプラットフォーム(Sun社)。

Java API for XML Processing (JAXP)

特定のXMLプロセッサの実装に依存しないAPIを使用して、アプリケーションでXML文書の解析および変換を可能にします。

Java Architecture for XML Binding (JAXB)

XML文書およびJavaオブジェクト間でマップするAPIおよびツール製品。JSR-31勧告です。

JavaBeans

JVM内で実行する独立プログラム・モジュール。通常、クライアント側のユーザー・インタフェースを作成するために使用されます。JavaBeanとも呼ばれます。サーバー側の同等のモジュールは、Enterprise JavaBeans (EJB)と呼ばれます。「Enterprise JavaBeans」も参照してください。

Java Database Connectivity (JDBC)

Javaアプリケーションが、SQL言語を介してデータベースにアクセスできるようにするプログラムAPI。JDBCドライバは、プラットフォームに依存しないようにJavaで作成されますが、各データベースに固有です。

Java Developer's Kit (JDK)

Java開発環境を確立するJavaバージョン用の、Javaクラス、ランタイム、コンパイラ、デバッガおよびソース・コードのコレクション。JDKはバージョンで指定され、Java 2はバージョン1.2以上を指定するために使用されます。

Java Naming and Directory Interface (JNDI)

Sun社が提供するプログラム・インタフェース。Javaプログラムを、DNS、LDAP、NDSなどのネーミング・サービスおよびディレクトリ・サービスに接続します。Oracle XML DB Resource API for Java/JNDIは、JNDIをサポートしています。

Java Runtime Environment(JRE)

プラットフォーム上でJava仮想マシンを構成する、コンパイル済クラスのコレクション。JREはバージョンで指定され、Java 2はバージョン1.2以上を指定するために使用されます。

JavaServer Pages(JSP)

Webページへの単純なプログラム・インタフェースを可能にする、サーブレットの拡張機能。JSPは、特殊タグ、およびWebサーバーまたはアプリケーション・サーバーで実行される埋込みJavaコードを含むHTMLページであり、HTMLページに動的機能を提供します。JSPは、サーバーのJVMで最初にリクエストおよび実行されるときに、サーブレットにコンパイルされます。

Java Specification Request (JSR)

JAXBなどの、Java Community Process(JCP)組織などの勧告。

Java仮想マシン(JVM)

コンパイル済Javaバイトコードをプラットフォームのマシン言語に変換し、それを実行するJavaインタプリタ。JVMは、クライアント側、ブラウザ内、中間層内、イントラネット上、アプリケーション・サーバー上、またはデータベース・サーバー内で実行できます。

JAXB

「Java Architecture for XML Binding」を参照してください。

JAXP

「Java API for XML Processing」を参照してください。

JDBC

「Java Database Connectivity」を参照してください。

JDeveloper

アプリケーション、アプレットおよびサーブレットの開発を可能にするOracleのJava IDE。エディタ、コンパイラ、デバッガ、構文チェッカ、ヘルプ・システム、統合UMLクラス・モデラーなどを含みます。JDeveloperは、エディタでXMLサポートとともに使用できるように統合されたOracle Java XDKコンポーネントを搭載して、XMLベースの開発をサポートするように拡張されています。

JDK

「Java Development Kit」を参照してください。

JNDI

「Java Naming and Directory Interface」を参照してください。

JSR

「Java Specification Request」を参照してください。

JVM

「Java仮想マシン」を参照してください。

リスナー

入力プロセスを監視する個別のアプリケーション・プロセス。

LOB

「ラージ・オブジェクト」を参照してください。

マーシャリング

Javaコンテンツ・ツリーを全検索し、ツリーのコンテンツを反映したXML文書を作成するプロセス。アンマーシャリングの逆です。

ノード

XMLでは、DOMツリー内のアドレス指定可能な各エンティティを示す用語。

表記法宣言

XMLでは、パーサーが認識できないコンテンツ・タイプの宣言。これらの型には、オーディオ、ビデオおよび他のマルチメディアが含まれます。

OASIS

「Organization for the Advancement of Structured Information」を参照してください。

OC4J

Oracle Containers for J2EE。JDeveloperに付属するJ2EE開発ツール製品です。

Oracle Application Server

Oracle Application Server製品。オープン標準フレームワーク内で高パフォーマンスのN層トランザクション指向Webアプリケーションを構築、デプロイおよび管理するために必要な、すべての主要なサービスおよび機能を統合します。

Oracle CM SDK

「Oracle Content Management SDK」を参照してください。

Oracle Content Management SDK

データベース内または中間層上で実行する、Oracleのファイル・システムおよびJavaベースの開発環境。単一のデータベース・リポジトリに複数の型のドキュメントを作成、格納および管理する方法を提供します。

Oracle Text

Oracleのツール製品。XPathに類似した検索機能とともに、文書の全文索引および複数の文書にまたがったSQL問合せを実行する機能を提供します。

Oracle XML DB

Oracleデータベース・サーバーが提供する、高パフォーマンスなXML格納および取得テクノロジ。W3CのXMLデータ・モデルに基づきます。

Oracle XML Developer's Kit (XDK)

ソフトウェア開発者に、アプリケーションをXML対応にするための標準ベースの機能を提供する、一連のライブラリ、コンポーネントおよびユーティリティ。Oracle XDK Javaコンポーネントには、XML Parser、XSLT Processor、XML Class Generator、JavaBeansおよびXSQLサーブレットが含まれます。

ORACLE_HOME

アプリケーションで使用するために、Oracle Databaseのインストール場所を識別するオペレーティング・システムの環境変数。

Organization for the Advancement of Structured Information (OASIS)

会議、セミナー、展示会およびその他の教育イベントを通じて、パブリック情報標準の普及促進を目的として設立されたメンバーの組織。XMLは、SGMLと同様に、OASISが活発に普及を促進している標準です。

親要素

子要素という別の要素を囲む要素。たとえば、<Parent><Child></Child></Parent>は、Parent要素がそのChild要素をラップしていることを示します。

解析対象文字データ(PCDATA)

解析する必要がありますが、タグまたは解析対象外データの一部ではないテキストで構成される要素内容。

パス名

リポジトリ階層内でのリソースの位置を反映したリソースの名前。パス名は、ルート要素(最初の/)、要素セパレータ(/)および様々なサブ要素(またはパス要素)で構成されます。パス要素は、(\または/)を除いて、データベース・キャラクタ・セットのすべての文字で構成できます。これらの文字は、Oracle XML DBで特別な意味を持ちます。スラッシュは、パス名内のデフォルトの名前セパレータであり、バックスラッシュは、エスケープ文字として使用されます。

PCDATA

「解析対象文字データ」を参照してください。

プリンシパル

Oracle XML DBリソースへのアクセス制御権限を付与されたエンティティ。Oracle XML DBは、次のプリンシパルをサポートします。

- データベース・ユーザー。

- データベース・ロール。データベース・ロールは、グループとして認識されます。たとえば、DBAロールは、DBAロールを付与されたすべてのユーザーのDBAグループを表します。

LDAPサーバーからインポートされたユーザーおよびロールも、データベースの通常の認証モデルの一部としてサポートされます。

プロローグ

XML宣言およびDTD、またはドキュメントを処理するために必要な他の宣言を含む、XML文書の最初の部分。

PUBLIC

後に続く参照の、インターネット上の場所を指定する用語。

リポジトリ

パス名にマップされる、スキーマ内の一連のデータベース・オブジェクト。リポジトリには、それぞれパス名を持つ、一連のリソースを含む1つのルート(「/」)があります。

リソース

リポジトリ階層内のオブジェクト。

リソース名

親フォルダ内のリソースの名前。リソース名は、フォルダ内で一意(大/小文字が区別されない場合もあります)である必要があります。リソース名のキャラクタ・セットは、常にUTF-8(NVARCHAR2)です。

結果セット

1行以上のデータで構成されるSQL問合せの出力。

ルート要素

XML文書内にある他のすべての要素を囲む要素。オプションのプロローグとエピローグの間に存在します。XML文書には、1つのルート要素のみ置くことができます。

SAX

「Simple API for XML」を参照してください。

スキーマ

データベース内の構造およびデータ型の定義。スキーマは、XML SchemaのW3C勧告をサポートするXML文書も示します。

サーブレット

サーバー(通常はWebまたはアプリケーション・サーバー)内で実行するJavaアプリケーション。サーブレットは、CGIスクリプトに相当するJavaです。

SGML

「Standard Generalized Markup Language」を参照してください。

Simple API for XML (SAX)

XMLパーサーによって提供され、イベント駆動型のアプリケーションによって使用されるXML標準インタフェース。

Simple Object Access Protocol (SOAP)

非集中型の分散環境で情報を交換するためのXMLベースのプロトコル。

SOAP

「Simple Object Access Protocol」を参照してください。

SQL

「Structured Query Language」を参照してください。

SQL/XML

XMLをSQLで表すANSI仕様。Oracle SQLにはXMLを問い合せるSQL/XMLファンクションが含まれます。この仕様はまだ完全ではありません。

Structured Generalized Markup Language (SGML)

マークアップおよびDTDを使用して実装された、テキスト・ドキュメントの書式を定義するためのISO標準。

Structured Query Language (SQL)

リレーショナル・データベース内のデータをアクセスおよび処理するために使用する標準言語。

スタイルシート

XMLでは、XSL処理命令で構成されるXML文書を示す用語。XSL処理命令は、入力XML文書を出力XML文書に変換またはフォーマットするために、XSLTプロセッサによって使用されます。

SYSTEM

後に続く参照の、ホスト・オペレーティング・システム上の場所を指定する用語。

タグ

XMLマークアップの単一のピース。要素の開始または終了を指定します。タグは、<で始まり>で終わります。XMLには、開始タグ(<name>)、終了タグ(</name>)および空タグ(<name/>)があります。

TransX Utility

翻訳されたシード・データおよびメッセージのデータベースへのロードを簡単にするJava API。

UIX

「User Interface XML」を参照してください。

アンマーシャリング

XML文書を読み取り、Javaコンテンツ・オブジェクトのツリーを構築するプロセス。各コンテンツ・オブジェクトは、対応するスキーマ・コンポーネントの入力文書内のインスタンスに直接対応します。

「マーシャリング」を参照してください。

User Interface XML(UIX)

Webアプリケーションを構築するフレームワークを構成する一連のテクノロジ。

妥当

XML文書の構造および要素内容が、関連付けられたDTDまたはXMLスキーマで宣言されたものと一貫している状態を示す用語。

W3C

「World Wide Web Consortium(W3C)」を参照してください。

WebDAV

「World Wide Web Distributed Authoring and Versioning」を参照してください。

整形式

XML文書が、XML宣言で宣言されたXMLバージョンの構文に準拠している状態を示す用語。これには、ルート要素が単一か、タグが適切にネストされているかなどが含まれます。

ワーキング・グループ(WG)

特定のインターネット・テクノロジ分野における勧告を実行する業界のメンバーで構成されたW3Cの委員会。

World Wide Web

インターネットおよびHTTPプロトコルを使用する世界規模のハイパーテキスト・システム。

World Wide Web Consortium(W3C)

1994年に設立された、Webの規格を確立するための国際的な機関。W3Cのサイトは、http://www.w3c.orgです。

World Wide Web Distributed Authoring and Versioning (WebDAV)

Web上での協調的なオーサリングのためのInternet Engineering Task Force(IETF)標準。Oracle XML DBのフォルダリングおよびセキュリティ機能は、WebDAVに準拠しています。

XDBbinary

バイナリ・データを含むOracle XML DBスキーマで定義されたXML要素。XDBbinary要素は、完全に構造化されていないバイナリ・データがOracle XML DBにアップロードされたときに、リポジトリに格納されます。

XDK

「Oracle XML Developer's Kit」を参照してください。

XLink

XML文書内でのハイパーリンクの使用を制御する規則で構成されたXML Linking言語。これらの規則は、W3Cの勧告プロセス下のXML Linking Groupによって開発されています。XLinkは、XMLがドキュメントの表示およびハイパーリンクの管理にサポートする3つの言語(XLink、XPointerおよびXPath)の1つです。

XML

「eXtensible Markup Language」を参照してください。

XML Base

xml:base属性の使用方法を記述するW3C勧告。XML文書に挿入して、文書または外部エンティティのベースURI以外のベースURIを指定できます。ドキュメントのURIは、指定されたベースによって解決されます。

XML Gateway

ビジネス・イベントによってトリガーされるXMLメッセージを作成および使用するために、Oracle E-Business Suiteとの統合を可能にする一連のサービス。

XML名前空間

XML文書内にある、関連する一連の要素名または属性を示す用語。名前空間の構文およびその使用方法は、W3C勧告によって定義されています。たとえば<xsl:apply-templates/>要素は、XSL名前空間の一部として識別されます。名前空間は、XML文書またはDTD内で、属性の構文xmlns:xsl="http://www.w3.org/TR/WD-xsl"を宣言してから宣言されます。

XMLパーサー

XMLで、XML文書を受け取り、ドキュメントが整形式であり、また妥当(オプション)であるかどうかを判断するソフトウェア・プログラム。Oracle XML Parserは、SAXおよびDOMインタフェースの両方をサポートします。

XML Pipeline Definition Language

ユーザーがXMLリソース間の処理リレーションを記述できるようにする、W3C勧告。

XMLプロセッサ

XML文書を読み取って処理するソフトウェア・プログラム。文書に対して一連の規則に基づくアクションを実行します。プロセッサの例として、妥当性チェッカやXMLエディタがあります。

XML Query (XQuery)

W3Cが取り組む、XML文書を問い合せるための言語および構文の標準。

XMLスキーマ

XML Schema言語で作成された文書。

XML Schema

「XML Schema言語」を参照してください。

XML Schema定義

「XML Schema言語」と同等。

XML Schema言語

単に「XML Schema」とも呼ばれるXML Schema言語は、XML文書内で単純なデータ型および複合構造を使用するためのW3C標準です。データ型の定義や妥当性など、現在DTDで不足している領域に取り組んでいます。

Oracle XML Schema Processorは、オンライン取引などのE-Businessアプリケーションで使用される、XML文書およびデータの妥当性を自動的に検証します。XML Schemaは、XML文書に単純型および複合型を追加し、DTDの機能をXMLスキーマ定義のXML文書に置き換えます。

XMLSchemaインスタンスの名前空間

これを使用して、インスタンス・ドキュメントを特定のXMLスキーマによって定義されるクラスのメンバーとして識別します。インスタンス・ドキュメントのルート要素に対して名前空間宣言を追加し、XMLSchemaインスタンスの名前空間を宣言する必要があります。例として、xmlns:xsi=http://www.w3.org/2001/XMLSchema-instanceがあげられます。

XML SQL Utility (XSU)

このOracleユーティリティにより、SQL問合せまたはJDBC ResultSetオブジェクトが指定されたXML文書(文字列またはDOM)を生成できます。また、XSUは、XML文書からデータを抽出し、データベース表で行の挿入、更新または削除を行うことができます。

XMLType

XMLTypeは、表またはビュー内の基礎となるCLOB列や、オブジェクト・リレーショナル列またはバイナリ形式を使用してXMLデータを格納するOracleデータ型です。

XMLTypeビュー

Oracle XML DBは、既存のリレーショナル・データおよびオブジェクト・リレーショナル・データベースをXML形式にラップする方法を提供します。特に、レガシー・データがXMLではなく、それをXML形式に移行する必要がある場合などに有効です。

XPath

XSLおよびXPointerで使用されるドキュメント内で要素を指定するための、オープン標準の構文。XPathは、現在W3C勧告です。XSLT、XLinkおよびXML Queryに使用されるXML文書を操作するためのデータ・モデルおよび文法を指定します。

XPointer

XML文書フラグメントへの参照を記述するためのW3C勧告。XPointerは、XPath形式のURIの終わりに使用できます。XPathナビゲーションを使用して、XML文書内の個別のエンティティまたはフラグメントの識別を指定します。

XSL

「eXtensible Stylesheet Language」を参照してください。

XSLFO

「eXtensible Stylesheet Language Formatting Object」を参照してください。

XSLT

「eXtensible Stylesheet Language Transformation」を参照してください。

XSLT Virtual Machine (XVM)

OracleのXSLT Virtual Machineは、コンパイル済のXSLTコードの実行用に設計された、「CPU」のソフトウェア実装です。この仮想マシンの概念では、コンパイラによって、XSLTスタイルシートはバイトコードのプログラムまたは「XSLT CPU」のマシン命令にコンパイルされるものと想定します。

XSQLページ

XSQLサーブレット用の命令を含むXMLページ。

XSQLサーブレット

Javaベースのサーブレット。1つ以上のSQL問合せから動的にXML文書を生成でき、XSLTスタイルシートを使用してサーバー内のドキュメントを変換できます(オプション)。

XSU

「XML SQL Utility」を参照してください。

索引
B  C  D  E  F  G  H  I  J  M  N  O  P  R  S  T  U  V  W  X

B

バイナリXML

C, 19.1

デコーダ, 5.5.2

デコーディング, 5.3.2

エンコーダ, 5.5.1

エンコーディング, 5.3.1

用語集, 5.2.1

使用モデル, 5.2

Javaの使用, 5.5

ボキャブラリ管理, 5.4

XML DB, 5.5

バイナリXML

テキストを別の形式で保存, 4.3.4.1.3

バイナリXML for Java, 5 バイナリXML格納形式, 5.1.1 バインド

clearBindValues(), 11.2.1.3

組込みアクション・ハンドラ, 15.8.1.2 組込みアクション・ハンドラ, XSQL, 15.8.1.2

C

C API, 16.4

UNIXでのCコンパイル時環境

設定, 16.2.4

Cコンポーネント

デモ, 16.1, 17.3.1, 18.2.4, 20.4

ディレクトリ構造, 16.1

グローバリゼーション・サポート

インストール, 16.1

Windowsでの実行時環境, 16.3.3

サンプル, 16.1, 17.3.1, 18.2.4, 20.4

Windows環境の設定, 16.3

Windows環境変数の設定, 16.3.2

WindowsでのVisual C/C++の使用, 16.3.5

UNIXでのC環境変数, 16.2.2 Cライブラリ

コンテンツ, 16.2.1

UNIXでのC実行時環境, 16.2.3 C++ Class Generator, 1.2.4 C++インタフェース, 24.2 Class Generator

XML C++, 29

CLASSPATH

XSQLページ, 14.2.2.2

clearBindValues(), 11.2.1.3 clearUpdateColumnNames(), 11.4.6.2 コマンドライン・インタフェース

oraxml, 4.2.3, 8.2.3

接続定義, 14.2.2.4 コンテキスト, XSU PL/SQL APIへのコンテキストの作成, 11.4.10 コンテキスト・ハンドルの作成

getCtx, 11.2.1.3

カスタムConnection Manager, 15.8.4.1

D

Data Provider for .NET, 1.4.5

XMLへのデータ変数, 4.7.2

DB Access JavaBean, 10.1.3.3

DBMS_XMLQuery

clearBindValues(), 11.2.1.3

getXMLClob, 11.2.1.3

DBMS_XMLQuery(), 11.2.1.3 DBMS_XMLSave, 11.2.1.4

deleteXML, 11.2.1.4

getCtx, 11.2.1.4

insertXML, 11.2.1.4

updateXML, 11.2.1.4

DBMS_XMLSave(), 11.2.1.4 バイナリXMLのデコード, 5.3.2 SQLからXMLへのデフォルト・マッピング, 11.5.1.1 デモ

C コンポーネント, 16.1, 17.3.1, 18.2.4, 20.4

ディレクトリ構造

C, 16.1

文書作成Java API, 2.3.3 DOM

Javaでの作成, 4

仕様, 31.1.2.1

DOMBuilder Bean, 10.1.3.1 DTD

外部, 4.7.3.1

E

バイナリXMLのエンコード, 5.3.1

エラー・メッセージ

アサーション, B.5

DLF, B.2

DML, C.4

DOM, A.2

一般的なTXU, B.1

一般的な, C.2

JAXB, A.10

キーワードと構文, C.1

項目, C.5

問合せ, C.3

スキーマ・コンポーネント制約, A.7

スキーマ表現制約, A.6

TransX, B.4

TransX情報, B.3

使用方法の説明, B.6

XMLパーサー, A.1

XMLパイプライン, A.9

XMLスキーマ検証, A.5

XPath, A.4

XSL変換, A.3

XSQLサーバー・ページ, A.8

Javaでの文書作成の例, 2.3.3

F

システム・ファイルには適していないFileReader, 4.7.4.1

FOP

シリアライザ, 14.2.3

PDFを生成するシリアライザ, 15.7

G

生成されるXML

カスタマイズ, 11.5.1.3

XMLの生成, 11.2.4.1

DBMS_XMLQueryの使用, 11.2.1.3

XSUのコマンドラインの使用, getXML, 11.2.4.1

getCtx, 11.2.1.3, 11.2.1.4 getXML, 11.2.4.1 getXMLClob, 11.2.1.3 グローバリゼーション・サポート

Cコンポーネント用, 16.5

H

HTMLフォーム・パラメータ, 14.5.2.4

HTTPパラメータ, 14.5.1

HTTP POSTメソッド, 14.5.3.2

I

infoset, 5.3

挿入, XSU, 11.5.2.2

insertXML, 11.2.1.4

インストール

Cコンポーネント, 16.1

無効な文字, 4.7.4.6

J

JARファイル, DTD, 4.7.3.1

非推奨のJavaクラス, 2.3.1

Javaコンポーネント

DOMの作成, 4

Windowsでの環境, 3.3.2

インストール, 3.1

解析, 4

JAXB

Class Generator, 1.2.4

JAXPとの比較, 8.1, 8.2

サポートされない機能, 8.2.4

マーシャリングおよびアンマーシャリング, 8.1

検証, 8.1

概要, 8.2

JAXP

JAXBとの比較, 8.1

JAXP (Java API for XML Processing), 4.5 JCR 1.0標準, 4.1.2 JDBCドライバ, 11.2.1.1 JDeveloper, 1.4.1 JSR 170標準, 4.1.2

M

Make.batファイル

C環境用のWindowsでの編集, 16.3.4.1.1

マッピング

手引き, XSU, 11.5.1

メソッド

getDocument(), DOMBuilder Bean, 10.2.1.1

メソッド

addXSLTransformerListener(), 10.2.1.2

domBuilderError(), 10.2.1.1

DOMBuilderOver(), 10.2.1.1, 10.2.1.2

domBuilderStarted(), 10.2.1.1

Microsoft .NET, 1.4.5

N

.NET, 1.4.5

該当する行がない場合の例外, 11.3.9.2

O

OCIおよびXDK C API, 18.7

OCIの例, 18.7.5

Oracle9i JVM, 4.2

OracleXML

XSUのコマンドライン, 11.2.4

OracleXml名前空間, 24.3 OracleXMLSQLException, 11.3.9 orastream関数, 18.4 oraxml, 4.2.3, 8.2.3 oraxsl

コマンドライン・インタフェース, 6.2.3

OUT変数, XSQLの使用

dml, 14.5.2.5

P

パッケージ・クラス, 2.3.1

parseDTD() メソッド, 4.7.3.1

Parser for Java, 4

コンストラクタ拡張関数, 6.4.4

oraxsl, 6.2.3

戻り値拡張関数, 6.4.5

サポートするデータベース, 4.2

DTDの使用, 4.7.3

Parser for Java, 概要, 4.2 FOPを使用したPDFの結果, 14.2.3 Pipeline Definition Language, 9.1 PL/SQL

DBMS_XMLQueryを使用したXMLの生成, 11.2.1.3

R

Reports, Oracle, 1.4.3

S

サンプル

C コンポーネント, 16.1, 17.3.1, 18.2.4, 20.4

セキュリティ, XSQL Pages, 14.5.4 選択

XSU, 11.5.2.1

サーブレット, XSQL, 14, 15 setKeyColumn(), 11.3.8.2, 11.4.8.2 setMaxRows, 11.4.3 setRaiseNoRowsException(), 11.4.3 setSkipRows, 11.4.3 setStylesheetHeader(), 11.4.4 setUpdateColumnName(), 11.4.6.2 setUpdateColumnNames()

XML SQL Utility (XSU)

setUpdateColumnNames(), 11.2.3, 11.3.7.2

setXSLT(), 11.4.4 SOAP

Cクライアント, 22.1.2

Cの例, 22.3

Cの例, 22.2

for C, 22.1

サーバー, 22.1.3

概要, 22.1.1

データベースへのXMLの格納, 11.2.1.4 ストリーミング・バリデータ, 20.5

不透明モード, 20.5.2

透明モード, 20.5.1

文字列データ, 4.7.4.6

T

TransX Utility, 12

U

UIX, 1.4.2

システム・ファイル内のUnicode, 4.7.4.1

XDKおよびXML DB用の統合C API, 16.4

統合Java API, 2.1, 2.1, 2.1

統合Java API, 2, 2.1, 2.1

統合Java APIの新しいオブジェクトとメソッド, 2.3.3

C XDKコンポーネント用のUNIX環境

構成, 16.2

更新, XSU, 11.5.2.3 User Interface XML, 1.4.2 UTF-16エンコーディング, 4.7.4.5 UTF-8出力, 4.7.4.3

V

検証

自動検証モード, 4.1.10, 4.1.10

DTD検証モード, 4.1.10

部分検証モード, 4.1.10

スキーマ検証, 4.1.10

スキーマ検証モード, 4.1.10

Visual C/C++, 16.3.5 Visual Studio, 16.3.5

W

Windows, 16.3

Cコンポーネント

Visual C/C++の使用, 16.3.5

Cライブラリ, 16.3.1 Make.batファイルの編集, 16.3.4.1.1 C環境変数の設定, 16.3.2 C XDKコンポーネント用のWindows環境

設定, 16.3

WMLドキュメント, 14.5.2.1

X

Xdiffインスタンス・ドキュメント, 21.2.6

Xdiffスキーマ, 21.2.10

XDKコンポーネント, 1.1

XDKのバージョン

Cの使用, 16.2.5

Javaの使用, 3.4, 23.2.5

XML Base, 31.1.1 XML C++ Class Generator, 29 XML文書

Cからの生成, 1.3.2

C++からの生成, 1.3.3

Javaからの生成, 1.3.1

XML Gateway, 1.4.4 XML Namespaces 1.0, 31.1.1 UTF-8でのXML出力, 4.7.4.3 XMLパーサー

oraxmlコマンドライン・インタフェース, 4.2.3, 8.2.3

XML Parser for C

サンプル・プログラム, 17.3.1, 18.2.4

XML Pull Parser

例, 18.6.5

XML Pull Parserのエラー処理, 18.6.4 XML Pull Parser for C, 18.6 XML Schema

説明, 7.1.4

Processor for Java

サンプル・プログラムの実行方法, 6.2.2, 7.2.2, 8.2.2, 9.2.2, 12.2.2

XML Schema for C

サンプル・プログラム, 20.4

XML SQL Utility (XSU), 1.2.7

高度な使用方法, 例外処理(PL/SQL), 11.4.9

PL/SQL APIでのclearBindValues(), 11.2.1.3

OCI* JDBCドライバを使用した接続, 11.2.1.1

getCtxを使用したコンテキスト・ハンドルの作成, 11.2.1.3

生成されるXMLのカスタマイズ, 11.5.1.3

DBMS_XMLQuery, 11.2.1.3

DBMS_XMLSave(), 11.2.1.4

依存性およびインストール, 11.2.1

説明, 11.2

getXMLコマンドライン, 11.2.4.1

getXMLClob, 11.2.1.3

挿入, 11.5.2.2

マッピングの手引き, 11.5.1

選択, 11.5.2.1

setKeyColumn()ファンクション, 11.3.8.2

setRaiseNoRowsException(), 11.4.3

更新, 11.5.2.3

XML SQL Utility (XSU)

setXSLT(), 11.4.4

xmlcgの使用方法, 29.3 XMLCompress JavaBean, 10.1.3.6 XMLDBAccess JavaBean, 10.1.3.4 XmlDiffコマンドライン・ユーティリティ, 21.2.4 XMLDiffの例, 21.2.11 CにおけるXMLDiff, 21.1 XMLDiff JavaBean, 10.1.3.5 XMLGEN, 廃止, 「DBMS_XMLQUERY」および「DBMS_XMLSAVE」を参照, 11.2.1 XmlHash, 21.4 XMLNode.selectNodes()メソッド, 4.7.1 XmlPatch, 21.3 XSDBuilder, 4.1.10 XSL Transformation(XSLT)プロセッサ, 1.2.2 XSL Transformation (XSLT) Processor for Java, 6.2, 9.2, 12.2 XSL Transformations仕様, 31.1.2.2 XSLT

XSLTransformer Bean, 10.2.1.2

XSLTコンパイラ, 17.1 XSLTプロセッサ, 17.2 XSLT Processor for Java

使用上のヒント, 6.5

XSLTスタイルシート

XSU PL/SQLのsetStylesheetHeader(), 11.4.4

XSU PL/SQLのsetXSLT(), 11.4.4

XSLTransformer JavaBean, 10.1.3.2 XSLValidator JavaBean, 10.1.3.7 XSQL

アクション・ハンドラ・エラー, 15.4.2

高度なトピック, 15

組込みアクション・ハンドラ要素, 15.8.1.2

接続, 14.5.2.6, 14.5.2.7

現行ページの名前, 14.5.2.8

エラー, 14.5.3.1

デモの設定, 14.2.3.1, 14.2.3.2

SOAPサポート, 14.5.2.6

スタイルシート, 15.2

2つの問合せ, 14.5.2.3

XSQLアクション要素

<xsql:action>, 30.1

<xsql:delete-request>, 30.1

<xsql:dml>, 30.1

<xsql:if-param>, 30.1

<xsql:include-owa>, 30.1

<xsql:include-param>, 30.1

<xsql:include-posted-xml>, 30.1

<xsql:include-request-params>, 30.1

<xsql:include-xml>, 30.1

<xsql:include-xsql>, 30.1

<xsql:insert-param>, 30.1

<xsql:insert-request>, 30.1

<xsql:query>, 30.1

<xsql:ref-cursor-function>, 30.1

<xsql:set-cookie>, 30.1

<xsql:set-page-param>, 30.1

<xsql:set-session-param>, 30.1

<xsql:set-stylesheet-param>, 30.1

<xsql:update-request>, 30.1

XSQLページのセキュリティ, 14.5.4 XSQLサーブレット

ヒント, 14.5.2

XSQLサーブレットの例, 14.2.3 XSU

XMLの生成, 11.2.4.1

マッピングの手引き, 11.5.1

使用のガイドライン, 11.5.1

XSU (XML SQL Utility), 1.2.7 XSU使用方法, 11.5 XVM

XSLTコンパイラ, 17.1.2

XVM(XSLT Virtual Machine)プロセッサ, 17.1

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。