Powered by SmartDoc

XMLの基本

XML とはどういったものか

XML (Extensible Markup Language)は、World Wide Web Consortium (W3C)で策定されている文書の規格です。

まず、XMLの簡単なサンプルを見てみましょう。

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

<booklist>

    <book>
        <title>情報メディア論</title>
        <author role="編著">丸山不二夫</author>
        <publisher>八千代出版</publisher>
    </book>

    <book>
        <title>Javaのからくり</title>
        <author role="著">植田龍男</author>
        <publisher>IDGコミュニケーションズ</publisher>
    </book>

</booklist>

このサンプルは、書籍のデータを表現しています。HTMLを知っている人なら、「HTMLに似ている」という感じを持つかもしれません。

XMLでは、「タグ」という文字列でデータを囲うことによって、そのデータがどのような種類のものかということと、データそのものを同時に表します。このXML文書の一部分を取り出して見ましょう。

 <title>    情報メディア論   </title>

 -------    --------------   --------
 開始タグ        内容        終了タグ
(start tag)    (content)    (end tag)

 ------------------------------------
                 要素
               (element)

「情報メディア論」という文字列が、開始タグ<title>と終了タグ</title>で挟まれています。この要素は、本のタイトルが「情報メディア論」であることを示します。

開始タグと終了タグの間には、さらに要素を入れることができます。

<book>
    <title>Javaのからくり</title>
    <author role="著">植田龍男</author>
    <publisher>IDGコミュニケーションズ</publisher>
</book>

この部分では、要素bookの中に、titleやauthor、publisherといった要素が含まれています。

「属性(attribute)」を使って要素の性質を示すこともできます。

<book>
    .....
    <author role="編著">丸山不二夫</author>
    .....
</book>

<book>
    .....
    <author role="著">植田龍男</author>
    .....
</book>

要素authorの開始タグに含まれている、roleの値が属性です。ここでは、「丸山不二夫」の役割が「編著」者であり、「植田龍男」の役割が「著」者であることを示しています。

XML の特徴

XMLはさまざまな場面で、データを交換したり、保存するときの標準的な技術として利用されています。その理由について見てみましょう。

XMLはメタ言語である

「メタ言語」とは、「言語を作るための言語」です。

日本語・英語などの自然言語には「文法」があり、その「文法」に従って「言葉(語彙)」を並べることによって、相手に内容を伝えることができます。この「言葉(語彙)」は、言語によってそれぞれ違っています。

XMLの規格では、要素があるとか、開始タグには必ずそのペアとなる終了タグがあるとか、属性があるとか、要素はすべて文字で表現される、といったようなことが定められています。先に挙げたサンプルで出てきたbooklistというタグのような、具体的なタグの名称までを定めているわけではないのです。

booklistのような具体的なタグは、書籍のリストを表すために、筆者が(勝手に)決めたものです。もちろん、XMLの規格には従っています。booklist要素中にbook要素があり、さらにその中にtitle要素やauthor要素があります。

XMLでは、要素やタグといった、自然言語の「文法」に相当するものは共通しています。しかし、その文法に従って並べられる「言葉(語彙)」は、XMLの利用者によって決められている必要があります。先の例のbooklistやbookといった要素は、まさに利用者(ここでは筆者)によって定められたものです。

このように、XMLで新たに要素を定義するということは、XMLベースの新しい言語を定義することに相当します。

XMLは、同じ文法を持った新しい言語を作成できる「メタ言語」としての性質を持っています。文法が同じであるために、プログラムでXML文書を処理するときに、文書を解析するパーザを書く必要がありません。

XMLベースの言語は既にたくさん作られています。ここでは、それらのほんの一部を紹介しましょう。

XHTML
HTML 4.01をXMLに書き換えたもの
RSS
Webサイトの概要を表すXML
MathML
数式を表すXML
SMIL
映像・音声などを組み合わせて、どのように見せるかXMLで記述する
ContactXML
人の連絡先情報を記述するXML

こうしたXMLベースの言語で、どのようなタグがどのような組み合わせで利用できるかという情報は、「スキーマ」に記述されます。スキーマには、後述するDTDや、次回以降に解説するXML Schemaなどがあります。

XMLは文書を構造化できる

XML文書は、要素の組合せによって成り立ちます。先の例では、要素booklistの内容として要素bookがあり、その内容にtitleなどの要素が含まれています。要素の間には「親子関係」や「兄弟関係」があります。言い換えると、XML文書は要素の木構造で表せます。

木構造であるおかげで、XML文書を変換したり、必要な項目を取り出したりするのも簡単にできるます。そのため、情報の再利用がやりやすくなります。

XMLはテキストファイルである

XMLはテキストファイルになっているため、特別なツールを使わなくても、文書の閲覧・作成・編集ができます。

XMLは、人間にとってもプログラムにとっても扱いやすいものになっています。

XHTML

XHTMLは、HTML 4.01をXMLで書き直したものです。HTML4.0と互換性を保っています。HTMLの開発はストップされ、今後はXHTMLとして開発されます。

以下に、XHTML文書の例を示します。

<?xml version="1.0" encoding="Shift_JIS" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;
		charset=Shift_JIS" />
<link href="style.css" type="text/css" rel="stylesheet" />
<title>安藤友晴の日記</title>
</head>

<body>
<h1>安藤友晴の日記</h1>

<!-- ========== hr は空要素タグとなる ========== -->
<hr />

<p>
きょうは、ゼミで
<a href="http://www.wakhok.ac.jp/DB/DB.html">
データベース</a>の勉強をしました。こんな内容です。
</p>

<!-- ========== li にも終了タグは必要 ========== -->
<ul>
<li>where句</li>
<li>データベースの論理設計</li>
</ul>

</body>

</html>

HTML文書とは、次のような点で違いがあります。

XHTMLは、HTMLとは違って文法に曖昧な点がないので、プログラムでの処理が容易です。従って、XHTMLの文書はHTMLよりもデータとしての再利用性が高くなります。また、他のXMLベースの言語と組み合わせて使うことができます。

XHTMLの最新の規格はXHTML 1.1となっています。この規格では、XHTMLのタグを分類してモジュール化し、モジュール単位で利用できるようになっています。例えば、いくつかのモジュールを選択してXHTMLのサブセットとし、携帯電話で扱えるようにする、といったことができます。

名前空間

XMLでは、ひとつの文書で、XMLベースの複数の言語を組み合わせて使えます。ただし、複数の言語で同じ名前のタグがあったりすると、そのままではどの言語に属するタグなのかわからなくなります。そこで、タグを区分けする何らかの仕組みが必要です。

このためにXMLでは、「名前空間(Namespace)」という仕組みが使われています。先程のXHTMLの例では

<html xmlns="http://www.w3.org/1999/xhtml">

のように、xmlns属性によって"http://www.w3.org/1999/xhtml"という値の名前空間を指定しています。複数の言語を指定するときには、次のようにします。

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

<!-- 名前空間を指定する -->

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wakhokBook="http://www.wakhok.ac.jp/books">
<head>
<meta http-equiv="Content-Type" content="text/html;
		charset=Shift_JIS" />
<link href="style.css" type="text/css" rel="stylesheet" />
<title>安藤友晴の日記</title>
</head>

<body>
<h1>安藤友晴の日記</h1>

<p>
きょうは、丸山先生と及川くんの3人で
こんな本を読みました。
</p>
<wakhokBook:book>
    <wakhokBook:title>情報メディア論</wakhokBook:title>
    <wakhokBook:author role="編著">丸山不二夫</wakhokBook:author>
    <wakhokBook:publisher>八千代出版</wakhokBook:publisher>
</wakhokBook:book>

</body>

</html>

この例ではxmlns属性を用いて、名前空間http://www.wakhok.ac.jp/booksに"wakhokBook"という名前空間接頭辞(namespace prefix)を指定します。本のデータのところでは、この接頭辞にコロンを付けたものをタグに付加しています。

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wakhokBook="http://www.wakhok.ac.jp/books">

.....
.....

<wakhokBook:book>
    <wakhokBook:title>情報メディア論</wakhokBook:title>
    <wakhokBook:author role="編著">丸山不二夫</wakhokBook:author>
    <wakhokBook:publisher>八千代出版</wakhokBook:publisher>
</wakhokBook:book>

または、次のように局所的に名前空間を指定できます。

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

<!-- 名前空間を指定する -->

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;
		charset=Shift_JIS" />
<link href="style.css" type="text/css" rel="stylesheet" />
<title>安藤友晴の日記</title>
</head>

<body>
<h1>安藤友晴の日記</h1>

<p>
きょうは、ゼミでこんな本を読みました。
</p>
<book xmlns="http://www.wakhok.ac.jp/books">
    <title>情報メディア論</title>
    <author role="編著">丸山不二夫</author>
    <publisher>八千代出版</publisher>
</book>

</body>

</html>

開始タグbookのところでxmlns属性を指定することにより、book要素の中ではhttp://www.wakhok.ac.jp/booksの名前空間が使用されます。

DTD

XMLでは、開始タグと終了タグで囲まれた部分を「要素(element)」と言います。DTDは、XML文書でどのような要素が使われるか宣言するためのものです。

先のXML文書のDTDは、このようになります。

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

<!ELEMENT BOOKLIST  (BOOK+)>

<!ELEMENT BOOK      (TITLE, AUTHOR, PUBLISHER)>

<!ELEMENT TITLE     (#PCDATA)>
<!ELEMENT AUTHOR    (#PCDATA)>
<!ELEMENT PUBLISHER (#PCDATA)>
<!ELEMENT BOOKLIST  (BOOK+)>

は、BOOKLISTは1つ以上のBOOKを含むことを示します。BOOKが無くてもよい場合、言いかえるとBOOKが0以上である場合は、BOOK*と記述します。

<!ELEMENT BOOK      (TITLE, AUTHOR, PUBLISHER)>

は、BOOKがTITLE, AUTHOR, PUBLISHERの3つの要素を含むことを示します。

<!ELEMENT TITLE     (#PCDATA)>
<!ELEMENT AUTHOR    (#PCDATA)>
<!ELEMENT PUBLISHER (#PCDATA)>

は、3つの要素とも#PCDATAと指定されています。#PCDATAは、Parsed Character Dataの略で、"<"などを除き、どんな文字でも良いことを示します。

次は、先ほどのXML文書にDTDの定義を加えたものです。

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE BOOKLIST SYSTEM "BOOKLIST.dtd">

<BOOKLIST>

<BOOK>
<TITLE>情報メディア論</TITLE>
<AUTHOR>丸山不二夫 編著</AUTHOR>
<PUBLISHER>八千代出版</PUBLISHER>
</BOOK>

<BOOK>
<TITLE>Javaのからくり</TITLE>
<AUTHOR>植田龍男 著</AUTHOR>
<PUBLISHER>IDGコミュニケーションズ</PUBLISHER>
</BOOK>

</BOOKLIST>

DTDに則ったXML文書を「バリッド(valid)」と言い、DTDを使わないXML文書を「ウェルフォームド(well-formed)」と言います。

参考文献・URL

Extensible Markup Language (XML) 1.0 (Third Edition)