さて前回使い道がないとか書いたserializeですが、ひとつ便利な使い道があって、それがAPIとしての利用です。
WebサービスAPIの返り値はXMLとなっている場合がほとんどです。
ところが、PHPのXML解析はそれほど優秀ではありません。
PHP5でSimpleXMLが出てだいぶましになりましたが、それ以前のXML処理関数は何故かやたら面倒です。
http://jp.php.net/manual/ja/refs.xml.php
もっと簡単にどうにかならないかということで、Yahooの中の人が「XMLじゃなくてserializeで流せばよくね?」とか言っています。
日本ではまだ対応していないようですが、yahoo.comでは対応しているサービスもあるようです。
http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Enkumi&results=1
これはイメージ検索のAPIですが、最後にoutput=phpとするとserialize形式で出力されます。
http://api.search.yahoo.com/ImageSearchService/V1/imageSearch?appid=YahooDemo&query=Enkumi&results=1&output=php
XMLとserial形式それぞれでパースしてみます。
yahoo_search_api.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//取得
$url_xml='http://api.search.yahoo.com/ImageSearchService/V1/'
.'imageSearch?appid=YahooDemo&query=Enkumi&results=1';
$url_ser=$url_xml.'&output=php';
//XMLパーサで解析
$tmp_xml=file_get_contents($url_xml);
$xml_parser = xml_parser_create() ;
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($xml_parser, $tmp_xml,$data_xmlparse);
xml_parser_free($xml_parser);
//PHP5ならSimpleXMLで非常に簡単
$data_simplexml=simplexml_load_file($url_xml);
//Serializeだと
$tmp_ser=file_get_contents($url_ser);
$data_ser=unserialize($tmp_ser);
var_dump($data_xmlparse,$data_simplexml,$data_ser);
|
XMLパーサではxml_parse_into_structを使っていますが、これには致命的な欠点があり、パースした結果が一次元配列になってしまいます。
深さ情報自体は残っていますが、XMLツリーを再現するにはパースした結果をさらにパースして云々なんてことをしなくてはなりません。。
もしくは、xml_set_default_handlerでパース関数を自作したりする必要があります。
非常に面倒です。
あと、デフォルトだとタグが勝手に全部大文字になります。なんで?
SimpleXMLではようやくそんな煩わしさから解放されました。
XMLをそのままの形でオブジェクトに格納できます。
serial形式だと、unserializeするだけで送信元が想定した形に簡単に戻すことができます。
オブジェクトだけではなく配列でもstringでも何でもOKです。
stringのシリアル化とか意味はありませんが。
PR
トラックバック
トラックバックURL: