2013/10/1 久米
タグ名やタグの中の属性名は勝手につけてよい。
なぜなら、自分で定義して自分で使うため。
ひとつのタグを頂点とする木構造
yajimaya.xml
<?xml version="1.0" encoding="UTF-8"?> <yajimaya> <book ISBN="1254000"> <category>小説</category> <title>我輩は猫である</title> <price>500</price> </book> <book ISBN="25004000"> <category>小説</category> <title>坊ちゃん</title> <price>600</price> </book> <book ISBN="40880500"> <category>漫画</category> <title>スラムダンク</title> <price>400</price> </book> </yajimaya> |
XMLやJSONのデータをPHPで読みにゆき、それを解読する(オブジェクト生成する)方法
メソッド | $obj = simplexml_load_file("xmlファイル")
|
simplexml_load_fileメソッドで 読み取りと同時にオブジェクトを生成 |
xmlを解読 |
|
自分のサイト のxml 表示例 |
<?php $obj = simplexml_load_file("yajimaya.xml"); $bk = $obj->book; $ttl0 = $bk[0]->title; $ttl1 = $obj->book[1]->title;//$bkを使用しなくてもいい $ttl2 = $obj->book[0]["ISBN"];//属性はこのように取得。あるいはbook[0]->attributes()->ISBN; print "$ttl0 $ttl1 \n"; ?> |
外部xml 表示例 |
<?php
$obj = simplexml_load_file("http://dailynews.yahoo.co.jp/fc/economy/rss.xml");
$ttl=$obj->channel->title;
$ttl2=$obj->channel->item[0]->title;
print "$ttl \n $ttl2 \n";
?> |
※注意 phpファイルをsimplexml_load_fileやfile_get_contentsで読む場合は
$obj = simplexml_load_file("yajimaya.php"); ではなく
$obj = simplexml_load_file("http://・・・/yajimaya.php"); のようにapacheを通して読む
なぜなら単にyajimaya.phpだとphpソースそのものを読んでしまうため。
小説 我輩は猫である 500円
小説 坊ちゃん 600円
漫画 スラムダンク 400円
これを利用して、ニュース速報(RSSリーダー)のページを作成してみよう。
ニュースXMLのURLは、各ニュース項目ののところをクリックすれば表示される。
例えば 経済ニュースの場合は
下記URLをロードする。
http://dailynews.yahoo.co.jp/fc/economy/rss.xml
ブラウザのXMLプレビュー機能が働いて直接xmlファイルが読めない場合は、
1)ソースの表示 2)すべて選択 3)すべてコピー 4)メモ帳にペースト 5)xmlファイルで保存
こうしてxmlファイルを直接開けば、構造が読めれる。
ニュースxmlの例
<?xml version="1.0" encoding="UTF-8" ?> - <rss version="2.0" xmlnsblogChannel="http://backend.userland.com/blogChannelModule"> - <channel> <title>Yahoo!ニュース・トピックス - 経済</title> <link>http://dailynews.yahoo.co.jp/fc/economy/</link> <description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description> <language>ja</language> <pubDate>Tue, 30 Oct 2007 04:10:05 +0900</pubDate> - <item> <title>ガソリン価格 150円突破濃厚</title> <link>http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/economy/gasoline/</link> <pubDate>Mon, 29 Oct 2007 17:34:56 +0900</pubDate> </item> - <item> <title>HOYA、ペンタックスを吸収合併</title> <link>http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/economy/company_affiliation/</link> <pubDate>Mon, 29 Oct 2007 15:22:23 +0900</pubDate> </item> + <item> + <item> + <item> + <item> - <item> <title>横浜市長 週刊誌報道で提訴へ</title> <link>http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/economy/publishing/</link> <pubDate>Mon, 29 Oct 2007 20:40:56 +0900</pubDate> </item> </channel> </rss> |
phpは純粋なオブジェクト指向言語ではなく、実際は手続き言語です。
オブジェクトを利用すると便利なためオブジェクトを使用している。
|
例 | 備考 | |
オブジェクトの生成 | オブジェクト名=new クラス名(); |
$obj=new DateTime(); | ただsimplexml_load_fileなど オブジェクトを返す関数を使う場合 newで作る必要はない オブジェクト名=simplexml_load_file("xmlファイル名"); オブジェクト名は自分の好きな変数名でよい |
オブジェクトの変数 | 適当な変数=オブジェクト名->変数名($のないもの); 適当な変数=オブジェクト名->配列名($のないもの)[添字]; |
$a=$obj->abc; $h=$obj->haihai[3]; |
変数がオブジェクトの場合、何段にも重ねてよい $a=$obj->abc->n->m; |
オブジェクトの関数 | オブジェクト名->関数名; |
$obj->ugoke(); $a=$obj->getSpeed(); |
file_get_contentsやsimplexml_load_stringなど外部URLにPHPからアクセスする場合、テクニックが必要です。
取得例 |
|
その1 |
<?php
$proxy = array(
"http" => array(
"proxy" => "tcp://proxy00.jec.ac.jp:8080",
"request_fulluri" => true,
),
);
$proxy_context = stream_context_create($proxy);
$str=file_get_contents("http://dailynews.yahoo.co.jp/fc/economy/rss.xml", false, $proxy_context);
?>
|
その2 file_get_contents |
<?php $proxy_user = "xxxxx"; $proxy_pass = "yyyyy"; $proxy_auth = base64_encode("$proxy_user:$proxy_pass"); $proxy = array( "http" => array( "proxy" => "tcp://プロキシHOST:ポート", "header" => "Proxy-Authorization: Basic $proxy_auth", "request_fulluri" => true, ), ); $proxy_context = stream_context_create($proxy); $str=file_get_contents("http://www.yahoo.co.jp/", false, $proxy_context); ?> |
その3 simplexml_load_string |
<?php $proxy = array( "http" => array( "proxy" => "tcp://プロキシHOST:ポート", "request_fulluri" => true, ), ); $proxy_context = stream_context_create($proxy); $xml_str=file_get_contents("http://www.yahoo.co.jp/", false, $proxy_context); $obj=simplexml_load_string($xml_str); ?> |
その4 simplexml_load_file |
<?php function getXMLfromURL($url) { $Proxy = getenv("HTTP_PROXY"); if (strlen($Proxy) > 1) { $r_default_context = stream_context_get_default ( array ('http' => array( 'proxy' => $Proxy, 'request_fulluri' => True, ), ) ); libxml_set_streams_context($r_default_context); } $daten = simplexml_load_file($url); return ($daten); } ?> |