XMLスキーマ
日本語 | 拡張可能印言語構造構造図 |
英語 | eXtensible Markup Language schema |
ふりがな | えっくすえむえるすきーま |
フリガナ | エックスエムエルスキーマ |
XMLが「妥当」かどうか検証するためのファイル。
XMLそのもののルールは、「タグがちゃんと閉じているかどうか」「タグの中にタグが入っているかどうか」といった基本的なことくらいで、特に厳しいルールは存在しない。
だが、「特定のアプリケーション用XML」は、そのXMLごとに厳しいルールが存在する。たとえば「タグAの中には必ずタグBがなければならない」「タグCの中にはタグDかタグEが存在する」「タグFの中にタグGが0個以上存在する」といったルールである。
アプリケーションがXMLをパーシングする際には「XMLがこのルールに則って記述されている」ことを前提としているため、ルールに反しているXMLをパーシングすることができなくなる。
そこで、XMLの構造(スキーマ)がルールに則っているかどうかを判別することが必要となる。そのための「ルール」を記述したファイルが「XMLスキーマ」である。
XMLスキーマは通常ファイルとなっており、XMLのルールが記述されている。
この記述形式、つまり「XMLスキーマの言語仕様」を「XMLスキーマ言語」といい、DTD、XML Schema、RELAX等が存在する。
XMLスキーマは、XMLスキーマ言語でXMLの「ルール」を記述する。このルールに則っているXMLは「妥当なXMLである」と表現する。
つまり、いわばこれは「XMLのコンパイル」のようなものである。Javaのプログラムが正しいかどうかコンパイルすることでチェックできるのと同様に、XMLスキーマを用いてXMLのプログラムが正しいかどうかチェックするわけである。
XMLスキーマは必ずしも必要ではない。
XMLはXMLスキーマなしでも使用することができる。
XMLスキーマを使用しない場合、XMLの正当性を検証することができないため、作成することが望ましいが、単にローカルファイルにXML形式で保存する、程度の場合には作成する必要はないだろう。
また、XMLスキーマは通常ファイルとして保存し、ローカルファイルとして置くかもしくはインターネット上で公開する。インターネット上で公開する場合、XMLスキーマによる妥当性チェックを行う度にインターネットのXMLスキーマを取得することになる。またローカルファイルに置く場合には、そのローカルファイルのXMLスキーマをXMLファイルと一緒に配布しなければならない場合もある。
一度XMLスキーマを作成してしまうと、XMLの仕様を変更するたびにXMLスキーマも変更しなければならず、そのため修正やバージョン管理が難しい面もある。
XMLが生まれたばかりの頃はXMLスキーマは重要な位置づけであったが、現在では様々なXMLが使用されるようになりXMLスキーマの作成が後追いになっていること、XMLスキーマ言語が複数存在していることにより「難しいもの」という印象を与えてしまっていることにより、あまり使われない傾向にある。
あった方がいいに越したことはないが、思いの外コストやデメリットがあるため、検討した上で導入した方がいいだろう。
XMLそのもののルールは、「タグがちゃんと閉じているかどうか」「タグの中にタグが入っているかどうか」といった基本的なことくらいで、特に厳しいルールは存在しない。
だが、「特定のアプリケーション用XML」は、そのXMLごとに厳しいルールが存在する。たとえば「タグAの中には必ずタグBがなければならない」「タグCの中にはタグDかタグEが存在する」「タグFの中にタグGが0個以上存在する」といったルールである。
アプリケーションがXMLをパーシングする際には「XMLがこのルールに則って記述されている」ことを前提としているため、ルールに反しているXMLをパーシングすることができなくなる。
そこで、XMLの構造(スキーマ)がルールに則っているかどうかを判別することが必要となる。そのための「ルール」を記述したファイルが「XMLスキーマ」である。
XMLスキーマは通常ファイルとなっており、XMLのルールが記述されている。
この記述形式、つまり「XMLスキーマの言語仕様」を「XMLスキーマ言語」といい、DTD、XML Schema、RELAX等が存在する。
XMLスキーマは、XMLスキーマ言語でXMLの「ルール」を記述する。このルールに則っているXMLは「妥当なXMLである」と表現する。
つまり、いわばこれは「XMLのコンパイル」のようなものである。Javaのプログラムが正しいかどうかコンパイルすることでチェックできるのと同様に、XMLスキーマを用いてXMLのプログラムが正しいかどうかチェックするわけである。
XMLスキーマは必ずしも必要ではない。
XMLはXMLスキーマなしでも使用することができる。
XMLスキーマを使用しない場合、XMLの正当性を検証することができないため、作成することが望ましいが、単にローカルファイルにXML形式で保存する、程度の場合には作成する必要はないだろう。
また、XMLスキーマは通常ファイルとして保存し、ローカルファイルとして置くかもしくはインターネット上で公開する。インターネット上で公開する場合、XMLスキーマによる妥当性チェックを行う度にインターネットのXMLスキーマを取得することになる。またローカルファイルに置く場合には、そのローカルファイルのXMLスキーマをXMLファイルと一緒に配布しなければならない場合もある。
一度XMLスキーマを作成してしまうと、XMLの仕様を変更するたびにXMLスキーマも変更しなければならず、そのため修正やバージョン管理が難しい面もある。
XMLが生まれたばかりの頃はXMLスキーマは重要な位置づけであったが、現在では様々なXMLが使用されるようになりXMLスキーマの作成が後追いになっていること、XMLスキーマ言語が複数存在していることにより「難しいもの」という印象を与えてしまっていることにより、あまり使われない傾向にある。
あった方がいいに越したことはないが、思いの外コストやデメリットがあるため、検討した上で導入した方がいいだろう。
参考サイト
- (参考サイトはありません)
<!-- D:/sample.dtd -->
<!-- XMLスキーマ言語のひとつ、DTDで記述したXMLスキーマです。 -->
<!-- UTF-8で保存してください。 -->
<!ELEMENT test_xml (test1,test2)> <!-- test_xmlタグ内にtest1タグとtest2タグがある、という意味です。 -->
<!ELEMENT test1 (#PCDATA)> <!-- test1タグ内に文字列がある、という意味です。 -->
<!ELEMENT test2 (test2_child)> <!-- test2タグ内にtest2_childタグがある、という意味です。 -->
<!ELEMENT test2_child (#PCDATA)> <!-- test2_childタグ内に文字列がある、という意味です。 -->
<!-- D:/sample.xml -->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE test_xml SYSTEM "file:///D:/sample.dtd">
<test_xml>
<test1>テストです</test1>
<test2>
<test2_child>テストですって</test2_child>
</test2>
</test_xml>
<!-- XMLスキーマ言語のひとつ、DTDで記述したXMLスキーマです。 -->
<!-- UTF-8で保存してください。 -->
<!ELEMENT test_xml (test1,test2)> <!-- test_xmlタグ内にtest1タグとtest2タグがある、という意味です。 -->
<!ELEMENT test1 (#PCDATA)> <!-- test1タグ内に文字列がある、という意味です。 -->
<!ELEMENT test2 (test2_child)> <!-- test2タグ内にtest2_childタグがある、という意味です。 -->
<!ELEMENT test2_child (#PCDATA)> <!-- test2_childタグ内に文字列がある、という意味です。 -->
<!-- D:/sample.xml -->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE test_xml SYSTEM "file:///D:/sample.dtd">
<test_xml>
<test1>テストです</test1>
<test2>
<test2_child>テストですって</test2_child>
</test2>
</test_xml>
<!-- D:/sample.dtd --> <!-- XMLスキーマ言語のひとつ、DTDで記述したXMLスキーマです。 --> <!-- UTF-8で保存してください。 --> <!ELEMENT test_xml (test1,test2)> <!-- test_xmlタグ内にtest1タグとtest2タグがある、という意味です。 --> <!ELEMENT test1 (#PCDATA)> <!-- test1タグ内に文字列がある、という意味です。 --> <!ELEMENT test2 (test2_child)> <!-- test2タグ内にtest2_childタグがある、という意味です。 --> <!ELEMENT test2_child (#PCDATA)> <!-- test2_childタグ内に文字列がある、という意味です。 --> <!-- D:/sample.xml --> <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE test_xml SYSTEM "file:///D:/sample.dtd"> <test_xml> <test1>テストです</test1> <test2> <test2_child>テストですって</test2_child> </test2> </test_xml>