XML文書の適合度を表す「整形式である」と「妥当である」

初稿: 2005-08-25

実は違う2つのよく似た表現

XMLに関する資料などを読んでいると、XML文書が「整形式である(Well-formed)」や「妥当である(Valid)」というような表現がよく使われています。漠然と正しいXML文書であることは伝わってくるのですが、実はこれらには明確な違いがあります。

「整形式である」は最低限の基準、「妥当である」はサブセットの基準

文書がXML文書であることを「整形式である」といいます。つまり「整形式である」とはXMLの文法に則った文書であることをいいます。これを満たさない文書はXML文書とはいえません。もしくはXMLとして間違った文書です。しかし、整形式のXML文書が妥当なXML文書とは限りません。通常、XMLはXHTMLのようなサブセットの定義と共に利用されます。この時、XML文書がサブセットの定義を満たしていることを「妥当である」といいます。つまり、正しいXHTML文書は妥当であることになります。注意点として、文書型宣言で使用されるサブセットが宣言されていない場合、そのXML文書は妥当ではありません。ここで整理すると、妥当な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>

例: 整形式でない文書(ルート要素が複数存在する)


目次へ戻る