XML文書の構造

XML文書は、次の3つの部分から構成されます。

  • XML宣言
  • 文書型宣言
  • XML文書本体(XMLインスタンス)
XML宣言

<?xml version="1.0" encoding="Shift_JIS"?>

文書型宣言

<!DOCTYPE 住所録 [
<!ELEMENT 住所録 (個人)+>
<!ELEMENT 個人 (住所,氏名)>
<!ELEMENT 住所 (#PCDATA)>
<!ELEMENT 氏名 (#PCDATA)>
<!ATTLIST 氏名 性別 CDATA "不明">
]>

XML文書本体
(XMLインスタンス)

<住所録>
 <個人>
  <住所>大阪市東住吉区</住所>
  <氏名 性別="女性">石田優子</氏名>
 </個人>
 <個人>
  <住所>大阪市淀川区</住所>
  <氏名 性別="男性">鈴木太郎</氏名>
 </個人>
</住所録>

XML宣言

XML規格のバージョンや文字のエンコーディング方式を宣言します。

<?xml version="1.0" encoding="Shift_JIS"?>

  • バージョンは、現時点では1.0のみです。
  • XMLパーサはUTF-8およびUTF-16のエンコーディング方式に必ず対応しているので、これらのエンコーディング方式の場合は、特にencoding=と指定しなくてもかまいません。UTF-8とUTF-16以外の場合は、encoding="Shift_JIS"のように指定する必要があります。Windowsのテキストエディタなどでファイルを保存すると、通常はShift_JISで保存されるので、エンコーディング方式を指定しておかないと、エラーになります。
  • XML宣言自体は省略可能なのですが、UTF-8とUTF-16以外の場合はエンコーディング方式の指定が必要になるので、XML宣言を省略できません。

文書型宣言

DTD(Document Type Definition)で文書型を定義するか、外部のDTDを参照します。

<!DOCTYPE 住所録 [
<!ELEMENT 住所録 (個人)+>
<!ELEMENT 個人 (住所,氏名)>
<!ELEMENT 住所 (#PCDATA)>
<!ELEMENT 氏名 (#PCDATA)>
<!ATTLIST 氏名 性別 CDATA "不明">
]>

  • DTDでは、要素(上例では「住所録」「個人」「住所」「氏名」)や属性(上例では「性別」)の名前、要素の中に入れることができる子要素やデータ、その順序、要素が持つ属性などを指定します。
  • また、DTDの実体宣言で、XML中でよく使用する文字列やファイル名を実体名を定義し、XML文書中で参照することもできます。

妥当なXML文書と整形式XML文書

文書型宣言がある場合、そのXML文書がDTDの定義に従って記述されているかどうかをXMLパーサが検証します。検証されたXML文書は、「妥当なXML文書(valid XML document)」と呼ばれます。文書型宣言がない場合は、DTDに照らした検証は行われず、XMLとしての一般的な規則(開始タグと終了タグで囲まれている。XMLで使用可能な名前を使用している。など)に従っているかどうかのみが検証されます。こちらで検証された文書は「整形式XML文書(well-formed XML document)」と呼ばれます。

  • XMLパーサ自体にも、妥当なXML文書かどうかまで検証する妥当性検証パーサと、整形式かどうかのみ検証する非妥当性検証パーサがあります。

DTDの必要性

上に述べたように、DTDの定義なしでも立派な整形式XML文書になります。個人サイトなどで、要素の名前や出現順序に特にこだわらないといった場合、DTDがなくても別にかまいません。しかし、企業でXMLを利用するような場合、使用する要素や属性などをDTDで明確に決めておかないと、システムの運用や他企業とのデータ交換に差し支えます。

DTDの問題点

XML文書の構造を表現するもの(スキーマ)として、現在DTDが使用されていますが、DTDの評判はあまり良くありません。

  • DTDの構文がXMLの構文とは異なるので覚えるのが面倒な上、プログラム側でもDTDとXMLの両方を処理できるようにしなければなりません。
  • 文字型、数値型というような、XMLをデータベースで利用する場合などに欲しいと思うデータ型がありません。
  • 1つの文書中で同じ名前の要素や属性を混在する場合などに欠かせない「名前空間」にうまく対応できません。

このような問題があるので、DTDに代わるスキーマとして、XML Schemaが開発されました。また、日本のINSTAC XML SWGによるRELAX(REgular Language description for XML)も注目されています。

ということで、今すぐにDTDを必要としない方は、一生懸命DTDの構文を覚えるよりも、しばらく様子を見ていても良いのでは、と思います。

XML文書本体

タグ付けしたデータを入れる文書本体です。XMLインスタンスとも呼ばれます。

<住所録>
 <個人>
  <住所>大阪市東住吉区</住所>
  <氏名 性別="女性">石田優子</氏名>
 </個人>
 <個人>
  <住所>大阪市淀川区</住所>
  <氏名 性別="男性">鈴木太郎</氏名>
 </個人>
</住所録>

これまで見てきたように、XML宣言も文書型宣言も場合によってはなくても良いので、UTF-8またはUTF-16保存した、整形式文書の場合は、XML文書本体さえあれば、立派なXML文書ということになります。

  • XMLのデータには、まず大元になるルート要素(上例では「住所禄」)が1つあり、そこから枝分かれするツリー構造になります。
  • 要素の中には、別の要素(子要素)やテキストを入れることができます。例では、「住所録」の中に「個人」要素が入り、さらに「個人」要素の中に「住所」要素と「氏名」要素が入っています。
  • 各要素は属性を持つことができます。例では、「氏名」要素に「性別」という属性があります。属性名は、前後を二重引用符(")または引用符(')で囲みます。
  • 要素や属性の名前には、半角英数字、漢字、全角カタカナ、ひらがななどを使用できます。ただし、名前の1文字目には半角数字を使用できないといった制限がいくつかあります。また1文字目、2文字目以降に関わらず、半角カタカナと全角英数字は使用できません。