ブログ日記を,はてなダイアリーで作成されている方も多いかと思います。はてなダイアリーには,はてなで書かれた日記を他に移行するためのエクスポート機能が備わっています。このエクスポート機能を実行すると,次のようなXMLデータが出力されます。今回は,このはてなダイアリーのエクスポート機能で出力されるXMLデータを題材にして,XMLの基本構文を学習していきたいと思います。

例1:はてなダイアリーでエクスポートされたXML文書

<?xml version="1.0"  encoding="UTF-8"?>
<diary>
 <day date="2006-08-30"  title="ようやくXML Schemaの勉強開始" >
  <body>今日XML Schemaの勉強を開始しました。結構難しい・・・</body>
 </day>
 <day date="2006-08-31"  title="はやくもXML Schema完全制覇!" >
  <body>なんとXML Schemaを自力で作成できるようになりました。</body>
 </day>
</diary>

◇XML宣言

 例1の最初の行に記載されている下記の一文をXML宣言と呼びます。

<?xml version="1.0"  encoding="UTF-8" ?>

 XML宣言の中では,このXML文書の文字エンコーディング方式(UTF-8,UTF-16,Shift_JISなど)やXML文書が準拠しているXML仕様のバージョン番号(現時点では"1.0"または"1.1"が指定できますが,通常は"1.0"を使用します)などを記述します。

 なお,各パラメータを省略するとバージョン番号は1.0,文字エンコーディング方式はUTF-8またはUTF-16とみなされます。この例のようにすべてデフォルト値と同じ値を設定する場合は,実はXML宣言の記述自体を省略することもできます。ただし,Shift_JIS形式で格納されているXML文書の場合には,XML宣言でShift_JISの指定を行わないとエラーになりますので注意しましょう。また,versionパラメータはencodingパラメータよりも必ず先に指定しなければなりません。

 では,確認問題です。

確認問題1
次のXML宣言の記述について文法上誤っているものを選択してください。

(a) <?xml version="1.0" encoding="UTF-16"?>
(b) <?xml encoding="UTF-8" version="1.0"?>
(c) <?xml version="1.0"?>
(d) XML宣言をまったく記述しない。

 正解は(b)です。(a)は正しい文法のXML宣言です。(b)はversionパラメータをencodingパラメータよりも後で指定しているの,誤った文法です。(c)はencodingの記述を省略していますが,正しい文法です。この場合はUTF-8またはUTF-16とみなされます。(d)も正しい文法です。すべてデフォルトの値を使う場合には,XML宣言は省略できます。

◇要素

 さて上の例1では,次のように,日記の本文が<body></body>というタグで囲まれています。

<body>今日XML Schemaの勉強を開始しました。結構難しい・・・</body>

 このように,データ単位ごとにデータをタグ付けしていくことをマークアップすると言います。マークアップすることで各データの「意味」を記載しておくことができます。例えば,この例では「日記のbody」であることを指定しています。

 また,データの始めに付けるタグ(この例では<body>)を開始タグ,データの最後に付けるタグ(この例では</body>)を終了タグと呼びます。開始タグから終了タグまでの単位は要素,要素に付ける名称(この例ではbody)は要素名と言います。さらに,タグで囲まれたデータ部分は要素の内容と言います。

◇XML文書の階層構造

図1●XML文書の階層構造
 例示したXML文書は図1に示すような階層構造になっています。階層構造の一番上位の要素をルート要素または文書要素と呼びます。ルート要素は1つのXML文書の中では必ず1個である必要があります。また,ある要素の1つ下の階層の要素を子要素,1つ上の階層の要素を親要素と呼びます。

◇空要素

 要素の内容(タグで囲まれたデータ部分)が「空」の要素を空要素と言います。空要素には次の2通りの記述方法があります。

<body></body>

<body/>

 では確認問題です。

確認問題2
各選択肢はそれぞれXML文書を記述しています。誤った文法のXML文書を選択してください。
(a)
<body/>

(b)
<body>寒い1日でした。</body>

(c)
<body>たいくつな1日でした</body>
<body>せわしい1日でした</body>

(d)
<diary>
  <body>たいくつな1日でした</body>
  <body>せわしい1日でした</body>
</diary>

 正解は(c)です。(a)は正しい文法のXML文書です。空要素が記述されています。(b)も正しい文法のXML文書です。(c)はルート要素が2つあるので,誤った文法です。ルート要素は必ず1つである必要があります。(d)はルート要素が一つなので, 正しい文法のXML文書です。

◇属性

 例1のday要素に記載されているdate,titleなどは属性と呼びます。要素に対して1対1の関係になるデータは,このように属性として指定することができます。

<day date="2006-08-30"  title="ようやくXML Schemaの勉強開始" >

 属性の指定順序は任意のため,この要素は下記のように記述しても同じ意味になります。

<day title="ようやくXML Schemaの勉強開始"  date="2006-08-30"  >

 属性値は二重引用符(")で囲むのではなく,一重引用符(')で囲むこともできます。これにより「明日はいよいよ"XMLマスター受験日" です」のように日記のタイトル自身に「"」が含まれている場合にも,属性の値として正しく指定することができます。

<day title='明日はいよいよ" XMLマスター受験日" です'  date="2006-08-30"  >

 なお,1つの要素に同じ名前の属性を複数指定することはできません。次は誤った例です。

<day title="受験体験記" title="ようやくXML Schemaの勉強開始" >

◇コメント

 XML文書内にはコメント文(<!-- コメント -->)を使って,次のようにXML文書の中にコメントを記述することもできます。

例2:例1のXML文書にコメントを記述

<?xml version="1.0"  encoding="UTF-8"?>
<!-- 2006年9月1日にエクスポートした私の日記 -->
<diary>
  <!-- 2006年8月30日の日記 -->
  <day date="2006-08-30"  title="ようやくXML Schemaの勉強開始" >
   <body>今日XML Schemaの勉強を開始しました。結構難しい・・・</body>
  </day>
  <!-- 2006年8月31日の日記 -->
  <day date="2006-08-31"  title="はやくもXML Schema完全制覇!" >
   <body>なんとXML Schemaを自力で作成できるようになりました。</body>
  </day>
</diary>

 コメント文は,要素の内容の中など任意の個所に記述できますが,XML宣言より前に記述したり,タグの中に記述することはできません。  では確認問題です。

確認問題3
次の中で,正しい文法のXML文書を選択してください。(複数選択)
(a)
<!-- 2006年8月31日の日記 -->
<day date="2006-08-31"  title="はやくもXML Schema完全制覇!" >
   <body>なんとXML Schemaを自力で作成できるようになりました。</body>
</day>

(b)
<day date="2006-08-31"  title="明日はいよいよ" XMLマスター受験日" です" >
   <body>なんとXML Schemaを自力で作成できるようになりました。</body>
</day>

(c)
<day date="2006-08-31"  title="はやくもXML Schema完全制覇!" >
   <body/>
</day>

(d)
<!-- 2006年8月31日の日記 -->
<?xml version="1.0"  encoding="Shift_JIS"?>
<day date="2006-08-31"  title="はやくもXML Schema完全制覇!" >
   <body>なんとXML Schemaを自力で作成できるようになりました。</body>
</day>

 正解は(a)と(c)です。(a)は正しいXML文書。(b)は,属性の値の中の「"」という文字を「"」で囲んでいるので誤った文法です。属性の値の中に「"」という文字を含むときには、「"」ではなく「'」で値を囲みます。(c)は正しいXML文書です。(d)は,XML宣言より前にコメントを記述しているので,誤った文法です。d. XML宣言より前にコメントを記述することはできません。



野中 康弘
インフォテリア 教育部 エンジニア。十数年間システム開発に携わり,そのうちの半分をデータベース管理者として奮闘する。現在は,インフォテリア認定教育センターのサポートや,XML技術者認定制度の「XMLマスター」に対応したコーステキストの開発などを担当している。