|
JAVA Developer 2003年11月号より転載
文書型宣言は、次の書式で記述します。
ここでの文書型とは、要素や属性の名前、内容の種類など、XML文書がどのような型や構造(ルール)で記述されているかを示すものです。XMLプロセッサは、この文書型宣言を解析して、XML文書が正しいか調べます。
XML文書は、XMLの基本的なルール(たとえば要素の定義など)に適合したものを「整形式(well-formed)」XML文書と呼びます。そして、文書型宣言どおりに記述されたXML文書のことを「妥当(valid)」なXML文書と呼びます。
文書型定義には、直接文書型を記述する方法と、文書型を記述したファイル(外部DTD)を参照する方法があります。
図8は、先に紹介した図4の文書型宣言です。ルート要素名のweb-appのあとに、「PUBLIC」に続けて公開識別子と呼ばれる「"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"」が記述され、文書型を記述したURIであるシステム識別子(http://java.sun.com/dtd/web-app_2_3.dtd)が記述されています。
図8 文書型宣言の例
コラム(1)
Internet ExplorerでXML文書を開く
|
Internet Explorerは、XML文書を読み込み、表示することができます。このとき、XML文書が整形式かどうかが検証されます。整形式のXML文書以外は、正しくない場所とその内容が表示されます。XML文書の簡単な検証に利用するとよいでしょう。
|
●DTD
DTD(Document Type Definition)は、XMLの仕様で使われている文書型定義言語(スキーマ言語)です。もともとはSGML用に開発されたものです。正しいXML文書には、定義として「整形式文書」と「妥当な文書」があります。整形式文書とは、XMLの基本的な定義にのっとった文書のことをいい、その整形式文書の中で文書型定義にのっとったものを妥当な文書といいます。
簡単なDTDをXML文書と対比しながら、見てみましょう(図9)。
|
図9 XML文書とそのDTD
|
XML文書
<?xml version="1.0" encoding="EUC-JP"?>
<book>
<category>
<name>Java</name>
<item>
<title>なんとなくJava入門</title>
<writer>邪葉太郎</writer>
<publisher>ジャバパブリッシング</publisher>
<size/>
<page>256</page>
<price>2400</price>
<isbn>ISBN4-○○○○-123-1</isbn>
</item>
<item>
<title>すっきりXML</title>
<writer>メル次郎</writer>
<publisher>ジャバパブリッシング</publisher>
<size>A4変形</size>
<page>64</page>
<price>500</price>
<isbn>ISBN4-○○○○-456-1</isbn>
</item>
</category>
</book>
DTD
<?xml version='1.0' encoding='EUC-JP'?>
<!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)*>
|
●要素型宣言
DTDでは、要素型宣言を次のような書式で記述します。
<!ELEMENT isbn (#PCDATA)>
|
<!ELEMENTではじまり、>までが要素型宣言となり、ここではisbnが要素名、(#PCDATA)はこの要素が文字データであることを示しています。この要素型宣言は、1つの要素型を2回以上宣言することができません(妥当性制約)。次に、book要素を見てください。
<!ELEMENT book (category)*>
|
book要素の記述は、その子要素としてcategory要素を持ち、括弧の外に記述された「*」は出現頻度を指定するもので、「*」はcategory要素が0個以上繰り返すことを表します。「*」以外の出現頻度を指定する文字には、0個か1個を指定する「?」と、1個以上繰り返すことを意味する「+」があります。このような出現頻度の指定がない場合は、1個出現するという意味になります。
また、子要素を複数持つ場合は、item要素やcategory要素の記述のように、要素名を「|」か「,」で区切って記述します。子要素が「,」で区切られた場合は、各子要素がその順番に記述されることを意味します。「|」で区切られた場合は列挙された要素のいずれかを選択するという意味です。
たとえば、category要素の子要素は、name要素と1つ以上のitem要素で、必ずname要素から記述しなければならないことを指定する場合は、次のように表記します。
<!ELEMENT category (name,item+)>
|
また、その要素が文字データまたは子要素のどちらかを持つ場合は、「|」を使って次のように記述します。
<!ELEMENT category (#PCDATA|name)>
|
要素型宣言には、文字データや子要素以外の状態を示すものとして、内容に制限のない「ANY」や内容がない(空要素である)「EMPTY」を記述することができます。それぞれを記述した例を、次に示します。
<!ELEMENT writer ANY>
<!ELEMENT size EMPTY>
|
関連リンク
JAVA Developer
定期購読のご案内
バックナンバー販売協力店
|
JAVA Developer 11月号
大特集
DBチューニング大会
特集2 AS徹底解説番外編
[特別企画]
・動的画像生成
・DOMの基本テクニック
・目指せ最強! 最速! CodeRally
・WS-Iの最新事情レポート
|
|