前回,Webサービスへリクエストを送り,XML形式のデータが受け取れることができました。今回は,このXMLデータから必要な情報を取り出してみましょう。

 Yahoo!画像検索サービスで,どのようなXML形式のデータを返してくれるかと言うのは,Yahoo!デベロッパーネットワークの画像検索のページにサンプルが載っています。

名前空間の仕組み

 多くのWebサービスが返すXML形式のデータは,「名前空間(ネームスペース)」を使って,修飾がなされています。いわゆる,QName(Qualified Name)という形式ですね。皆さんもXML形式のデータを眺めている時に「<rdf:RDF >」のように,通常の名前ではなく,「:」を使った名前を見かけたことがあるでしょう。あの形式です。

■QNameの例

//修飾されていないnameエレメント
<data>
  <name>太郎</name>
</data>
//修飾されているnameエレメント
<data xmlns:yamada="山田">
  <yamada:name>太郎</yamada:name>
</data>

 Yahoo!の画像検索もこの例に漏れず,2種類の名前空間によって修飾されています。上記のページから,画像検索サービスの結果のサンプル部分を見てみると,次のような形式になっています。

<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="urn:yahoo:jp:srchmi"
/*--省略--*/
>
<Result>
/*--省略--*/
</Result>
...
</ResultSet>

ルートのエレメントである,ResultSetエレメント内を見てみると,

xmlns:名前空間接頭辞=名前空間識別子
と,いう属性の記述が見つかりますね。この形式の記述は「名前空間宣言」と呼ばれます。「名前空間」というのは,ざっくりと言ってしまうと,XML内のエレメント名等の衝突を防ぐための仕組みです。

 なぜ,このような仕組みが必要なのか,ピンと来ないかもしれません。そこで,私たちの身近なものでたとえてみましょう。目の前に2人の「太郎くん」がいるとします。この時,どちらかの「太郎くん」を明確に指定するのには,何か他の情報が必要です。通常は,苗字を含んだフルネームを使って「山田太郎くん」と「佐藤太郎くん」のように区別するでしょう。あるいは,住んでいる住所を元に「町田の太郎くん」と「巣鴨の太郎くん」のように区別するかもしれません。とにかく,同じ名前を持つ2人の太郎くんのそれぞれを識別できる,「何かユニークな情報」があればいいわけですね。

 名前空間の仕組みは,この考え方に似ています。前述の名前空間宣言は,太郎くんの例に例えると,

<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet
 xmlns:machida="町田"
 xmlns="巣鴨"
/*--省略--*/
>
というイメージです。つまり,「このXML内では,『町田』と『巣鴨』という2つのユニークな情報を使って,名前の区別を行いますよ」と,宣言しているようなものなのです。

 XMLのデータは,Webの中で利用されることが多くあります。そのため,XMLのエレメント名や属性名等の名前を勝手に付けていると,その名前がバッティングすることは避けられそうにありません。例えば「data」ですとか「name」「score」なんて名前はバッティングしないほうが奇跡的でしょう。

 このような名前は,個々の独立したXMLファイルを扱っている場合には問題ありませんが,同じ名前を持つXMLファイルを組み合わせて使用するような場合,個々の名前を区別する仕組みが無いと少々困ってしまいますよね。そこで,「名前空間」という仕組みを使って,名前を修飾できるような仕組みが考えられたというわけです。

 また,苗字や住所の代わりに,Web上で「ユニークな物」と言われて利用されるのは,大抵はURL(URI)です。ユニークなものであれば良いので,URNでも構いません。

xmlns:名前空間接頭辞=名前空間識別子
という形で宣言される名前空間では,
xmlns:名前空間接頭辞=ユニークなURI
という形で,URIを使って「何かユニークな情報」を元に区別をできるような準備をします。でも,このユニークなURIというのは,得てしてちょっと長すぎて使いにくい,という欠点があります。そこで,そのURIの「略称」とでも言える「名前空間接頭辞」を宣言できる仕組みが考えられました。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
という記述は,「http://www.w3.org/2001/XMLSchema-instanceに属する名前」と指定する代わりに,「xsiに属する名前」と記述できるよう宣言をしているわけですね。

では,

xmlns="urn:yahoo:jp:srchmi"
という記述はどうでしょうか?名前空間接頭辞が見当たらず,「xmlns」の後ろにいきなり「=」(イコール),そしてURNが記述されていますね。このような「名前空間接頭辞を省いて宣言された名前空間」は,「暗黙の名前空間」とでもいうような働きをします。

 通常,名前空間を宣言したXMLデータでは,

<root xmlns:名前空間接頭辞=ユニークなURI>
  <名前空間接頭辞:node>値</名前空間接頭辞:node>
</root>
のように,「名前空間接頭辞:名前」という形で名前を記述するのですが,名前空間接頭辞を省いて宣言された名前空間がある場合,
<root xmlns:名前空間接頭辞=ユニークなURI(1) xmlns=ユニークなURI(2)>
  <node>値</node>
</root>
と,名前空間接頭辞を省いて記述された名前(上記の例では,エレメント)は,暗黙的に「ユニークなURI(2)」の名前空間に属する物として扱われる(上記の例では,<ユニークなURI(2):node>として扱われる)というルールになっているのです。「デフォルトの名前空間」とでもいうような効果があるわけですね。

 この仕組みを踏まえると,Yahoo!画像検索サービスの返すXML形式のデータは,

<?xml version="1.0" encoding="UTF-8" ?>
<ResultSet
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="urn:yahoo:jp:srchmi"
/*--省略--*/
ですので,「特に名前空間接頭辞を用いていない個所は,『urn:yahoo:jp:srchmi名前空間』,接頭辞『xsi』を用いている個所は,『http://www.w3.org/2001/XMLSchema-instance名前空間』として扱いますよ」という意味だとわかりますね。

 Webサービスで扱われるXML形式のデータでは,このような「名前空間」の仕組みが使われています。ただ,この説明も非常にざっくりとした物です。興味のある方は,別途,XML関係の書籍等を使って「名前空間」の仕組みを学習してみてください。