XML-Schema

Takami Torao XML 1.1 XML Schema 1.1 #XMLSchema
  • このエントリーをはてなブックマークに追加

概要

XML Schema は XML 文書の構造と内容を定義するためのスキーマ言語である。スキーマには XML によるインターフェースを定義し、XML 文書の整合性を検証することでデータの信頼性と相互運用性を高める役割がある。

XML Schema 自体を XML で記述する。

Table of Contents

  1. 概要
  2. 導入
    1. 名前空間の指定
    2. XML Schema 実装系
  3. XML Schema リファレンス
  4. 参照

導入

最も単純な XML Schema は次のような定義である。この XML Schema は右の XML 文書の構造を定義している。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="xsd:string"/>
</xsd:schema>
<?xml version="1.0" encoding="utf-8"?>
<message>
  hello, world
</message>

XML Schema の定義は、XML Schema で定義しようとしている XML 文章の名前空間と、XML Schema 自身の名前空間が混在することに注意。

名前空間の指定

スキーマを定義する XML 文書に明示的な名前空間がある場合は XML Schema でもその名前空間を指定する必要がある。単一の名前空間のみであれば XML Schema での接頭辞は省略しても良い。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
  targetNamespace="https://hazm.at/xsd/greeting"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="xsd:string"/>
</xsd:schema>
<?xml version="1.0" encoding="utf-8"?>
<message xmlns="https://hazm.at/xsd/greeting">
  hello, world
</message>

単一の名前空間でも明示的に接頭辞を示す場合や、一つの XML Schema で複数の名前空間の XML 文書を定義する場合は、XML Schema に接頭辞を追加することができる。XML Schema 実装系は、下記の greeting:messagexsd:string のように属性値に指定された要素名や属性名の接頭辞を認識する。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
  targetNamespace="https://hazm.at/xsd/greeting"
  xmlns:mox="https://hazm.at/xsd/mox"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="mox:string"/>
</xsd:schema>

XML Schema 実装系

実装系としての XML Schema は XML 文書の検証機能を提供する。以下の Java プログラムはコマンドラインで指定した XML Schema ファイルに基づいて標準入力から得られる XML 文書を検証する。

import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

public class Validate {
  public static void main(String[] args) throws Exception {
    SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = factory.newSchema(new StreamSource(new File(args[0])));
    Validator validator = schema.newValidator();
    validator.validate(new StreamSource(System.in));
  }
}

XML Schema リファレンス

id 属性や xml:lang 属性などは省略している。

<xsd:schema>

http://www.w3.org/2001/XMLSchema

XML Schema によるスキーマのルート要素を定義する。

属性名 属性値 デフォルト 意味
attributeFormDefault "qualified" | "unqualified" unqualified ターゲット名前空間の属性をプレフィクスで修飾する必要があるか。
blockDefault "list" | "union" | "restriction" | "#all" なし ターゲット名前空間の block 属性のデフォルト値。
elementFormDefault "qualified" | "unqualified" unqualified ターゲット名前空間の要素をプレフィクスで修飾する必要があるか。
finalDefault "extension" | "restriction" | "substitution" | "#all" なし ターゲット名前空間の final 属性のデフォルト値。
targetNamespace URI なし ターゲット名前空間の URI。
version ”1,0" なし この XML Schema の対応バージョン。

targetNamespace 属性は現在のスキーマで定義しようとしている要素や属性の名前空間を指定する。

blockDefault 属性は extension や restriction, substitution によって派生したデータ型が派生元のデータ型の代わりに使用できるかを設定する。この blockDefault 属性を指定しておくことで定義したデータを意図せず派生したデータ型で上書きされることを防ぐことができる。この設定を個別に行う場合は <xsd:element> や <xsd:complexType> の block 属性を使用することができる。

finalDefault 属性は <xsd:simpleType>, <xsd:complexType> で定義したデータ型を派生させることを禁止することができる。この finalDefault 属性を指定しておくことで定義したデータを意図せず派生したデータ型で上書きされることを防ぐことができる。この設定を個別に行う場合は <xsd:element> や <xs:complexType> の final 属性を使用することができる。

<xsd:element>

http://www.w3.org/2001/XMLSchema

要素を定義する。

属性名 属性値 デフォルト 意味
abstract "true" | "false" false 抽象型かどうか。
block なし
default 文字列 なし 要素のデフォルト値を指定する (simple 型またはテキストの場合のみ)。
final なし
fixed 文字列 なし 要素の固定値を指定する (simple 型またはテキストの場合のみ)。
form なし
maxOccurs 整数 1 親要素の中でこの要素が出現できる最大回数。親要素が schema の場合は指定できない。
minOccurs 整数 1 親要素の中でこの要素が出現できる最小回数。親要素が schema の場合は指定できない。
name なし 要素名。親要素が schema の場合は必須。
nillable "true" | "false" false 子ノードに null を指定できるか。
ref なし 他の要素の名前。親要素が schema の場合は使用できない。
substitutionGroup なし
type なし 組み込み型、simpleType、complexType の名前のいずれか。

abstract 属性が true の場合、要素は派生させる必要があり、要素そのものを XML 文書内で使用することはできない。

default 属性、fixed 属性はそれぞれデフォルト値と固定値を指定する。両方を指定することはできない。

nillable 属性を true にした場合、XML 文書内で xsi:nil 属性を指定して要素の内容を null に設定することができる。

参照

  1. W3C: XML Schema