XML文書の文法が厳格な理由

XMLは日常生活の中で利用されるあらゆるデータを柔軟にあらわすことができ、人間にとってわかりやすいデータ形式です。
また、簡潔な仕様なので、XML文章の作成ならびにXML文章を操作するプログラムも作成しやすいと言えます。

ただし、XML文章を記述していく上で、注意しなければいけないこともあります。
それは、XML文章の記述方法は厳格に定められており、XMLの文法に従った正しい文章を記述しなければならない点です。

もし少しでも文法に誤りがあれば、それは致命的エラー(fatal error)であり,XMLプロセッサは正常処理を継続してはならないとされています。

以下は、文法に誤りがあり、正常に表示できない場合の表示画面です。

XML文法エラー

当り前のことのように思えるかもしれませんが、XMLと同じマークアップ言語であるHTMLでは、記述方法が厳格ではなく、多少文法が誤っていても問題なく出力され、エラーとなることはありませんでした。そのため、HTMLに慣れている場合は特に気をつけなければいけません。

文法エラーはXML文章を作成していく上で、初めのうちは避けては通れない部分です。
まずは、XMLにはどのような文法上のルールがあるのかをHTMLと比較しながら示していきます。

ルート要素は必ず定義する

XML文章の一番外側にある要素をルート要素と呼びます。
ルート要素はひとつのXML文章中に必ずひとつでなければなりません。

XML文章のルート要素はHTML文章のhtmlタグに該当します。
htmlタグもひとつのHTML文書の中でひとつとなります。
ただし、HTMLの場合はhtmlタグが省略されても、ブラウザが自動解釈して正しく認識してくれます。しかし、XMLでは省略は許されず、最上位に必ず存在しなければいけません。

終了タグで必ず終わらせる

タグは開始タグで始まり、終了タグで終わらせなければなりません。

HTMLでは、以下のような記述も許されますが、XMLではエラーとなります。

<p>XML Sample01
<p>XML Sample02

<p>を記述したら</p>で終わらせる必要があります。

要素は正しくネスト(入れ子)構造とする

要素名の命名ルールでも記述しましたが、以下のように他の要素の開始タグと終了タグを交差させてはいけません。

<item>
  <name>やくそう<price></name>
  80</price>
</item>

要素は必ずタグ同士が入れ子になった形になっている必要があります。

各要素名の大文字・小文字を区別する

HTMLの各要素名は大文字、小文字、もしくは以下のようにその両方を使っても問題ありませんでした。

<p>XML Sample03</P>

XMLでは要素名、属性名の大文字・小文字は区別されます。
つまり上記のように記述した場合、開始タグ、終了タグそれぞれ別のタグと解釈されエラーとなります。

空要素を空要素タグで記述する

空要素は必ず空要素タグで記述する必要があります。(もしくは開始タグと終了タグで記述する。)

つまり、以下のような記述は許されません。

XML Sample03<br>
XML Sample04<br>

この場合、<br />と記述するか、<br></br>と記述する必要があります。

属性値はダブルクォーテーションで囲む

HTMLでは、以下のように属性値をダブルクォーテーションで囲まなくても問題ありませんでした。

<img src=sample.jpg />

XMLでは、これも許されず、必ずダブルクォーテーションで囲む必要があります。

属性名のみの記述は許されない(属性値を省略できない)

属性を定義する場合は、必ず属性値を記述する必要があります。
例えば、HTMLでは以下のような記述が許されていました。

<dl compact>

これは、compact属性に値として必ず”compact”が入るため省略が許されていただけであり、実際には<dl compact=”compact”>が正式な記述となります。

XMLでは、例外なく「属性名=”属性値”」の形式で記述する必要があります。

XML文書の文法が厳格な理由

XMLの文法が厳密なのは、システム的な付負荷を極力減らすためです。
HTMLを処理するエンジンのロジックは、タグの省略などのあいまいな記述を自動的に解釈するたのもので8割程占められていると言われています。
それらのロジックを削除することで、エンジンは簡素化され、その結果、高いパフォーマンスを得られます。

冒頭で、XML文書は人間にとってわかりやすいデータ形式であると書きましたが、コンピュータにとっても同じことが言えるということです。