XML入門

広告
eyecatch

XML は正式には Extensible Markup Language と呼ばれるもので、タグを使ってデータを記述する言語の 1 つです。 HTML などのようにあらかじめ決められたタグを使用する言語と違い XML では任意のタグを使用してデータを記述することができます。ここでは XML の基本的な使い方について解説します。

※ DTD を使って XML の構造を定義する方法については「DTDを使ったXML構造の定義」を参照されてください。

(2020 年 03 月 14 日公開 / 2020 年 03 月 16 日更新)

XML文書の作成と閲覧

最初に新しい XML 文書を作成しファイルとして保存する方法、そして作成した XML 文書を表示するビューアについても解説します。

テキストエディタを使って新しいXML文書を作成する

XML の詳しい構文についてはこの後で順に解説していきますが、まずは新しい XML 文書をどのように作成し保存するのかについて簡単に見ていきます。XML を使って文書を作成する場合、特別なアプリケーションは必要ありません。 XML 文書はテキストファイルとして作成できますので、普段使用されているテキストエディタを使って記述することができます。

下記は簡単な XML 文書の例です。テキストエディタで新しい文書を作成し次に通り入力して下さい。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

入力が終わりましたらファイルに保存します。テキストファイルとして保存する場合と同じですが、テキストファイルがファイルの拡張子として .txt が使用されることが多いのに対して、 XML 文書が記述されたファイルは拡張子として .xml を使用するのが一般的です。例えば myfoods.xml のようなファイル名となります。

ファイルを保存する時の文字コードは UTF-8 や UTF-16 を使用するのが一般的ですが、 Shift_JIS などの文字コードも使用できます。使用した文字コードはこの後で解説する XML 宣言で指定します。

XML文書を閲覧する

XML 文書を表示するには XML ビューアと呼ばれるものを使って表示します。 XML ビューアは色々なものがありますが、普段 Web ページを閲覧するのに使用している Chrome や Firefox といったブラウザも XML ビューアとしての機能があります。

では先ほど作成し保存したファイルを Chrome で開いてみます。次のように表示されました。

XML文書の作成と閲覧(1)

XML 文書は階層構造になっています。最初は展開されて表示されていますが、下矢印の個所をクリックすると展開されて表示されていた部分が折りたたまれて表示されます。

XML文書の作成と閲覧(2)

XML文書の作成と閲覧(3)

今後も XML 文書の閲覧にはブラウザを利用していきます。

XML宣言を記述する

XML 文書の先頭には使用する XML のバージョンや文字コードについて記述した XML 宣言を記述します。 XML 宣言は次のように構文となっています。

<?xml version="バージョン" encoding="文字コード" ?>

バージョンには使用する XML のバージョンを記述します。 XML のバージョンは 1.0 と 1.1 がありますが、現時点では 1.0 を指定されるケースがほとんどのようです。

文字コードには XML 文書を保存する時に使用した文字コードを記述して下さい。 UTF-8 で保存した場合は UTF-8 、 Shift_JIS や EUC-JP で保存した場合はその文字コードを記述します。

最初に記述した XML 文書のサンプルを見てみると 1 行目に XML 宣言が記述されていました。 XML のバージョンは 1.0 で文字コードは UTF-8 となっています。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

なお XML 宣言で記述している文字コードと実際に使っている文字コードが異なる場合はエラーとなります。次のサンプルは XML 文書は UTF-8 で保存しているのに XML 宣言では Shift_JIS と記述したものです。

<?xml version="1.0" encoding="Shift_JIS" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

この XML 文書をブラウザで開いてみると次のようにエラーが表示されました。

XML宣言を記述する(1)

このように XML 宣言で記述した文字コードと実際に XML 文書を保存する時に使用した文字コードは同じにする必要があります。

XML宣言を省略する

XML 宣言は XML 文書の文字コードとして UTF-8 または UTF-16 を使用している場合は省略することができます。

では実際に試してみます。次のサンプルでは XML 宣言を省略しています。 XML 文書は UTF-8 で保存してください。

<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

この XML 文書をブラウザで開いてみると次のように正常に表示されます。

XML宣言を省略する(1)

XML 宣言を省略した場合、文字コードとして UTF-8 または UTF-16 が使用されていると判断されます。その為、他の文字コードで保存しているのに XML 宣言を省略すると文字コードが違っているというエラーが表示されます。

先ほどの XML 宣言を省略したサンプルを今度は Shift_JIS で保存してみます。そしてブラウザで開いてみるとエラーが表示されます。

XML宣言を省略する(2)

このように文字コードとして UTF-8 を使用する場合には XML 宣言は省略可能ですが、意図的に省略したのか書き忘れてしまったのか判断がしにくいので UTF-8 を使用する場合も記述しておいたほうがいいかもしれません。

要素を記述する

XML 文書では 1 つ 1 つのデータを要素と呼ばれるものを使って記述していきます。ここでは要素の記述方法について解説します。

XMLにおける要素とは

要素の構文は次の通りです。

<要素名>内容</要素名>

<要素名> を開始タグ、 </要素名> を終了タグと呼びます。開始タグと終了タグの間に要素の「内容」をテキストで記述します(他の子要素を含むこともできます)。開始タグから終了タグまでをまとめて要素と呼びます。

要素を記述する(1)

XML では要素名は自由に決めることができますが、どんなデータを扱っているのか分かる名前が望ましいです。

次の XML 文書のサンプルを見て下さい。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

このXML文書には <name>バナナ&l;/name> や <color>黄色</color> などの要素が含まれています。

要素名で使用できる文字

要素名は半角英数だけではなく日本語を使って記述することもできます。

<製品名>卓上机A</製品名>

次のサンプルは要素名に日本語を使ったものです。

<?xml version="1.0" encoding="UTF-8" ?>
<食料品>
  <食料>
    <名前>バナナ</名前>
    <色>黄色</色>
  </食料>

  <食料>
    <名前>リンゴ</名前>
    <色>赤</色>
  </食料>
</食料品>

この XML 文書をブラウザで開いてみると次のように正常に表示されます。

要素を記述する(2)

要素名で使用できる文字は次のように決まっています。

1文字目:
アルファベット、漢字、ひらがな、カタカナ、アンダーバー(_)、セミコロン(:)

2文字目以降:
1文字目で使用できる文字に加えて、数字、ドット(.)、ハイフン(-)

要素名には数値で始まる要素名は使用できません( 2 文字目からは使用できます)。また要素名の中に空白を含めることはできません。

× <2ndname>名前</2ndname>
× <old price>価格</old price>

次のサンプルは数値で始まる要素名を使用したものです。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <3color>黄色</3color>
  </food>

  <food>
    <name>リンゴ</name>
    <3color></3color>
  </food>
</foods>

この XML 文書をブラウザで開いてみると次のようにエラーが表示されます。

要素を記述する(3)

要素の内容として別の要素を記述する

要素の内容には別の要素を含むことができます。これまで使ってきたサンプルをもう一度見て下さい。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

food 要素の開始タグ <food> と終了タグ </food> の間には <name>バナナ</name> と <color> 黄色 </color> という2つの別の要素が記述されています。

これは food に関するデータとして name と color に関するデータがあり、それぞれの値は name が「バナナ」で color が「黄色」という意味になります。この場合の food は name と color の親要素、 name と color が food の子要素となります。要素の内容についてさらに別の要素を使って定義することで、 XML 文書のデータをより処理しやすくなります。

例えば次の XML 文書と比較してみて下さい。内容的には同じですがデータを利用する場合にはより細かく要素として取り出してあったほうが便利です。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>黄色のバナナ</food>
  <food>赤いリンゴ</food>
</foods>

さらに子要素を親要素とした子要素を含めることもできます。このように XML 文書は階層的な構造になります。

要素の内容にはテキストを記述したり、他の子要素を含めることができますが、テキストと子要素を混在して記述することもできます。

次のサンプルは要素の内容としてテキストと子要素が混在した要素が含まれるものです。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
    <description>
      ブラジル産のバナナです。<feature>糖度が高い</feature>のが特徴です。
    </description>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
    <description>
      青森産のリンゴです。
    </description>
  </food>
</foods>

この XML 文書をブラウザで開いてみると次のように表示されます。

要素を記述する(5)

このようにテキストと要素を混在させることができます。

空要素を記述する

要素は開始タグと終了タグの間に内容を記述するものですが、内容が無い要素も存在します。このような要素を空要素といいます。空要素とは例えば HTML 文書でいうと改行を表す <br> 要素や画像を表す <img>要素のようなものです。

要素の内容としてテキストで記述するようなものがないけれど画像のようなデータが含まれている場合に空要素を使います。(画像の場合はテキストはありませんが、あとでで解説する「属性」を使って画像ファイルの場所などを記述します)。

空要素の場合は内容がありませんので、要素は次のように記述します。

<要素名></要素名>

空要素の場合は開始タグと終了タグをまとめて次のように記述することもできます。

<要素名/>

次のサンプルは XML 文書に空要素が含まれるものです。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
    <img></img>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
    <img/>
  </food>
</foods>

この XML 文書をブラウザで開いてみると空要素をどちらの記述方法で記載しても <要素名/> という形で表示されます。

要素を記述する(4)

ルート要素とは

XML 文書を作成する場合の重要なルールの一つに XML 文書全体を 1 つの要素の中に記述しなければいけないというルールがあります。( XML 宣言は除きます)。

ここまでに見てきた XML 文書のサンプルをもう一度見て下さい。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

XML 文書の一番外側には foods 要素があります。そしてこの要素の内容として他の全ての要素が記述されています。この一番外側にある要素を「ルート要素」と呼びます。

例えば次のような XML 文書は全体が 1 の要素の中に記述されていないので XML 文書としては正しくありません。

<?xml version="1.0" encoding="UTF-8" ?>
<food>
  <name>バナナ</name>
  <color>黄色</color>
</food>

<food>
  <name>リンゴ</name>
  <color>赤</color>
</food>

XML 文書を作成する場合は、必ずルート要素と呼ばれる一番外側の要素の中に他の要素が含まれるようにしてください。

属性を記述する

XML 文書で記述する要素に対して属性と呼ばれる付加的なデータを記述することができます。ここでは属性の記述方法と、要素と属性の使い分けについて解説します。

属性の記述方法

属性は要素の中でも開始タグの中に記述します。構文は次の通りです。

<要素名 属性名="属性の値">内容</要素名>

属性の名前、そして属性の値を記述します。値はダブルクオーテーションでくくって記述してください。例えば food 要素で属性の名前が code 、属性の値が 001 だった場合には次のように記述します。

<food code="001">木製の椅子</food>

複数の属性を要素に記述することができます。

<要素名 属性名1="属性の値1" 属性名2="属性の値2">内容</要素名>

ただし、同じ属性を複数回記述することはできません。

それでは複数の属性を記述したサンプルを見てみます。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food code="001" color="黄色">
    <name>バナナ</name>
  </food>

  <food code="002" color="緑">
    <name>リンゴ</name>
  </food>
</foods>

この XML 文書をブラウザで開いてみると次のように表示されます。

属性を記述する(1)

属性名で使用できる文字

属性名で使用できる文字は要素名で使用できる文字と同じです。

1文字目:
アルファベット、漢字、ひらがな、カタカナ、アンダーバー(_)、セミコロン(:)

2文字目以降:
1文字目で使用できる文字に加えて、数字、ドット(.)、ハイフン(-)

属性名には数値で始まる属性名は使用できません( 2 文字目からは使用できます)。

× <価格 2ndprice="6000">8000</価格>

属性と要素の使い分け

属性は要素に付加的なデータを記述する時に使用されますが、要素では内容として別の要素を子要素として記述することができますので付加的なデータは属性ではなく子要素として記述することもできます。

その為、先ほど属性を使って記述した XML 文書は子要素を使って次のように記述することもできます。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <code>001</code>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <code>002</code>
    <color>緑</color>
  </food>
</foods>

では属性と要素をどのように使い分ければいいのかというと、属性では同じ属性を複数使用できないなどのルール上の制約を除けばどちらを使っても構いません。非常に長かったり改行が含まれるようなテキストの場合は子要素を使ったほうが適していますし、外部に見せる必要がないような内部的なデータについては属性を使ったほうが適していますがあくまでどちらかと言えばというものなので、より適していると思われる方法を選択されてください。

画像を表すような要素の場合、テキストで表示する内容が無いので画像ファイルの場所は属性の値として記述し、要素そのものは空要素として記述できます。

<img src="http://www.example.com/sample.jpg"/>

何らかのルールを決めて属性と要素を使い分けるといいのではないでしょうか。

XMLにおける文字参照と実体参照

XML 文書の内容や属性の値などで特別な値を記述する場合に使用する文字参照と実体参照について解説します。

文字参照

キーボードから文字を直接入力する代わりに文字に対応する文字番号を使って文字を記述することができます。この方法を XML では文字参照と呼びます。文字番号は文字コードの一つである ISO 10646 で定められた文字コードを使用します。

例として次の XML 文書をみてください。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナナナ&#8482;</name>
  </food>
</foods>

name 要素の内容として"バナナナナ"のあとに &#8482; という値が記述されています。これは商標記号の文字を文字参照を使って記述したものです。この XML 文書をブラウザで表示してみると &#8482; が記述されているところに代わりに商標記号の文字が表示されています。

XMLにおける文字参照と実体参照(1)

文字参照は 10 進数または 16 進数の文字番号を使って次のように記述します。

&#(10進数の文字番号);
&#x(16進数の文字番号);

例えば 10 進数で記述する場合は &#6749; のように記述し、 16 進数で記述する場合は &#x1A5D; のように記述します。先ほどの例で商標記号を 10 進数の &#8482; と記述しましたが、 16 進数の &#x2122; と記述しても同じ結果となります。

文字参照の一覧の中で文字と文字番号の対応表の一部を下記に記述します。すべて 10 進数ですので 16 進数で記述する場合は文字番号の部分を 16 進数に変換してください。

&#165;  円記号 ¥
&#169;  著作権表示文字 ©
&#174;  登録商標記号 ®
&#176;  度記号 °
&#188;  1/4 ¼
&#189;  1/2 ½
&#190;  3/4 ¾
&#8482; 商用記号 ™
&#8721; シグマ ∑
&#8730; ルート √
&#8747; 積分 ∫

またこのあとで解説する実体参照で使われる文字についても文字参照で記述することができます。

&  アンパサンド &
<  小なり記号 <
>  大なり記号 >
"  二重引用符 "
'  一重引用符 '

実体参照

& や < など一部の特殊な文字については要素の内容にそのまま記述するとエラーになる文字があります。

例として次の XML 文書をみてください。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ&リンゴ</name>
  </food>
</foods>

name 要素の内容の中に「バナナ&リンゴ」と & を記述しています。この XML 文書をブラウザで表示してみると次のようにエラーが表示されます。

XMLにおける文字参照と実体参照(2)

このようなエラーとなる文字に関しては先に解説した文字参照を使って記述することもできますが、覚えにくい文字番号ではなく特別な文字列を使って記述することができます。この方法を XML では実体参照といいます。先ほどのサンプルの場合なら & と記述する代わりに実体参照の &amp; と記述してください。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ&amp;リンゴ</name>
  </food>
</foods>

この XML 文書をブラウザで表示してみると今度は正常に表示されました。

XMLにおける文字参照と実体参照(3)

XML で実体参照が用意されているのは次の 5 つだけです。( HTML の場合は他にもありますが XML の場合は 5 つだけです)。

&amp;   アンパサンド &
&lt;    小なり記号 <
&gt;    大なり記号 >
&quot;  二重引用符 "
&apos;  一重引用符 '

& および < については要素の内容や属性の値として記述する場合など常に実体参照で記述する必要があります。それに対して " および ' については要素の内容に記述する場合はそのまま記述してもエラーとなりませんが属性の値として記述する場合には実体参照で記述する必要があります。

> については要素の内容の中で ]]> と記述する必要がある場合だけそのまま記述するとエラーとなりますので実体参照を使って ]]&gt; と記述します。(ただエラーにならない場合も > については &gt; と記述しておいた方がケアレスミスは少なくなるかもしれません)。

なお & および < についても、このあとで解説する CDATA セクションの中で記述する場合にはそのまま記述することができます。

CDATAセクションの利用

先ほど説明したように & と < の 2 つの文字については要素の内容の中で使用する場合には文字参照か実体参照を使って記述する必要があります。ただ要素の内容として長文のテキストが記述されている場合など、数多くの & と < の文字が含まれている場合にはすべて変換するのは面倒です。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <detail>
    	取り扱っているのは&lt;アメリカ産&gt;&lt;ブラジル産&gt;
    	&lt;メキシコ産&gt;の3つの原産国のものです。
    </detail>
  </food>
</foods>

そこで要素の内容の中に数多くの & と < が含まれる可能性がある場合には CDATA セクションを利用すると便利です。 CDATA セクションの構文は次のとおりです。

<![CDATA[
・・・・
]]>

特別な文字が含まれるテキストなどをそのまま要素の内容に記述するのではなく、 <![CDATA[ で始まり ]]> で終わる間にテキストを記述し、そして CDATA セクションを要素の内容として記述します。 CDATA セクションの中に記述された文字については & や < であってもそのまま記述することができます。

先ほどのサンプルは CDATA セクションを使うと次のように記述することができます。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <detail>
    	<![CDATA[
    	取り扱っているのは<アメリカ産><ブラジル産>
    	<メキシコ産>の3つの原産国のものです。
    	]]>
    </detail>
  </food>
</foods>

この XML 文書をブラウザで表示してみると < などの文字であってもエラーとならずにそのまま表示されました。

XMLにおける文字参照と実体参照(4)

要素の内容として特別な文字が多く含まれる場合には CDATA セクションの利用も検討されてみてください。

コメントを記述する

XML 文書の中で何かメモを残していきたい時はコメントを記述することができます。構文は次の通りです。

<!-- コメント -->

コメントは <!-- で始まり --> で終わります。この間にコメントのテキストを記述して下さい。コメントは XML 文書の中のほとんどの場所に記述することができます。

例として次の XML 文書をみてください。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <!-- 要在庫確認 -->
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <!-- 緑っぽい赤 -->
    <color>赤</color>
  </food>
</foods>

この XML 文書をブラウザで表示してみると次のように表示されます。

コメントを記述する(1)

ただし XML 宣言よりも前に記述することはできません。また開始タグや終了タグの中に記述することもできません。次の XML 文書では XML 宣言の前にコメントを書きました。

<!-- 20xx/03 作成 -->
<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

この XML 文書をブラウザで表示してみると次のように「XML declaration allowed only at the start of the document」というエラーとなりました。

コメントを記述する(2)

またコメントの中に -- を記述することはできません。次の XML 文書をみてください。

<?xml version="1.0" encoding="UTF-8" ?>
<foods>
  <!-- 日本産 -- 愛知県 -->
  <food>
    <name>バナナ</name>
    <color>黄色</color>
  </food>

  <food>
    <name>リンゴ</name>
    <color>赤</color>
  </food>
</foods>

この XML 文書をブラウザで表示してみると次のように「Comment must not contain '--' (double-hyphen)」というエラーとなりました。

コメントを記述する(3)

-- --

XML の基本的な使い方について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。