初稿: 2005-08-25
XMLに関する資料などを読んでいると、XML文書が「整形式である(Well-formed)」や「妥当である(Valid)」というような表現がよく使われています。漠然と正しいXML文書であることは伝わってくるのですが、実はこれらには明確な違いがあります。
文書がXML文書であることを「整形式である」といいます。つまり「整形式である」とはXMLの文法に則った文書であることをいいます。これを満たさない文書はXML文書とはいえません。もしくはXMLとして間違った文書です。しかし、整形式のXML文書が妥当なXML文書とは限りません。通常、XMLはXHTMLのようなサブセットの定義と共に利用されます。この時、XML文書がサブセットの定義を満たしていることを「妥当である」といいます。つまり、正しいXHTML文書は妥当であることになります。注意点として、文書型宣言で使用されるサブセットが宣言されていない場合、そのXML文書は妥当ではありません。ここで整理すると、妥当なXML文書は必ず整形式のXML文書あるが、整形式のXML文書は必ず妥当なXML文書とは限らないことになり、「整形式である⊃妥当である」といえます。
XMLを解析するプログラムをXMLパーサといいます。例えば、XHTMLチェッカーなどもXMLパーサの一種になります。実際に「整形式である」と「妥当である」の表現がよく使用されている場面として、XMLパーサのメッセージがあります。ここであるXHTMLが正しく書かれているかチェックする場面を想像してみましょう。XHTMLをチェッカーにかけたとき、「この文書は妥当である。(This document is valid.)」というようなメッセージが出れば、それは正しいXHTML文書であることになります。「この文書は妥当でない。(This document is not valid.)」というようなメッセージが出れば、それは間違ったXHTML文書であることになります。悪いことに「この文書は整形式でない。(This document is not well-formed.)」というようなメッセージが出れば、それはそもそもXML文書になっていないということになります。このように「整形式である」と「妥当である」の意味を知ることは、エラーの原因を突き止める時に役に立つケースが多いでしょう。
最後に例としていくつかのパターンを挙げてみます。
<?xml version="1.0"?>
<!DOCTYPE bookshelf [
<!ELEMENT bookshelf (book*)>
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book code CDATA #REQUIRED>
]>
<bookshelf>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
<author>桃 太郎</author>
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
</bookshelf>
例: 妥当であるXML文書
<?xml version="1.0"?>
<bookshelf>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
<author>桃 太郎</author>
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
</bookshelf>
例: 整形式であるが妥当でないXML文書(文書型宣言が存在しない)
<?xml version="1.0"?>
<!DOCTYPE bookshelf [
<!ELEMENT bookshelf (book*)>
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book code CDATA #REQUIRED>
]>
<bookshelf>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
</bookshelf>
例: 整形式であるが妥当でないXML文書(book要素はauthor要素を持たなければならない)
<?xml version="1.0"?>
<!DOCTYPE bookshelf [
<!ELEMENT bookshelf (book*)>
<!ELEMENT book (title,author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ATTLIST book code CDATA #REQUIRED>
]>
<bookshelf>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
<author>桃 太郎</author>
<comment>面白い本である。</comment>
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
</bookshelf>
例: 整形式であるが妥当でないXML文書(宣言されていない要素が存在する)
<?xml version="1.0"?>
<bookshelf>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
<author>桃 太郎
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
</bookshelf>
例: 整形式でない文書(タグが閉じられていない)
<?xml version="1.0"?>
<book code="ISBN0-0000-0000-1">
<title>はじめてのXML</title>
<author>桃 太郎</author>
</book>
<book code="ISBN0-0000-0000-2">
<title>XML入門</title>
<author>金 太郎</author>
</book>
例: 整形式でない文書(ルート要素が複数存在する)