忍者ブログ
[PR]
×

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



2024/03/29 20:00 |
PHP1-40:PHPでXML

XMLが何なのかについては未だにさっぱりわかりませんが、PHPにおいてのXMLの役割ははっきりしていて、まあ要するに単なるタグ付きのテキストです。

XMLを利用したXML-RPCというサービスがあり、これはXML文書をHTTPで送りつけることによって$_REQUESTより複雑な内容を送受信したりするサービスのことです。
そんなわけでXML-RPCのようなサービスにXML文書を送りつけたり、逆に送りつけられたXML文書を解析したりするのがPHPでのXMLの主な使い方になるでしょう。

特に意味はありませんがXML-RPCサービスでググると一番に出てくる郵便番号チェックを行うクライアントを作ってみましょう。
http://yubin.senmon.net/service/xmlrpc/

yuubin.php 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
 
    //XML
    $yuubin_xml='
        <methodCall>
          <methodName>yubin.fetchAddressByPostcode</methodName>
          <params>
            <param>
                <value><string>1000002</string></value>
            </param>
          </params>
        </methodCall>
    ';
 
    //URL
    $yuubin_href='http://yubin.senmon.net:80/service/xmlrpc/';
    
    //HTTPリクエスト作成
    $yuubin_context = stream_context_create(
        array(
            'http' => array(
            'method' => "POST",
            'header' => "Content-Type: text/xml",
            'content' => $yuubin_xml)
        )
    );
    
    //XML-RPC
    $ret=file_get_contents($yuubin_href, false, $yuubin_context);
 
    print("<pre>");var_dump($ret);die();

あっさり成功。
簡単すぎるだろ。

レスポンスは同様にXMLで返ってきますので、こちらを解析してみましょう。
XMLツールとしては、DOM、SAX、SimpleXML、XMLReader、XSLT等々がありますがどれ使えばいいんだよってかどう違うんだこれ。
http://jp2.php.net/manual/ja/refs.xml.php

最も簡単なのはsimplexml_load_stringで、XMLをそのまま突っ込むだけで配列になります。
http://jp2.php.net/manual/ja/function.simplexml-load-string.php

ここではXMLパース目的としては一番簡単とされているSimpleXMLを用いてパースしてみます。
リクエスト用XMLはxmlrpc_encode_requestを用いれば面倒なタグを書く必要はありません。
http://jp2.php.net/manual/ja/function.xmlrpc-encode-request.php

yuubin2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
 
    //XML
    $yuubin_xml_method='yubin.fetchAddressByPostcode';
    $yuubin_xml_params=array('1000002');
    $yuubin_xml=xmlrpc_encode_request($yuubin_xml_method,$yuubin_xml_params);
    
    //URL
    $yuubin_href='http://yubin.senmon.net:80/service/xmlrpc/';
    
    //HTTPリクエスト作成
    $yuubin_context = stream_context_create(
        array(
            'http' => array(
            'method' => "POST",
            'header' => "Content-Type: text/xml",
            'content' => $yuubin_xml)
        )
    );
    
    //XML-RPC
    $yuubin_request=file_get_contents($yuubin_href, false, $yuubin_context);
    
    //SimpleXMLElement
    $yuubin_sxml=new SimpleXMLElement($yuubin_request);
    
    //XMLの一部を抽出
    foreach(
        $yuubin_sxml
        ->params
        ->param
        ->value
        ->array
        ->data
        ->value
        ->struct
        ->member
         as $yuubin_sxml_val){
            print($yuubin_sxml_val->name.':'
            .$yuubin_sxml_val->value->children()."<br>\n");
    }

あとは郵便番号を引数にして関数化したり、他のメソッドも実装してクラス化したりするとよいかもしれません。
あと先方でも指摘されているエラー処理も忘れずに。

それにしても->のところはもうちょっとどうにかならないのだろうか。
PR


2008/12/12 20:17 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



<<Pear::Net_Pingにバグ | HOME | PHP1-39:ディレクトリでイテレータ>>
忍者ブログ[PR]