XML Schema

1.XML Schemaの概要

DTDの問題点
  • XMLの文法規則に従っていないため、DTD独自の文法規則を習得する必要がある。
  • データ型が少ないため、すべて文字データとして扱う。
  • 継承機能がないため、同じような定義を何度も記述する必要がある。
  • 名前空間に対応していない。
XML Schemaの特徴
  • XMLの文法規則に従う
  • データ型が豊富で独自に定義することも可能。要素の階層構造、要素名、属性名、要素や属性データ型を定義する。型の派生機能を用いれば、継承機能を実現できる。
  • XML文書のデータ構造を定義する。
  • 名前空間に対応している。
XML Schemaを定義する際の基本的な手順
  • XML宣言:XML SchemaはXMLの文法規則に従うため、1行目に記述する。
  • スキーマ宣言:XML Schemaの名前空間を宣言する。名前空間は、「http://www.w3.org/2001/XMLSchema」を指定し、名前空間接頭辞は一般的には「xs」を使用する。
  • データ型定義:要素内容や属性値をデータ型として定義する。データ型定義は、内容に文字データのみを持つ「単純型」と内容に子要素のみ持つか、或いは文字データ以外に属性を持つ「複合型」がある。
  • 要素宣言:要素名の指定とデータ型を結びつける。要素宣言には、xs:schema要素を使用する。
  • 属性宣言:属性名の指定とデータ型を結びつける。属性値は必ず単純型を指定する。属性宣言にはxs:attribute要素を使用する。

2.スキーマ宣言

スキーマ宣言の書式
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  スキーマの記述
</xs:schema>

3.データ型定義

単純型:要素内容に文字データしか持たない型で、DTDの要素型宣言の#PCDATAに相当する。

組み込みデータ型

XML Schemaでは、単純型のデータ型が多数用意されている。これらを組み込みデータ型と呼ぶ。
参考資料:XML Schemaで単純型要素を定義する(XML Schemaのデフォルトデータ型部分)

独自に単純型の定義

書式:
<xs:simpleType name="型の名前">
  …
</xs:simpleType>

複合型

要素内容が子要素のみの場合、要素内容が子要素のみで属性を持つ場合、要素内容が混合内容の場合、要素内容が文字データのみで属性を持つ場合は、複合型となる。
書式:
<xs:complexType name="型の名前">
  …
</xs:complexType>

4.要素宣言

要素宣言書式:
 <xs:element name="要素名" type="データ型の名前" />

内容モデルの定義-単純型

単純型では、組み込みデータ型か独自のデータ型を指定する。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!-- 要素宣言 -->
  <xs:element name="売上高" type="xs:integer" />
</xs:schema>
内容モデルの定義-複合型

複合型では、要素やテキストの出現順序、出現回数を定義する。

  • xs:sequence:順番に出現させる。DTDでは「,」に相当する。
  • xs:choice:いずれか1つを出現させる。DTDでは「|」に相当する。
  • xs:all:順不同に1回ずつ出現させる。DTDに相当するものは無い。
  • minOccurs、maxOccurs:出現回数を指定する。
    • minOccurs:要素が出現する最小回数を指定する。minOccurs属性を省略した場合、値は「1」に設定される。「0」を指定すると、要素が省略できることを表す。但し、xs:allの場合は「0」または「1」しか指定できない。
    • maxOccurs:要素が出現する最大回数を指定する。maxOccurs属性を省略した場合、値は「1」に設定される。出現回数を無制限にする場合は、「unbounded」を設定する。但しxs:allの場合は「1」で固定されている。

xs:sequence-出現順序の指定の記述例
xs:choice-1つだけ出現させる指定の記述例
xs:all-すべて出現させる指定の記述例
minOccurs、maxOccurs-出現回数の指定の記述例

要素の参照

要素を参照する場合の書式:
<xs:element ref="参照する要素名" minOccurs="最小出現回数" maxOccurs="最大出現回数" />

<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Product" type="prod"/>
  <xs:element name="ProductNo" type="xs:int" />    
  <xs:element name="ProductName" type="xs:string" />
 
  <xs:complexType name="prod">
    <xs:sequence>
      <xs:element ref="ProductNo" /> 
      <xs:element ref="ProductName" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>

※ モデルグループの中に記述した要素宣言には出現回数を指定できるが、ルート要素の子要素として定義した要素には、出現回数を指定できない。
混合内容

子要素と文字データを持つ要素内容を混合内容と呼ぶ。xs:complexType要素にmixed属性を指定する。
混合内容の書式:
<xs:complexType mixed="{true|false}">
 ・・・
</xs:complex>

空要素

XML Schemaの空要素を宣言するには、xs:complexType要素の内容にモデルグループを記述しないようにする。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="image" type="imgType" />
 
  <xs:complexType name="imgType" />
</xs:schema>

5.属性宣言

属性宣言では、属性名の宣言及び属性の型の指定を行う。属性宣言は、複合型定義のモデルグループの後に記述する。
属性宣言の書式:
<xs:attribute name="属性名" type="データ型の名前" />

  • name:属性名を指定する
  • type:属性値のデータ型を指定する。必ず単純型のデータ型を指定する。
  • use(オプション):属性が省略可能かどうかを指定する。"optional"の場合は省略可能、"required"の場合は必須、"prohibited"の場合は出現禁止
  • default(オプション):デフォルト値を指定する。
  • fixed(オプション):固定値を指定する。
  • default属性と、fixed属性を一緒に指定することはできない。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="x" type="xType"/>
  <xs:element name="a" type="xs:string" />
  <xs:complexType name="xType">
    <xs:sequence>
      <xs:element ref="a" /> 
    </xs:sequence>
    <xs:attribute name="date" type="xs:date" use="required" />
  </xs:complexType>
</xs:schema>

属性定義参照の書式:
<xs:attribute ref="参照する属性名" />
<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="x" type="xType"/>
  <xs:element name="a" type="xs:string" />  
  <xs:attribute name="date" type="xs:date" />
  <xs:complexType name="xType">
    <xs:sequence>
      <xs:element ref="a" /> 
    </xs:sequence>
    <xs:attribute ref="date" />
  </xs:complexType>
</xs:schema>

6.型の派生

XML Schemaは、既存のデータ型を基に新たなデータ型を作成できる。これを派生(derivation)と呼ぶ。型の派生には制限(restriction)拡張(extension)がある。

単純型の制限

単純型制限の基本的な書式       単純型の制限の例
<xs:simpleType>
 <xs:restriction base="基となるデータ型の名前">
   制約ファセット
 </xs:restriction>
</xs:simpleType>

  • xs:simpleType要素:単純型に制限を加えた後のデータ型は単純型。
  • xs:restriction要素:base属性で基のデータ型の名前を指定し、内容に制約ファセットを定義する。
単純型の拡張
  • 単純型に新しい定義を加えて新しいデータ型を定義することができる。
  • 新しい定義として追加できるのは属性宣言の定義(属性宣言の参照)のみである。
  • 単純型を拡張して新しく定義した型は、必ず複合型になる。

単純型の拡張の書式:
<xs:complexType name="型の名前">
 <xs:simpleContent>
  <xs:extension base="基となるデータ型の名前">
    ・・・
  </xs:extension>
 </xs:simpleContent>
</xs:complexType>

  • xs:complexType要素:単純型を拡張して新しく作成したデータ型は複合型となる。
  • xs:simpleContent要素:単純型を値に持つ型を定義する場合、xs:complexType要素の内容にxs:simpleContent要素を記述する。
  • xs:extension要素:base属性で基となる単純型のデータ型の名前を指定し、単純型に追加する定義は、xs:extension要素の内容に記述する。追加できる定義は属性宣言(属性宣言の参照)のみとなる。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="製品名" type="prodType" />
 
  <xs:complexType name="prodType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
         <xs:attribute name="コード" type="xs:string" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:schema>
複合型の制限

複合型に制限を加えて新しいデータ型を作成することができる。既存の複合型定義に制限を加えるのは以下のような場合となる。

  • 要素の出現回数を変更する
  • 属性の出現制約を変更する

複合型に制限を加える書式       複合型の制限の例
<xs:complexType name="型の名前">
 <xs:complexContent>
  <xs:restriction base="基となるデータ型の名前">
   ・・・
  </xs:restriction>
 </xs:complexContent>
</xs:complexType>

複合型の拡張     複合型の拡張の例

基となる複合データ型に、下記のものを追加できる。

  • 要素宣言の追加       
  • 属性宣言の追加

7.単純型の定義

空白で区切られた複数の値の記述-xs:list

xs:listの書式:
<xs:list itemType="データ型" />

<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="果物" type="fruitType"/>
  <xs:complexType name="fruitType">
    <xs:sequence>
      <xs:element name="名前" type="xs:string" />
      <xs:element name="出荷日" type="shipmentType" />
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="shipmentType">
    <xs:list itemType="xs:date" />
  </xs:simpleType>
</xs:schema>

上記のXML Schemaに対し、妥当なXML文書の例:
<?xml version="1.0" encoding="Shift_JIS" ?>
<果物>
  <名前>みかん</名前>
  <出荷日>2004-12-02 2004-12-24</出荷日>
</果物>
複数のデータ型指定の許可-xs:union

xs:unionの書式:
<xs:union memberType="データ型 データ型" />
XML Schema文書の例

<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="出荷日" type="shipmentType"/>
  <xs:simpleType name="strData">
    <xs:restriction base="xs:string">
      <xs:enumeration value="在庫切れ" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="shipmentType">
    <xs:union memberTypes="xs:date strData"/>
  </xs:simpleType>
</xs:schema>

8.要素/属性と型の結び付け

要素宣言/属性宣言とデータ型定義を別々に定義し結び付ける
<?xml version="1.0" encoding="Shift_JIS" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="果物" type="nameType" />
  <xs:element name="お菓子" type="nameType" />
 
  <xs:complexType name="nameType">
    <xs:sequence>
      <xs:element name="名前" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
要素宣言/属性宣言の内容に定義する。
<?xml version="1.0" encoding="Shift_JIS" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="果物">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="名前" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

9.XMLインスタンスのルート要素

  • XMLインスタンスのルート要素は、XML Schema文書のトップレベル要素に記述した要素宣言のいずれかを記述する。
  • XML Schemaに複数のトップレベル要素が定義された時、XML文書のルート要素にトップレベル要素のいずれかを記述することができる。
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License