|
JAVA Developer 2003年11月号より転載
●属性リスト宣言
開始タグの中で指定する属性は、属性リスト宣言で記述します(図10)。<!ATTLISTではじまり、>までが属性リスト宣言です。
図10 属性リスト宣言
図10では1つの属性だけを宣言していますが、1つの宣言文の中に複数の属性を記述できます。
<!ATTLIST price
unit CDATA #IMPLIED
tax (inclusive|
exclusive)
#REQUIRED>
|
属性型は、文字列型(CDATA)、識別子(ID)、識別子参照(IDREF、IDREFS)、名前トークン(NMTOKEN、NMTOKENS)、実体名(ENTITY、ENTITIES)のいずれかです。
属性のデフォルトは、属性の性質を示すものです。その属性が必須(#REQUIRED)、任意(#IMPLIED)、固定(#FIXED)か、その属性のデフォルト値を指定できます。固定の場合にはその値を指定します。たとえば、unit属性を必ず"円"とする指定は次のように記述します。
<!ATTLIST price
unit CDATA #FIXED
"円">
|
●実体宣言
XML文書の中で、参照する実体を宣言します。実体宣言には、内部実体と外部ファイルを参照する外部実体があります。ここでは、内部実体宣言を見ていきましょう(図11)。<!ENTITYからはじまり、実体名と実体値を空白で区切り、>で終わります。
図11 内部実体宣言
また、DTD内でのみ利用できるパラメータ実体を定義することも可能です。書式は、実体名の前に「%」と空白を記述するだけです。たとえば、次のように記述することができます。
<!ENTITY % DEFATTRIB "CDATA
#IMPLIED">
|
パラメータ実体に対して、XML文書で利用できる実体宣言を一般実体といいます。
●DTDの問題
このようなDTDですが、次のような問題があることから、最近ではXML Schemaのような新しいスキーマ言語の利用が増えてきています。
(1)数値や文字といったいわゆるデータ型を定義できない
(2)名前空間に対応していないため、要素の階層構造を正しく表現できない場合がある
(3)XMLと文法が異なる
DTDは、XML文書から生成することが可能です。いちから記述するよりは、ツールを使って生成するほうが簡単かつ正確です。このようなことから、DTDに関しては正しく読み取れるようになることを心がけるとよいでしょう。
●XML Schema
XML Schemaは、2001年5月に勧告が発表されたXMLのスキーマ言語の1つです。XML Schema自身もXML文書です。なお、XML Schemaの仕様は、残されたページでは紹介しきれません。ここでは、最小限の記述についてのみ解説します。
図12は、DTDとそれに相当するXML Schemaの例です。XML Schemaによる文書型定義では、(1)のxs:schema要素がルート要素となります。また、すべての要素名はxs接頭辞付きで記述します。
|
図12 DTDとXML Schema
|
DTD
<?xml version='1.0'?>
<!ELEMENT isbn (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT page (#PCDATA)>
<!ELEMENT size (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT writer (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (isbn|price|page|size|publisher|writer|title)*>
<!ELEMENT name (#PCDATA)>
<!ELEMENT category (item|name)*>
<!ELEMENT book (category)*>
XML Schema
<?xml version='1.0'?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> (1)
<xs:element name="book"> (2)
<xs:complexType> (3)
<xs:sequence>
<xs:element ref="category" /> (4)
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="category">
<xs:complexType>
<xs:sequence>
<xs:element ref="name" />
<xs:element ref="item" maxOccurs="unbounded" /> (5)
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name">
<xs:simplexType> (6)
<xs:restriction base="xs:string"> (7)
<xs:maxlength value="64" /> (8)
</xs:restriction>
</xs:simplexType>
</xs:element>
<!--途中省略-->
</xs:schema>
|
(2)は、文書型定義の対象となる文書の要素(ルート要素)の定義です。要素の定義は、このxs:element要素で行います。ここではname属性を使って要素名であるbookを定義しています。
(3)xs:complexType要素は、(2)で定義する要素が、複合型であることを定義します。複合型は、子要素や属性を持つことができるデータ型です。反対に子要素や属性を持たないデータのことを単純型といいます。
(4)のxs:element要素は、book要素の子要素であるcategory要素を定義するものです。ここではname属性ではなく、ref属性で要素名を指定しています。このref属性は、要素や属性の参照先の名前を指定する属性です。
(5)は(4)の参照先のcategory要素定義です。category要素は、name要素とitem要素を子要素として持ち、(6)および(7)でその定義をしています。
(7)のmaxOccurs属性は、最大出現回数を指定するものです。unboundedという値は、制限がないことを意味します。このmaxOccurs属性とセットで使われることが多いのが、最小出現回数を指定するminOccurs属性です。この2つの属性を省略した場合はそれぞれ1回となり、その要素は、必ず1回出現することを定義したことになります。表2は、DTDの出現頻度文字と、それに対応するXML SchemaのminOccurs属性とmaxOccurs属性の組み合わせを示したものです。
表2 DTDの出現頻度文字とXML Schemaの属性指定
| DTD |
XML Schema |
| ? |
minOccurs="0"
maxOccurs="1" |
| + |
minOccurs="1"
maxOccurs="unbounded" |
| * |
minOccurs="0"
maxOccurs="unbounded" |
(8)はname要素の定義です。type属性は、要素のデータ型を指定するもの。その値には、XML Schemaの定義型かユーザー定義型を指定することができます。(8)で指定されているxs:stringは、文字列型を意味しています。
XML Schemaについて簡単に解説しましたが、XML Schemaの表現力の一端はおわかりいただけたと思います。
関連リンク
JAVA Developer
定期購読のご案内
バックナンバー販売協力店
|
JAVA Developer 11月号
大特集
DBチューニング大会
特集2 AS徹底解説番外編
[特別企画]
・動的画像生成
・DOMの基本テクニック
・目指せ最強! 最速! CodeRally
・WS-Iの最新事情レポート
|
|