この章の内容は次のとおりです。
XML Schemaは、XML自体を使用してXML文書のコンテンツおよび構造を記述するためにW3Cで作成されました。XML Schemaには、Document Type Description(DTD)のほとんどの機能(entity
はサポートされません)と、追加の機能があります。
DTDは、XMLマークアップの制約を宣言するためのXML 1.0で提供されるメカニズムです。DTDでは次の指定が可能です。
XML文書で使用できる要素または属性
要素内に含まれる要素または属性
要素または属性の表示順序
DTDはXMLマークアップ宣言としても知られています。
XML Schema言語はDTDと同様の役割を果しますが、XML文書の制約を指定する際の柔軟性が高く、アプリケーションによってはさらに便利な場合があります。XML Schemaでは、要素と属性の名前空間とデータ型がサポートされます。
XML Schemaは、XML Schema Definition(XSD)とも呼ばれます。
DTDには継承制限があるため、W3CではXML Schemaを推奨しています。XML Schemaを使用すると、型情報や制約を指定できます。
表5-1に、XML Schemaの機能とDTDの機能の比較を示します。ほとんどのXML Schemaの機能にはDTDの機能が含まれていることに注意してください。
表5-1 XML Schemaの機能とDTDの機能の比較
XML Schemaの機能 | DTDの機能 |
---|---|
組込みデータ型 XML Schemaでは組込みデータ型のセットを指定します。その一部は定義済のコールされるプリミティブ・データ型であり、次の型システムの基本となります。
他にはプリミティブ型で定義される派生データ型があります。 |
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> 制約ファセットは次のとおりです。
一部のファセットのみが特定のベース型に適用されます。 |
DTDの例のpublish-year要素をさらに制約することはできません。
|
出現インジケータ(コンテンツ・モデルまたは構造) XML Schemaでは、インスタンス・ドキュメントの構造( データ型と同様、 XML Schemaでの型宣言と定義のメカニズムは、DTDよりもはるかに柔軟性が高く、高性能です。 |
要素内の子要素の数に関するDTDの制御は、次の記号を使用して指定されます。
|
ID制約 XML Schemaは、一意の宣言であるキーおよびキー参照によって、XML ID/IDREFメカニズムの概念を拡張します。これらは型定義の一部であり、属性のみではなく、要素コンテンツもキーとして許可します。各制約には制約が保持する有効範囲があり、字句文字列ではなく値で比較されます。 |
|
インポートとエクスポートのメカニズム(スキーマのインポート、挿入および変更) スキーマのすべてのコンポーネントは、1つのスキーマ・ファイルで定義する必要はありません。XML Schemaでは複数のスキーマを組み合せるメカニズムが提供されます。インポートは異なる名前空間のスキーマを統合するために使用されますが、挿入は同じ名前空間のコンポーネントを追加するために使用されます。挿入時に再定義を使用してコンポーネントを変更することもできます。 |
外部スキーマに定義された構成は使用できません。 |
Oracle XDK Javaコンポーネントを構成するXML Schema Processor for Javaには次の機能があります。
2001年5月2日のW3CのXML Schema仕様の勧告を完全にサポートしています。
XML Schema Part 0: Primer
XML Schema Part 1: Structures
XML Schema Part 2: Datatypes
ストリーム(SAX)処理、一定のメモリー使用量、線形処理時間をサポートしています。
XML Parser for Java v2に統合されています。
図5-1に示すように、OracleのXML Schema Processor for Javaでは2つの主なタスクを実行します。
ビルダー(XSDBuilder
)が、XMLスキーマ文書からスキーマを集め、DOMまたはSAXパーサーにXMLスキーマ・オブジェクトを渡します。
スキーマ・バリデータはスキーマを使用して、DOMまたはSAXパーサーで読み取られたXMLインスタンス・ドキュメントを検証します。
これらの結果は、DOMビルダーまたはアプリケーションに渡されます。
エラー・メッセージがスキーマ・バリデータによって出力されます。
XML Schemaを使用してXML文書のクラスを定義できます。インスタンス・ドキュメントは、特定のスキーマに準拠するXML文書を記述します。
これらのインスタンスおよびスキーマは、特に文書として存在する必要はありませんが、一般的にファイルと呼ばれます。次のいずれかの形式で存在します。
バイトのストリーム
データベース・レコード内のフィールド
XML Information setの情報項目のコレクション
スキーマを構築する際、ビルダーは最初に内部スキーマ・オブジェクトをコンパイルし、DOMパーサーをコールして、スキーマ・オブジェクトを対応するDOMツリーに解析します。
バリデータは、インスタンス・ドキュメントのSAXパーサーとアプリケーション間のフィルタとして機能します。バリデータはインスタンス・ドキュメントのSAXイベントを入力として受け取り、スキーマと照らし合せて検証します。バリデータが無効なXMLコンポーネントを検出すると、エラー・メッセージが送信されます。
バリデータの出力は次のとおりです。
入力SAXイベント
バリデータが提供するデフォルト値
スキーマ検証後(PSV)の情報
XML Schema Processor for JavaのAPIは簡単です。次のいずれかを使用できます。
XSDBuilder
を使用して明示的にスキーマを構築し、XSDSetSchema.java
に示すXMLParser
のスキーマを設定します。
XSDBuilder
を使用して検証用のコンパイル済スキーマを明示的に設定しない場合は、インスタンス・ドキュメントで正しいxsi:schemaLocation
属性がスキーマ・ファイルを示すようにします。それ以外の場合、検証は実行されません。
xmlclean
に類似したクリーンアップ・コールはありません。新しいXML文書を検証する前にすべてのメモリーを解放して、状態をリセットする必要がある場合、コンテキストを終了してもう一度やりなおします。
表5-2に、/xdk/demo/java/schema
ディレクトリで提供されるXML Schema Processor for Javaのサンプル・ファイルを示します。
表5-2 XML Schemaのサンプル・ファイル
ファイル | 説明 |
---|---|
cat.xsd |
|
catalogue.xml |
|
catalogue_e.xml |
XML Schema Processor for Javaが |
DTD2Schema.java |
このサンプル・プログラムは、DTD(第1引数)をXML Schemaに変換し、これを使用してXMLファイル(第2引数)を検証します。 |
report.xml |
|
report.xsd |
|
report_e.xml |
XML Schema Processor for Javaが |
XSDSample.java |
XML Schema Processor for Javaのサンプル・プログラムです。 |
XSDSetSchema.java |
この例を |
XSDLax.java |
この例では |
embeded_xsql.xsd |
|
embeded_xsql.xml |
|
サンプル・プログラムを実行するには、次の手順を実行します。
make
プログラムを実行して、.class
ファイルを生成します。
xmlparserv2.jar
および現在のディレクトリをCLASSPATH
に追加します。
次の手順は任意の順序で実行できます。
XXX.xml
ファイルでサンプル・プログラムを実行します。
java XSDSample report.xml java XSDSetSchema report.xsd report.xml java XSDLax embeded_xsql.xsd embeded_xsql.xml
XML Schema Processor for Javaはreport.xsd
のXML Schema仕様を使用して、report.xml
のコンテンツを検証します。
catalogue.xml
ファイルで各サンプル・プログラムを実行します。次に例を示します。
java XSDSample catalogue.xml java XSDSetSchema cat.xsd catalogue.xml
XML Schema Processor for Javaは、cat.xsd
のXML Schema仕様を使用して、catalogue.xmlのコンテンツを検証します。
次に、XML Schemaエラーを検出するサンプルを示します。
java XSDSample catalogue_e.xml java XSDSample report_e.xml
DTDをXML Schemaに変換するサンプルを実行します。
java DTD2Schema dtd2schema.dtd dtd2schema.xml