[PHP-users 34462] Re: XMLデータ取得について

山本 正浩 yamamoto @ thinkmeta.jp
2009年 3月 23日 (月) 16:21:52 JST


yamamotoといいます。

興味があったので試してみました。
確かに同様のエラーになりました。
Snoopyでのheaderとbodyの分離がうまくいっていないようです。

取得したXMLを自前のApache(Windows)に載せて、そのXMLを取得するように
試したところ、こちらはうまくいきました。

以下、fetch()した直後のobjをvar_dumpにかけた結果です。
[エラーになるパターン]
------------------------------------------------------------
object(Snoopy)#1 (41) {
  ["host"]=>
  string(12) "ri2.rois.com"
  ["port"]=>
  int(80)
  ["proxy_host"]=>
  string(0) ""
  ["proxy_port"]=>
  string(0) ""
  ["proxy_user"]=>
  string(0) ""
  ["proxy_pass"]=>
  string(0) ""
  ["agent"]=>
  string(13) "Snoopy v1.2.4"
  ["referer"]=>
  string(0) ""
  ["cookies"]=>
  array(0) {
  }
  ["rawheaders"]=>
  array(0) {
  }
  ["maxredirs"]=>
  int(5)
  ["lastredirectaddr"]=>
  string(0) ""
  ["offsiteok"]=>
  bool(true)
  ["maxframes"]=>
  int(0)
  ["expandlinks"]=>
  bool(true)
  ["passcookies"]=>
  bool(true)
  ["user"]=>
  string(0) ""
  ["pass"]=>
  string(0) ""
  ["accept"]=>
  string(56) "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"
  ["results"]=>
  string(2) "
"
  ["error"]=>
  string(0) ""
  ["response_code"]=>
  string(16) "HTTP/1.0 200 OK
"
  ["maxlength"]=>
  int(500000)
  ["read_timeout"]=>
  int(0)
  ["timed_out"]=>
  bool(false)
  ["status"]=>
  string(3) "200"
  ["temp_dir"]=>
  string(4) "/tmp"
  ["curl_path"]=>
  string(19) "/usr/local/bin/curl"
  ["_maxlinelen"]=>
  int(4096)
  ["_httpmethod"]=>
  string(3) "GET"
  ["_httpversion"]=>
  string(8) "HTTP/1.0"
  ["_submit_method"]=>
  string(4) "POST"
  ["_submit_type"]=>
  string(33) "application/x-www-form-urlencoded"
  ["_mime_boundary"]=>
  string(0) ""
  ["_redirectaddr"]=>
  bool(false)
  ["_redirectdepth"]=>
  int(0)
  ["_frameurls"]=>
  array(0) {
  }
  ["_framedepth"]=>
  int(0)
  ["_isproxy"]=>
  bool(false)
  ["_fp_timeout"]=>
  int(30)
  ["headers"]=>
  array(16) {
    [0]=>
    string(16) "HTTP/1.0 200 OK
"
    [1]=>
    string(24) "Content-Type: text/html
"
    [2]=>
    string(1) "
"
    [3]=>
    string(44) "<?xml version="1.0" encoding="SHIFT_JIS" ?>
"
    [4]=>
    string(1) "
"
    [5]=>
    string(44) "<ric name="XAU=X" data_quality="Real-time">
"
    [6]=>
    string(27) "<fid id="BID">954.50</fid>
"
    [7]=>
    string(27) "<fid id="ASK">956.10</fid>
"
    [8]=>
    string(29) "<fid id="BID_1">950.90</fid>
"
    [9]=>
    string(29) "<fid id="ASK_1">952.90</fid>
"
    [10]=>
    string(44) "<fid id="DSPLY_NAME">Reuters         </fid>
"
    [11]=>
    string(34) "<fid id="BID_HIGH_1">955.55</fid>
"
    [12]=>
    string(33) "<fid id="BID_LOW_1">949.85</fid>
"
    [13]=>
    string(40) "<fid id="TIMACT">15:49 Asia/Tokyo</fid>
"
    [14]=>
    string(39) "<fid id="ACTIV_DATE">23 MAR 2009</fid>
"
    [15]=>
    string(7) "</ric>
"
  }
}
------------------------------------------------------------

[正常処理できるパターン]
------------------------------------------------------------
object(Snoopy)#1 (41) {
  ["host"]=>
  string(18) "local.thinkmeta.jp"
  ["port"]=>
  int(80)
  ["proxy_host"]=>
  string(0) ""
  ["proxy_port"]=>
  string(0) ""
  ["proxy_user"]=>
  string(0) ""
  ["proxy_pass"]=>
  string(0) ""
  ["agent"]=>
  string(13) "Snoopy v1.2.4"
  ["referer"]=>
  string(0) ""
  ["cookies"]=>
  array(0) {
  }
  ["rawheaders"]=>
  array(0) {
  }
  ["maxredirs"]=>
  int(5)
  ["lastredirectaddr"]=>
  string(0) ""
  ["offsiteok"]=>
  bool(true)
  ["maxframes"]=>
  int(0)
  ["expandlinks"]=>
  bool(true)
  ["passcookies"]=>
  bool(true)
  ["user"]=>
  string(0) ""
  ["pass"]=>
  string(0) ""
  ["accept"]=>
  string(56) "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"
  ["results"]=>
  string(401) "<?xml version="1.0" encoding="SHIFT_JIS" ?>

<ric name="XAU=X" data_quality="Real-time">
<fid id="BID">954.40</fid>
<fid id="ASK">955.60</fid>
<fid id="BID_1">950.90</fid>
<fid id="ASK_1">952.90</fid>
<fid id="DSPLY_NAME">Reuters         </fid>
<fid id="BID_HIGH_1">955.15</fid>
<fid id="BID_LOW_1">949.85</fid>

<fid id="TIMACT">15:09 Asia/Tokyo</fid>
<fid id="ACTIV_DATE">23 MAR 2009</fid>
</ric>


"
  ["error"]=>
  string(0) ""
  ["response_code"]=>
  string(17) "HTTP/1.1 200 OK
"
  ["maxlength"]=>
  int(500000)
  ["read_timeout"]=>
  int(0)
  ["timed_out"]=>
  bool(false)
  ["status"]=>
  string(3) "200"
  ["temp_dir"]=>
  string(4) "/tmp"
  ["curl_path"]=>
  string(19) "/usr/local/bin/curl"
  ["_maxlinelen"]=>
  int(4096)
  ["_httpmethod"]=>
  string(3) "GET"
  ["_httpversion"]=>
  string(8) "HTTP/1.0"
  ["_submit_method"]=>
  string(4) "POST"
  ["_submit_type"]=>
  string(33) "application/x-www-form-urlencoded"
  ["_mime_boundary"]=>
  string(0) ""
  ["_redirectaddr"]=>
  bool(false)
  ["_redirectdepth"]=>
  int(0)
  ["_frameurls"]=>
  array(0) {
  }
  ["_framedepth"]=>
  int(0)
  ["_isproxy"]=>
  bool(false)
  ["_fp_timeout"]=>
  int(30)
  ["headers"]=>
  array(9) {
    [0]=>
    string(17) "HTTP/1.1 200 OK
"
    [1]=>
    string(37) "Date: Mon, 23 Mar 2009 07:22:14 GMT
"
    [2]=>
    string(41) "Server: Apache/2.0.63 (Win32) PHP/5.2.6
"
    [3]=>
    string(46) "Last-Modified: Mon, 23 Mar 2009 07:22:08 GMT
"
    [4]=>
    string(28) "ETag: "32c22-191-1fcef943"
"
    [5]=>
    string(22) "Accept-Ranges: bytes
"
    [6]=>
    string(21) "Content-Length: 401
"
    [7]=>
    string(19) "Connection: close
"
    [8]=>
    string(31) "Content-Type: application/xml
"
  }
}
string(401) "<?xml version="1.0" encoding="SHIFT_JIS" ?>

<ric name="XAU=X" data_quality="Real-time">
<fid id="BID">954.40</fid>
<fid id="ASK">955.60</fid>
<fid id="BID_1">950.90</fid>
<fid id="ASK_1">952.90</fid>
<fid id="DSPLY_NAME">Reuters         </fid>
<fid id="BID_HIGH_1">955.15</fid>
<fid id="BID_LOW_1">949.85</fid>

<fid id="TIMACT">15:09 Asia/Tokyo</fid>
<fid id="ACTIV_DATE">23 MAR 2009</fid>
</ric>


"
object(SimpleXMLElement)#2 (2) {
  ["@attributes"]=>
  array(2) {
    ["name"]=>
    string(5) "XAU=X"
    ["data_quality"]=>
    string(9) "Real-time"
  }
  ["fid"]=>
  array(9) {
    [0]=>
    string(6) "954.40"
    [1]=>
    string(6) "955.60"
    [2]=>
    string(6) "950.90"
    [3]=>
    string(6) "952.90"
    [4]=>
    string(16) "Reuters         "
    [5]=>
    string(6) "955.15"
    [6]=>
    string(6) "949.85"
    [7]=>
    string(16) "15:09 Asia/Tokyo"
    [8]=>
    string(11) "23 MAR 2009"
  }
}
------------------------------------------------------------

すみません、今のところここまでしか分かりません。
コンテントタイプなども変えてみましたが、変化はありませんね。


2009/03/23 15:03 Minoru.Harada <harada @ acekoeki.co.jp>:
> お世話になります。
> Minoと申します。
>
> XMLのデータ取得について質問いたします。
> XMLで提供されるデータを受信してブラウザに表示する
> プログラムを作成することになりました。XMLは扱った
> ことがなくインターネットで調べていたらSnoopy.class.php
> という便利なものがあることを知りました。
>
> リクエストを出すと次のようなデータが取得できます。
> ----------------------------------------------------------
>  <?xml version="1.0" encoding="SHIFT_JIS" ?>
> - <ric name="JPY=X" data_quality="Real-time">
>  <fid id="BID">96.20</fid>
>  <fid id="ASK">96.25</fid>
>  <fid id="BID_1">95.92</fid>
>  <fid id="ASK_1">95.98</fid>
>  <fid id="DSPLY_NAME">Reuters</fid>
>  <fid id="BID_HIGH_1">96.55</fid>
>  <fid id="BID_LOW_1">95.43</fid>
>  <fid id="TIMACT">14:29 Asia/Tokyo</fid>
>  <fid id="ACTIV_DATE">23 MAR 2009</fid>
>  </ric>
> ----------------------------------------------------------
>
> サイトに載っていたサンプルを参考に作成してみました。
>
> <?php
> $req =
> "http://ri2.rois.com/YSIiEha1148tDU*glRAVlJEjKTE5RX5PD0j-*62*Zupzs/CTIB/RI3A
> PISNAP?RIC=XAU=X&ENCODING=SHIFT_JIS&FORMAT=XML";
> require_once ('Snoopy.class.php');
> $obj = new Snoopy;
> $obj->fetch($req);
> $data = $obj->results;
> $xml = simplexml_load_string($data);
> ?>
>
> $xmlにデータを展開するところでエラーになってしまいます。
>
> 【エラー内容】
> Warning: Entity: line 2: parser error : Start tag expected, '<' not found in
> C:\Program Files\Apache Group\Apache2\htdocs\kikinzoku\request.php on line
> 11
>
> Warning: in C:\Program Files\Apache
> Group\Apache2\htdocs\kikinzoku\request.php on line 11
>
> Warning: ^ in C:\Program Files\Apache
> Group\Apache2\htdocs\kikinzoku\request.php on line 11
>
> どこが悪いのでしょうか?
> よろしくお願いいたします。

-- 
-<Thinkmeta>------------------------------------------
<?xml version="1.0" encoding="ISO-2022-JP" ?>
<signature>
    <name>山本 正浩[Masahiro Yamamoto]</name>
    <mail>yamamoto @ thinkmeta.jp</mail>
    <web>http://www.thinkmeta.jp/</web>
</signature>


PHP-users メーリングリストの案内