[ PROGRAM ]

XML

XML プログラミング

2012/02/10 Tomohiro Kumagai

□ XML スキーマの書き方

XML では、DTD や XML スキーマを使って、文書の構造を定義できるようになっています。

ここでは、XML スキーマを使って文書の構造を定義する方法について見ていきます。DTD で構造を定義する方法については DTD の書き方 を参考にしてください。

 

ここで作成した XML スキーマファイルは、XML ファイルに読み込むことで、XML スキーマで定義した内容と XML とを関連付けることができます。

XML スキーマファイルを XML に適用する方法については XML スキーマを XML 文書に取り込む に記します。

書き方の基本

 

XML スキーマファイルの基本的な書き方について整理すると、まずは <?xml> タグでの XML 冒頭表記出始めて、ルートタグとして <xsd:schema> を用意します。このときの接頭辞 xsd は、名前空間 "http://www.w3.org/2001/XMLSchema" として "xmlns" 属性で定義します。

そして "targetNamespace" 属性で、この XML スキーマが所属する名前空間名を指定します。名前空間名は任意のものでいいようですけど、一般的な感じだと 'http://' からなる URL のような感じになるようです。ちなみにこの URL は存在している必要はありません。また、この "targetNamespace" で指定した名前空間も <?xml> タグ内で "xmlns" 属性で接頭辞を定義する必要があります。

 

この辺りを考慮して、たとえば "targetNamespace" を "http://xxx.xx.jp/ns/schema" で、その接頭辞を "xxx" とした場合、原則的な雛形は、次のような感じになります。

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema

targetNamespace="http://xxx.xx.jp/ns/schema"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:xxx="http://xxx.xx.jp/ns/schema"

>

</xsd:schema>

そしてこの <xsd:schema> 内の要素として、XML 文書の構造を定義して行きます。

データ型

XML スキーマには、いくつかのデータ型が用意されています。

たくさんのデータ型があるようですけど、基本的なものを挙げると次のような感じです。

xsd:integer 整数値を意味します。
xsd:positiveInteger 1 以上の整数値を意味します。
xsd:nonNegativeInteger 0 以上の整数値を意味します。
xsd:nonPositiveInteger 0 以下の整数値を意味します。
xsd:negativeInteger 0 未満の整数値を意味します。
xsd:decimal 正負の整数や小数点数 (10 進数) を意味します。
xsd:boolean 真偽値 (true, false, 1, 0) を意味します。
xsd:string 文字列を意味します。
xsd:date 日付を意味します。2012-02-09 といった表記になるようです。
xsd:time 時刻を意味します。17:18:00.000-09:00 といった表記になるようです。

この他にも、たとえば次のような、より厳密な型も用意されています。

xsd:int 正負の 32 ビット整数値 (-2147483648 から 2147483647 まで) を意味します。
xsd:long 正負の 64 ビット整数値 (-9223372036854775808 から 9223372036854775807 まで) を意味します。
xsd:byte 正負の 8 ビット整数値 (-128 から 127 まで) を意味します。
xsd:unsignedInt 正の 32 ビット整数値 (0 から 4294967295 まで) を意味します。
xsd:float 単精度 (32 ビット) 浮動小数点数を意味します。
xsd:double 倍精度 (64 ビット) 浮動小数点数を意味します。
xsd:base64Binary Base64 エンコードされた文字列を意味します。
xsd:hexBinary 16 進数文字表記を意味します。
xsd:anyURI URI 形式の文字列を意味します。'http://xxx.xx.jp/' というような表記になります。

互換性のために DTD と互換のデータ型も用意されています。たとえばこちらは次のような感じです。

xsd:ID DTD の ID 型です。この型を異なる属性に設定しても XML 文書全体で重複してはいけないことに注意します。
xsd:IDREF DTD の IDREF 型です。
xsd:ENTITY DTD の ENTITY 型です。

データ型は他にもたくさんありますけど、このようなデータ型を指定して、要素の値を定義して行く形になります。

データ型を定義する

XML スキーマでは、上記のデータ型以外にも、自分でデータ型を定義することができます。

自分で作るデータ型は、大きく分けて "simpleType" と "complexType" とがありますが、基本的には "complexType" で定義することになるかもしれません。

既定のデータ型に属性を追加するようなときに "simpleType" を使うような感じですけど、それについては テキストと属性を持つ要素を定義する の方で記すとして、ここでは "complexType" によるデータ型の定義について記したいと思います。

 

まず "complexType" というのは、内に子要素を持つデータ型です。

たとえば、内部に <サイト> と <著作権> という要素を持つデータ型 "基本情報型" を定義する場合、次のような感じになります。

<xsd:complexType name="基本情報型">

<xsd:sequence>

<xsd:element ref="xxx:サイト" />

<xsd:element ref="xxx:著作権" />

</xsd:sequence>

</xsd:complexType>

このように <xsd:complexType> タグの "name" 属性で、データ型に名前をつけます。

続く <xsd:sequence> で、その中に記載された要素が順番に登場することとして、その中の <xsd:element> で、登場する要素を記載しています。ここで、もし要素のどれかが現れればいい場合には <xsd:sequence> ではなく <xsd:choice> とします。

登場する要素の定義では、ここでは <xsd:element> の "ref" 属性で登場する要素名を指定しています。これにより、たとえば最初の "xxx:サイト" であれば、要素 <サイト> は別のところで定義された記載方法に従います。ここでの注意点としては、"targetNamespace" につけた接頭辞を、要素名につける必要があるところでしょうか。

このような感じで、データ型の定義ができました。

要素を定義する

データ型が定義できれば、XML スキーマでの要素の定義は簡単です。

<xsd:element name="基本情報" type="xxx:基本情報型" />

このようにすることで、データ型 "基本情報型" のルールに従った要素 <xxx:基本情報> を定義することができました。

なお、このときの要素名の前の接頭辞 "xxx" は、XML スキーマを取り込むときに、この要素を定義している名前空間に付けた接頭辞になります。

 

また、同様の定義を、わざわざ "complexType" に名前をつけてそれを "element" で指定するという方法ではなく、次のように一括で定義することも可能です。

<xsd:element name="基本情報">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref="xxx:サイト" />

<xsd:element ref="xxx:著作権" />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

これならわざわざ、ある要素に固有の定義に名前をつけなくて済むので便利です。

 

他、たとえばタグ内にテキストを持つ要素を定義したい場合には、データ型として "xsd:string" を指定します。

<xsd:element name="著作権" type="xsd:string" />

これで "<xxx:著作権>著作者の名前</xxx:著作権>" というようなタグが実現できました。

要素に属性を持たせる

XML スキーマで、要素に属性を持たせたい場合には "complexType" を使って定義します。

たとえば先ほどの <基本情報> 要素に "種類" 属性を持たせて <基本情報 種類=""> というような使い方をしたい場合には、"complexType" の定義の中に "attribute" 要素を記載します。

<xsd:complexType name="基本情報型">

<xsd:sequence>

<xsd:element ref="xxx:サイト" />

<xsd:element ref="xxx:著作権" />

</xsd:sequence>

<xsd:attribute name="種類" type="xsd:string" use="required" />

</xsd:complexType>

このように "complexType" の子要素として "attribute" 要素を指定すると、その "name" 属性で指定した名前の属性を定義することができます。

"type" 属性では、その属性のデータ型を指定します。ここでは "xsd:string" を指定しているので、文字列を取る属性ということになります。

また、"use" 属性では、その属性の値を設定する必要があるかを指定します。

  • "required" の場合は、必ず指定する必要があります。
  • "optional" の場合は省略可能です。このときに "default" 属性も定義されていると、その属性の値が指定されたことになります。
  • "prohibited" の場合は、その属性が指定されていてはいけないことになります。

他にも "fixed" 属性というのがあり、これが指定されている場合は、その属性値はかならずそこで指定した値でなくてはいけなくなります。"use" 属性で "optional" が指定されている場合には、属性値が省略された場合には、この "fixed" で指定された値が指定されたこととなります。

要素の登場回数を定義する

XML スキーマでは、要素の登場回数を次のように "minOccurs" や "maxOccurs" で定義します。

<xsd:element name="ショップ一覧">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref="acm:ショップ" minOccurs="0" maxOccurs="unbounded" />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

ここで、"minOccurs" は、その要素が登場する最小回数を定義します。そして "maxOccurs" では、その要素の最大登場回数を定義しています。どちらとも、省略時には "1" が指定されたことになります。

また、"maxOccurs" では "unbounded" という値を指定でき、これを指定すると、登場する数に上限はないという意味合いになります。

 

つまりたとえば、指定した要素が存在しなくてもいい場合は minOccurs="0" を、好きな数だけその要素を繰り返してもいい場合は maxOccurs="unbounded" という感じになります。


[ もどる ]


 

カスタム検索

copyright © Tomohiro Kumagai @ EasyStyle G.K.
contact me: please from mail-form page.