目次へ

3.2 well-formed と valid

XML文書には、2つの形式があります。well-formedとvalidです。

well-formed 形式は、日本語で整形式とよばれます。XML宣言があり、要素がきちんと入れ子構造になっているなど、ごく基本的な形式が整えられているXML文書のことを指します。よって、well-formed XML文書には、DTDがない場合があります。以下に、well-formed XML文書の例を示します。

 <?xml version="1.0" >
 <body>これは、整形式<strong>XML文書</strong>の例です。</body>

well-formed XML文書に対して、DTDを持ち、DTDに示す制約条件を満たす場合、そのXML文書はvalidであるといいます。 日本語では妥当な文書といいます。
validなXML文書の例を以下に示します。

 <?xml version="1.0"encoding=Shift-JIS standalone=yes >
 <!DOCTYPE body [
 <!ELEMENT body (#PCDATA, strong*)>
 <!ELEMENT strong (#PCDATA)>
 ]>
 <body>これは、妥当な<strong>XML文書</strong>の例です。</body>

それでは、整形式のXML文書というものがなぜ、必要なのでしょうか。XMLの親言語であるSGMLにおいては、基本的に、DTDを明示することが原則でした。しかし、実際にSGMLでは、多くの事例において、互いに矛盾する経験的な規範が存在するなどの理由で厳密な規定を策定できないという問題がおきていました。そのため、DTDによる厳密な規定を必須とすることが弊害になっていました。また、XMLにDTDが記述されている場合、XMLプロセッサは文書を解釈する前にXML文書の構造を把握することができ、DTDに従わない記述があった場合、エラーを返します。しかし、場合によっては、このような厳密な定義を逐一解釈するのは、冗長にも思われます。XMLでは、このような問題を、DTDを含まない文書も許すということで、解決しています。これにより、SGMLより柔軟な言語であるといえます。

3.3 DOCTYPE宣言

DTDは、 DOCTYPE宣言によって定義されます。

DOCTYPE宣言は '<!DOCTYPE' 文字列より始まり、'>'で終わります。次にDOCTYPE、スペースに続いて、ルート要素の名前が記述されます。XMLプロセッサはこの記述よりルート要素を認識し、データの木構造の解析を行います。それに続くのが、XMLの構造を記述する部分となります。この部分は、マークアップ宣言と呼ばれ、以下の4つの種類があります。

要素型宣言 

要素の形式を宣言するもの。要素の名前と要素の内容がどのような構造になっているかを宣言している。

属性リスト宣言

属性の形式を宣言するもの。親の要素名、属性名、属性のとりうる値、デフォルトの値などの情報からなる。

エンティティ宣言

エンティティの形式を宣言するもの。エンティティ名と、置き換えたい文字や文字列、あるいは取り込みたい外部のファイルなどの情報からなる。エンティティについては、6章を参照。

記法宣言

外部のファイルとして参照するエンティティがXML以外の記法(Tex、 EPS、 GIF、 BMPなど)を使っている場合、その記法を識別するための名前などを指定。記法宣言については、6章を参照。

以下に、DOCTYPE宣言の例を示します。

 
 <!DOCTYPE body [ 
 <!ELEMENT body (#PCDATA,date)>
 <!ELEMENT date (#PCDATA)>
 <!ATTLIST date datatype NOTATION (UTF) #REQUIRED>
 <!NOTATION UTF PUBLIC "ISO/IEC 8601//NOTATION Universal Time Format //EN">
 <!ENTITY Name "Ayako Ono">
 ]>

以上のDOCTYPE宣言に準拠するように記述したXML文書は以下のようになります。

  <body>今日は<date datatype="UTF">2001-04-12</date>です。私の名前は、&Name;です。</body>
   

3.3の例では、DOCTYPE宣言内に直接DTDを記述していました。それ以外に、DTDを別ファイルに記述し、DOCTYPE宣言内でファイル群を指定する方法があります。別ファイルとして参照される宣言群のことをDTDの外部サブセットといいます。対して、DOCTYPE宣言中に直接記述されるDTDをDTDの内部サブセットといいます。以下に、外部サブセットを使用した場合のDOCTYPE宣言の例を示します。

	
	<!DOCTYPE memo SYSTEM "memo.dtd">
	

また、DOCTYPE宣言中には、DTDの外部サブセットと内部サブセット、両方指定することも可能です。以下にその例を示します。

  <!DOCTYPE memo SYSTEM "memo.dtd" [
  <!ATTLIST memo date CDATA >
  ]>
			

上の例では、memo.dtdに定義されている要素や属性のほかに、新たにdate属性を追加で定義したことになります。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp