第20回 FlashムービーをYahoo! Webサービスと連携させる
後編:受け取ったXMLデータから必要な情報を抽出する
前回,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エレメント内を見てみると,
と,いう属性の記述が見つかりますね。この形式の記述は「名前空間宣言」と呼ばれます。「名前空間」というのは,ざっくりと言ってしまうと,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でも構いません。
という形で宣言される名前空間では,
という形で,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関係の書籍等を使って「名前空間」の仕組みを学習してみてください。