XMLテキストの書き方: 外部エンティティ

2002年4月28日(日)更新


■外部エンティティ

たけち: 今回は、複数のXMLファイルでひとつのXMLドキュメントを作る方法について学んでみよう。

さらら: えっ、複数のXMLファイルで? どういうことなの?

たけち: そうだね。たとえば、万葉集は20巻あるよね。そのひとつひとつの「巻」をそれぞれXMLファイルとしてつくって、それをまとめるXMLファイルを作るってことなんだ。図のようなことなんだよ。

複数のファイルでひとつのXMLドキュメントを作る

さらら: へぇ〜、そういうことなの。でもどんな風に書けばいいのかしら。

たけち: 前回に、エンティティ参照について学んだよね。

さらら: うん。みたいにして参照したわね。

たけち: 基本的にはそれと同じようなやり方をすればいいんだよ。つまり、"エンティティの宣言と参照"をすればいいんだね。ただ、XMLドキュメントから他のファイルとして保存されている外部のファイルを参照するところが違うところだね。この外部のファイルのことを、"外部エンティティ"と呼んでいるんだ。

さらら: そうなの。"外部エンティティの宣言と参照"をすれば、複数のXMLファイルでひとつの大きなXMLドキュメントを作ることができるってことなのね。


■外部エンティティの宣言と参照

たけち: じゃぁ、外部エンティティの宣言と参照の書き方を見てみようね。

さらら: だっ、大丈夫かしら (^ ^;

たけち: 大丈夫だよ。ともかく次の図を見てみて。DOCTYPEのところで宣言をして、ルート要素の中の必要なところで&エンティティ名;のように書いて参照するんだよ。

外部エンティティの宣言と参照の仕方

さらら: あ・・・前回のエンティティの宣言と参照と似ているのね。ちょっと、安心。

たけち: じゃあ、万葉集を例にXMLドキュメントを書いてみよう。

さらら: うん!


■外部エンティティを使ったXMLドキュメントのサンプル

たけち: じゃあ、つぎの図を見てね。サンプルドキュメントmanyosyu(万葉集)第1巻第2巻から構成されていると考えているね。

エンティティの宣言と参照

さらら: volume1.xmlvolume1.xm2がそれね。

たけち: そうそう。それぞれをDOCTYPEvolume1volumeというエンティティ名で宣言しているね。

さらら: うんうん。で、外部エンティティを参照する場所には、&volume1;&volume2;って書くのね。そうすると、それぞれのXMLファイルの内容がその場所に入るのね。

たけち: そうだね。じゃあ、サンプルのリストを次に載せておこうね。

万葉集サンプルドキュメント

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE manyosyu [
<!ENTITY volume1 SYSTEM "volume1.xml">
<!ENTITY volume2 SYSTEM "volume2.xml">

]>

<manyosyu>
&volume1;
&volume2;

</manyosyu>

たけち: 次の二つは、volume1.xmlとvolume2.xmlのリストだよ。

volume1.xmlのリスト

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

<volume no="1">
<poem>
  <pno>8</pno>
  <mkana>熟田津尓 船乗世武登 月待者 潮毛可奈比沼 今者許藝乞菜</mkana>
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>熟田津(にきたつ)に、船(ふな)乗りせむと、月待てば、潮もかなひぬ、今は漕(こ)ぎ出(い)でな</yomi>
  <image>image/m0008.jpg</image>
  <mean>熟田津(にきたつ)で、船を出そうと月を待っていると、いよいよ潮の流れも良くなってきた。さあ、いまこそ船出するのです。</mean>
</poem>

・・・・・・・以下、省略してます。

</volume>

volume1.xm2のリスト

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

<volume no="2">
<poem>
  <pno>90</pno>
  <mkana>君之行 氣長久成奴 山多豆乃 迎乎将徃 待尓者不待</mkana>
  <poet>衣通王(そとほしのおほきみ)</poet>
  <yomi>君が行き、日(け)長くなりぬ、山たづの、迎へを行かむ、待つには待たじ</yomi>
  <image>image/m0090.jpg</image>
  <mean>あなたがいらっしゃってから、ずいぶんと日が過ぎてしまいました。山たづのように、あなたを迎えに行きましょう、待ってなんかいられないわ。</mean>
</poem>

・・・・・・・以下、省略してます。

</volume>

さらら: うんうん。だいたいわかるわ。

たけち: じゃあ、サンプルのリストを次に載せておくからクリックしてみて(Internet Explorer 6.0をお使いくださいね。)。あっ、XSLスタイルシートは指定していないから、構造とテキストが見えるだけど、ちゃんと外部エンティティ参照されてvolume1.xmlとvolume2.xmlのドキュメントが組み込まれたドキュメントが見えると思うよ。

外部エンティティ参照のサンプル: ext_sample.xml

外部エンティティ参照のサンプルの表示結果

さらら: あっ、見えた見えた。へぇ〜、外部エンティティねぇ〜。こういう風にして万葉集も20巻までつくって行けばいいのよね。

たけち: そうだね。今回はここまでね。次回はXSLTスタイルシートを適用してみようか。

さらら: うん。ありがとね。

→ 次回はXSLスタイルシートの適用です。


注 (1) ここでのサンプルをご覧になる場合は、Microsoft社のInternet Explorer 6.0をお使いください。Internet Explorer 5.5ではうまく表示できないようです。Internet Explorer 6.0のインストールについては、XMLページをIEで表示させよう(基礎編-1)ほご参照ください。

注 (2) volume1.xml, volume2.xmlのそれぞれのファイルは次をご参照ください。