忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 03:49 |
PHP1-72:シリアライズ続き

さて前回使い道がないとか書いた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
<?php
    
    //取得
    $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


2009/05/01 17:12 | Comments(0) | TrackBack(1) | PHP

トラックバック

トラックバックURL:
serialize()でMDB2のインスタンスを使い回したいとします。 serialize0.php 1 2 3 4 5 6 7 8 <?php //MDB2 require_once(''MDB2.php''); $db=MDB2:...
弱小PHPerの憂鬱 | 2009/10/13 19:45

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-73:したらばBBS/NGワードまとめて削除 | HOME | PHP1-71:シリアライズ>>
忍者ブログ[PR]