XMLスキーマは、 XMLドキュメントのタイプを記述したもので、通常はXML自体が課す基本的な構文上の制約を超えて、そのタイプのドキュメントの構造と内容に関する制約として表現されます。これらの制約は一般的に、要素の順序を規定する文法規則、内容が満たさなければならないブール述語、要素と属性の内容を規定するデータ型、および一意性や参照整合性制約などのより特殊な規則の組み合わせを使用して表現されます。[ 1 ]
XMLスキーマを表現するために特別に開発された言語があります。XML仕様に固有の文書型定義(DTD)言語は、比較的機能が限定されたスキーマ言語ですが、スキーマの表現以外にもXML内で他の用途があります。広く使われている、より表現力の高いXMLスキーマ言語としては、XML Schema(大文字のS)とRELAX NGがあります。
XML文書とスキーマを関連付ける仕組みは、スキーマ言語によって異なります。関連付けは、XML文書内のマークアップによって行われる場合もあれば、外部の手段によって行われる場合もあります。
XMLスキーマ定義は一般的にXSDと呼ばれます。
XML文書がスキーマに準拠しているかどうかを確認するプロセスは検証と呼ばれ、これはXMLの中核概念である構文の整形式性とは別個のものです。すべてのXML文書は整形式である必要がありますが、XMLパーサーが「検証」機能を持つ場合を除き、文書が有効である必要はありません。検証機能を持つ場合、文書は関連付けられたスキーマへの準拠もチェックされます。DTD検証パーサーが最も一般的ですが、XMLスキーマやRELAX NGをサポートするものもあります。
インスタンス文書をスキーマに照らして検証することは、概念的にはXML解析とは別の操作とみなすことができます。しかし実際には、多くのスキーマ検証ツールはXMLパーサーと統合されています。
XMLスキーマを定義するための言語はいくつか存在する。それぞれの言語には長所と短所がある。
スキーマ言語の主な目的は、XMLドキュメントの構造を規定することです。つまり、どの要素が他のどの要素内に存在できるか、特定の要素にどのような属性を持たせることが許容され、どのような属性を持たせることが許容されないかなどを規定します。スキーマは言語の文法に相当します。スキーマは、その言語の語彙や有効な「文」とは何かを定義します。
XMLスキーマ言語には、歴史的なものと現在のものがある。
主な言語(ISO 19757で承認されている言語も参照)については、以下で説明します。
スキーマ言語は数多く存在するが、主要な3つは文書型定義(DTD)、W3C XMLスキーマ、そしてRELAX NGである。それぞれの言語には長所と短所がある。
DTDは、XMLにおいて最も広くサポートされているスキーマ言語と言えるでしょう。DTDはXMLのスキーマ言語の中でも初期のもので、XMLが名前空間をサポートするようになる以前に定義されたため、広く普及しています。内部DTDはXMLプロセッサでサポートされていることが多く、外部DTDはそれほど多くはありませんが、その頻度はわずかです。複数のXML技術をサポートする大規模なXMLパーサーのほとんどは、DTDもサポートしています。
XSDには搭載されているがDTDには搭載されていない機能は以下のとおりです。
XSDスキーマは慣例としてXMLドキュメントとして記述されるため、使い慣れた編集ツールや変換ツールを使用できます。
XSDは検証機能に加え、XMLインスタンスに型情報(スキーマ検証後情報セット(PSVI))を付加することも可能にします。これは、アプリケーションプログラムにおけるXMLインスタンスの操作を容易にすることを目的としています。具体的には、XSDで定義された型をJavaなどのプログラミング言語の型にマッピングする(「データバインディング」)か、XSLTやXQueryなどのXML処理言語の型システムを拡張する(「スキーマ認識」)ことで実現できます。
RELAX NGとW3C XML Schemaは、同様の特異性メカニズムを備えています。どちらも、スキーマを複数のファイルに分割するなど、言語にある程度のモジュール性を持たせることができます。また、どちらもXML言語で定義されているか、または定義可能です。
RELAX NGにはPSVIに相当するものはありません。W3C XML Schemaとは異なり、RELAX NGは検証と拡張(型情報とデフォルト値の追加)が分離されるように設計されています。
W3C XML Schemaには、XMLドキュメントにスキーマを添付するための正式なメカニズムがありますが、RELAX NGはセキュリティと相互運用性の理由から、意図的にそのようなメカニズムを避けています。
RELAX NG には、要素の属性リストにデフォルトの属性データを適用する機能 (つまり、XML 情報セットを変更する機能) はありませんが、W3C XML Schema にはそれがあります。繰り返しますが、この設計は意図的なものであり、検証と拡張を分離するためのものです。[ 9 ]
W3C XML Schemaには、豊富な「単純型」システムが組み込まれています(xs:number、xs:dateなど、およびカスタム型の派生)。一方、RELAX NGは、独自の型ライブラリを開発するのではなく、RELAX NGとは独立して開発された型ライブラリを使用することを前提としているため、非常にシンプルなシステムとなっています。これは、一部の人にとっては欠点と見なされています。実際には、RELAX NGスキーマでは、W3C XML Schemaの事前定義された「単純型」と「制約」(パターン、maxLengthなど)を使用するのが一般的です。
W3C XML Schema では、パターンの繰り返し回数や範囲を指定できますが、RELAX NG (<oneOrMore> または <zeroOrMore>) では実際には指定できません。
W3C XML Schema は複雑で習得が難しいが、それは単なる検証以上のことをしようとしているためでもある(PSVI を参照)。
XMLで記述されていることは利点であると同時に、いくつかの点で欠点でもある。特にW3C XMLスキーマ言語は非常に冗長になりがちだが、DTDは簡潔で比較的容易に編集できる。
同様に、WXS のドキュメントとスキーマを関連付ける正式なメカニズムは、潜在的なセキュリティ問題を引き起こす可能性があります。任意のオンラインロケーションへのURIをたどる WXS バリデータの場合、ストリームの反対側から悪意のある何かを読み取る可能性があります。[ 10 ]
W3C XML Schemaは、ドキュメントにデータ要素を提供するというDTDの機能のほとんどを実装していません。
W3C XML Schema が要素にデフォルト属性を追加できる機能は利点である一方、いくつかの点で欠点にもなります。つまり、スキーマが存在しないXMLファイルは、たとえそのスキーマに対して検証に合格したとしても、使用できない可能性があるということです。事実上、そのようなXMLドキュメントを使用するすべてのユーザーは、W3C XML Schema仕様を実装する必要があり、そのため、最小限のXMLパーサーや古いXMLパーサーは使用できなくなります。また、プロセッサが2つ目のXMLファイル(スキーマ)をダウンロードして処理する必要があるため、ドキュメントの処理速度が低下する可能性もあります。ただし、スキーマは通常キャッシュされるため、コストが発生するのは初回使用時のみです。
WXSは、多くの大規模なXML解析パッケージでサポートされています。Xercesと.NET Frameworkの基本クラスライブラリはどちらもWXS検証をサポートしています。
RELAX NGは、W3C XML SchemaがDTDに対して持つ利点のほとんどを提供します。
RELAX NGの言語はXMLで記述できますが、DTDに非常によく似た、より詳細な記述が可能な同等の形式も存在します。この形式はコンパクト構文と呼ばれています。ツールを使えば、機能やコメントを損なうことなく、これらの形式間を簡単に変換できます。RELAX NG XML要素間で指定された任意の要素も、コンパクト形式に変換可能です。
RELAX NGは、順序付けされていないコンテンツに対して非常に強力なサポートを提供します。つまり、スキーマ内で、パターンのシーケンスが任意の順序で出現する可能性があることを記述できます。
RELAX NGは、非決定論的なコンテンツモデルにも対応しています。つまり、RELAX NGでは、次のようなシーケンスを指定できます。
<zeroOrMore> <ref name= "odd" /> <ref name= "even" /> </zeroOrMore> <optional> <ref name= "odd" /> </optional>バリデーターが「奇数」パターンに一致するものに遭遇した場合、データを事前に調べない限り、それがオプションの最後の「奇数」参照なのか、単にzeroOrMoreシーケンス内の1つなのかはわかりません。RELAX NGはこの種の仕様を許可しています。W3C XML Schemaはすべてのシーケンスが完全に決定論的であることを要求しているため、上記のようなメカニズムは別の方法で指定するか、完全に省略する必要があります。
RELAX NGでは、属性をコンテンツモデルの要素として扱うことができます。具体的には、以下のことが可能です。
<element name= "some_element" > <choice> <attribute name= "has_name" > <value> false </value> </attribute> <group> <attribute name= "has_name" > <value> true </value> </attribute> <element name= "name" ><text /></element> </group> </choice> </element>このブロックは、要素「some_element」に「has_name」という名前の属性が必要であることを示しています。この属性は、true または false の値のみを取ることができ、true の場合、要素の最初の子要素はテキストを格納する「name」でなければなりません。「name」が最初の要素である必要がない場合は、他の要素とともに「interleave」要素で囲むことができます。RELAX NG では属性の指定順序に意味がないため、このブロックは要素定義の最初のブロックである必要はありません。
W3C XML Schema では、属性の内容と子要素との間のこのような依存関係を指定することはできません。
RELAX NGの仕様では、組み込み型として文字列とトークンの2種類しか記載されていませんが、実際にはさらに多くの型を定義することが可能です。理論的には、特定の型リストがないことで、プロセッサは問題領域に非常に特化したデータ型をサポートできるようになります。
ほとんどのRELAX NGスキーマは、アルゴリズムによってW3C XMLスキーマやDTDに変換できます(ただし、上記のように、これらの言語でサポートされていないRELAX NG機能を使用する場合は除きます)。逆は成り立ちません。したがって、RELAX NGはスキーマの規範的なバージョンとして使用でき、ユーザーはRELAX NGをサポートしていないツール用に他の形式に変換することができます。
RELAX NGの欠点のほとんどは、W3C XML SchemaがRELAX NGよりも優れている点に関するセクションで説明されています。
RELAX NGがユーザー定義データ型をサポートできるのは便利ですが、ユーザーが利用できるデータ型が2種類しかないという欠点があります。つまり、理論的には、複数のバリデーターでRELAX NGスキーマを使用する場合、そのバリデーターにユーザー定義データ型を提供するか、2種類の基本データ型のみを使用するかのどちらかを選択する必要があります。しかし実際には、ほとんどのRELAX NGプロセッサはW3C XMLスキーマのデータ型セットをサポートしています。
Schematronは、かなり特殊なスキーマ言語です。主要な3つのスキーマ言語とは異なり、XMLファイルの構文をXPathベースのルールリストとして定義します。ドキュメントがこれらのルールを満たしていれば、有効とみなされます。
Schematronはルールベースであるため、非常に高い特異性を持ちます。要素の内容がその兄弟要素によって制御されることを要求したり、ルート要素(それがどのような要素であっても)に特定の属性を持たせることを要求したりすることも可能です。さらに、複数のXMLファイル間の必要な関係性を指定することもできます。
Schematronは関係構造の扱いに優れているものの、ドキュメントの基本構造、つまりどの要素をどこに配置できるかを指定する機能があるため、非常に冗長なスキーマになってしまう。
この問題を解決する一般的な方法は、SchematronとRELAX NGまたはW3C XML Schemaを組み合わせることです。この組み合わせ形式をサポートするスキーマプロセッサは、両方の言語で利用可能です。これにより、SchematronルールでW3C XML SchemaまたはRELAX NGで定義された構造に追加の制約を指定できます。
Schematronのリファレンス実装は、実際にはSchematronドキュメントをXMLファイルを検証するXSLTに変換するXSLT変換です。そのため、Schematronの潜在的なツールセットはあらゆるXSLTプロセッサですが、libxml2はXSLTを必要としない実装を提供しています。Sun MicrosystemsのJava用Multiple Schema Validatorには、Schematronルールが埋め込まれたRELAX NGスキーマを検証できるアドオンがあります。
これは厳密にはスキーマ言語ではありません。その唯一の目的は、検出された要素の名前空間に基づいて、ドキュメントの一部を個々のスキーマに振り分けることです。NRLは、XML名前空間のリストと、それぞれに対応するスキーマへのパスのみで構成されています。これにより、各スキーマは自身の言語定義のみを処理でき、NRLファイルは、要素の名前空間に基づいてスキーマバリデーターを適切なスキーマファイルにルーティングします。
このXML形式はスキーマ言語に依存せず、ほぼすべてのスキーマ言語で機能します。
スキーマという単語の大文字表記について:大文字の「Schema」を使う場合と小文字を使う場合で混乱が生じることがあります。小文字の形式は一般的な用語であり、DTD、XML Schema (別名 XSD)、RELAX NG など、あらゆる種類のスキーマを指す可能性があります。文頭に現れる場合を除き、常に小文字で記述する必要があります。XML コミュニティで一般的に使用されている「Schema」(大文字)の形式は、常にW3C XML Schemaを指します。
スキーマ定義の焦点は、ドキュメントの構造といくつかの意味論です。しかし、データベース、コンピュータプログラム、その他の形式的な構成要素の設計と同様に、スキーマ設計にはスタイル、慣習、可読性に関する多くの考慮事項も含まれます。スキーマ設計の問題に関する詳細な議論は、(例えば)Maler(1995)[ 11 ]やDeRose(1997)[ 12 ]で見ることができます。
includeスキーマのさまざまな部分は、非常に多様な他のスキーマでも再利用されています。言語: