ヘッダーをスキップ
Oracle XML Developer's Kitプログラマーズ・ガイド
10gリリース3(10.1.3)
B28611-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

5 XML Schema Processor for Java

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

XML Schemaの概要

XML Schemaは、XML自体を使用してXML文書のコンテンツおよび構造を記述するためにW3Cで作成されました。XML Schemaには、Document Type Description(DTD)のほとんどの機能(entityはサポートされません)と、追加の機能があります。

DTDの概要

DTDは、XMLマークアップの制約を宣言するためのXML 1.0で提供されるメカニズムです。DTDでは次の指定が可能です。

DTDはXMLマークアップ宣言としても知られています。

XML Schema言語はDTDと同様の役割を果しますが、XML文書の制約を指定する際の柔軟性が高く、アプリケーションによってはさらに便利な場合があります。XML Schemaでは、要素と属性の名前空間とデータ型がサポートされます。

XML Schemaは、XML Schema Definition(XSD)とも呼ばれます。

DTDの制限

DTDは、一部のアプリケーションの処理には不十分であると考えられています。DTDの制限を次に示します。

  • DTDは名前空間テクノロジに統合されていないため、ユーザーはコードをインポートして再利用できません。

  • DTDでは、文字データ以外のデータ型、およびメタデータ標準とデータベース・スキーマを記述するための制限をサポートしていません。

アプリケーションではDTDよりも柔軟性の高いドキュメント構造の制約を指定する必要があります。

XML Schemaの機能とDTDの機能の比較

DTDには継承制限があるため、W3CではXML Schemaを推奨しています。XML Schemaを使用すると、型情報や制約を指定できます。

表5-1に、XML Schemaの機能とDTDの機能の比較を示します。ほとんどのXML Schemaの機能にはDTDの機能が含まれていることに注意してください。

表5-1 XML Schemaの機能とDTDの機能の比較

XML Schemaの機能 DTDの機能

組込みデータ型

XML Schemaでは組込みデータ型のセットを指定します。その一部は定義済のコールされるプリミティブ・データ型であり、次の型システムの基本となります。

string、boolean、float、decimal、double、duration、dateTime、time、date、gYearMonth、gYear、gMonthDay、gMonth、gDay、Base64Binary、HexBinary、anyURI、NOTATION、QName

他にはプリミティブ型で定義される派生データ型があります。

DTDは文字列以外のデータ型をサポートしません。

ユーザー定義のデータ型

ユーザーは、組込みデータ型から独自のデータ型を導出できます。データ型の派生には、restriction(制限)、list(リスト)およびunion(ユニオン)の3つの方法があります。

restriction(制限)は、制約ファセットをベース型に適用することで、より制限されたデータ型を定義します。

list(リスト)は単純に、その項目型の値のリストを許可します。

union(ユニオン)は、値がメンバー型のいずれかになる新しい型を定義します。

たとえば、publish-year型の値が特定の範囲内になるように指定する場合、次のようになります。

<SimpleType name = "publish-year">
    <restriction base="gYear">
         <minInclusive value="1970"/>
         <maxInclusive value="2000"/>
    </restriction>
</SimpleType>

制約ファセットは次のとおりです。

length、minLength、maxLength、pattern、enumeration、whiteSpace、maxInclusive、maxExclusive、minInclusive、minExclusive、totalDigits、fractionDigits

一部のファセットのみが特定のベース型に適用されます。

DTDの例のpublish-year要素をさらに制約することはできません。

出現インジケータ(コンテンツ・モデルまたは構造)

XML Schemaでは、インスタンス・ドキュメントの構造(complexType)や要素は、モデル・グループおよび属性グループの観点で定義されます。モデル・グループには、さらにモデル・グループまたは小要素が含まれ、属性グループには属性が含まれます。モデル・グループおよび属性グループの両方でワイルドカードを使用して、任意の要素または属性を示すことができます。順序、全体および選択という3種類のモデル・グループがあり、それぞれ小要素間の順序関係、結合関係および分離関係を表します。各小要素の出現回数の範囲も指定できます。

データ型と同様、complexTypeは他の型から派生できます。派生方法には、制限または拡張があります。派生した型は、ベース型のコンテンツと対応する変更を継承します。継承に加えて、型の定義は他のコンポーネントを参照できます。この機能を使用して一度定義したコンポーネントを、他の多くの構造で使用できます。

XML Schemaでの型宣言と定義のメカニズムは、DTDよりもはるかに柔軟性が高く、高性能です。

要素内の子要素の数に関するDTDの制御は、次の記号を使用して指定されます。

  • ? = 0(ゼロ)または1

  • * = 0(ゼロ)以上

  • + = 1以上

  • (none) = 1のみ

ID制約

XML Schemaは、一意の宣言であるキーおよびキー参照によって、XML ID/IDREFメカニズムの概念を拡張します。これらは型定義の一部であり、属性のみではなく、要素コンテンツもキーとして許可します。各制約には制約が保持する有効範囲があり、字句文字列ではなく値で比較されます。

インポートとエクスポートのメカニズム(スキーマのインポート、挿入および変更)

スキーマのすべてのコンポーネントは、1つのスキーマ・ファイルで定義する必要はありません。XML Schemaでは複数のスキーマを組み合せるメカニズムが提供されます。インポートは異なる名前空間のスキーマを統合するために使用されますが、挿入は同じ名前空間のコンポーネントを追加するために使用されます。挿入時に再定義を使用してコンポーネントを変更することもできます。

外部スキーマに定義された構成は使用できません。


XML Schema Processor for Javaの機能

Oracle XDK Javaコンポーネントを構成するXML Schema Processor 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

XML Schema Processor for Javaの実行要件

XML Schema Processor for Javaを実行するには、次の条件が必要です。

  • Java 1.2をサポートするオペレーティング・システム

  • Java: JDK 1.2.x以上。

Oracle XML Schema Processor for Javaのサンプル・プログラムのドキュメントは、xdk/demo/java/schema/READMEファイルにあります。

XML Schema Processor for Javaの使用方法

図5-1に示すように、OracleのXML Schema Processor for Javaでは2つの主なタスクを実行します。

図5-1 XML Schema Processor for Javaの使用方法

図5-1の説明が続きます
「図5-1 XML Schema Processor for Javaの使用方法」の説明

XML Schemaを使用してXML文書のクラスを定義できます。インスタンス・ドキュメントは、特定のスキーマに準拠するXML文書を記述します。

これらのインスタンスおよびスキーマは、特に文書として存在する必要はありませんが、一般的にファイルと呼ばれます。次のいずれかの形式で存在します。

スキーマを構築する際、ビルダーは最初に内部スキーマ・オブジェクトをコンパイルし、DOMパーサーをコールして、スキーマ・オブジェクトを対応するDOMツリーに解析します。

バリデータは、インスタンス・ドキュメントのSAXパーサーとアプリケーション間のフィルタとして機能します。バリデータはインスタンス・ドキュメントのSAXイベントを入力として受け取り、スキーマと照らし合せて検証します。バリデータが無効なXMLコンポーネントを検出すると、エラー・メッセージが送信されます。

バリデータの出力は次のとおりです。

XML Schema APIの使用

XML Schema Processor for JavaのAPIは簡単です。次のいずれかを使用できます。

  • XSDSample.javaに示すDOMParsersetSchemaValidationMode()

  • XSDBuilderを使用して明示的にスキーマを構築し、XSDSetSchema.javaに示すXMLParserのスキーマを設定します。

XSDBuilderを使用して検証用のコンパイル済スキーマを明示的に設定しない場合は、インスタンス・ドキュメントで正しいxsi:schemaLocation属性がスキーマ・ファイルを示すようにします。それ以外の場合、検証は実行されません。

xmlcleanに類似したクリーンアップ・コールはありません。新しいXML文書を検証する前にすべてのメモリーを解放して、状態をリセットする必要がある場合、コンテキストを終了してもう一度やりなおします。

XML Schema Processor for Javaのサンプル・プログラム

表5-2に、/xdk/demo/java/schemaディレクトリで提供されるXML Schema Processor for Javaのサンプル・ファイルを示します。

表5-2 XML Schemaのサンプル・ファイル

ファイル 説明
cat.xsd

XSDSetSchema.javaプログラムに入力を提供するXML Schema定義のサンプル・ファイル。XML Schema Processor for Javaは、cat.xsdのXML Schema仕様を使用して、catalogue.xmlのコンテンツを検証します。

catalogue.xml

XSDSetSchema.javaプログラムを使用して、XML Schema定義ファイルcat.xsdに対してXML Schemaプロセッサが検証するサンプルXMLファイル。

catalogue_e.xml

XML Schema Processor for JavaがXSDSample.javaを使用してこのサンプルXMLファイルを処理すると、XML Schemaエラーを生成します。

DTD2Schema.java

このサンプル・プログラムは、DTD(第1引数)をXML Schemaに変換し、これを使用してXMLファイル(第2引数)を検証します。

report.xml

XSDSetSchema.javaプログラムを使用して、XML Schema定義ファイルreport.xsdに対してXML Schema Processor for Javaが検証するサンプルXMLファイル。

report.xsd

XSDSetSchema.javaプログラムに入力されるXML Schema定義のサンプル・ファイル。XML Schema Processor for Javaはreport.xsdのXML Schema仕様を使用して、report.xmlのコンテンツを検証します。

report_e.xml

XML Schema Processor for JavaがXSDSample.javaを使用してこのサンプルXMLファイルを処理すると、XML Schemaエラーを生成します。

XSDSample.java

XML Schema Processor for Javaのサンプル・プログラムです。

XSDSetSchema.java

この例をcat.xsdおよびcatalogue.xmlで実行すると、XML Schema Processor for Javaはcat.xsdのXML Schema仕様を使用して、catalogue.xmlのコンテンツを検証します。

XSDLax.java

この例ではSCHEMA_LAX_VALIDATIONを使用します。

embeded_xsql.xsd

XSDLax.javaの入力ファイルです。

embeded_xsql.xml

XSDLax.javaからの出力ファイルです。


サンプル・プログラムを実行するには、次の手順を実行します。

  1. makeプログラムを実行して、.classファイルを生成します。

  2. xmlparserv2.jarおよび現在のディレクトリをCLASSPATHに追加します。

次の手順は任意の順序で実行できます。