WebプログラミングV

 目次へ 次へ

2013/10/1 久米

T.XMLとJSONとAPI

1.XML

1.1 XMLとは

タグ名やタグの中の属性名は勝手につけてよい。
なぜなら、自分で定義して自分で使うため。

1.2 XMLの構造

ひとつのタグを頂点とする木構造

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>

演習1 よく行くスーパーの商品をXMLで列挙してみよ

1.3 解読

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_filefile_get_contentsで読む場合は

$obj = simplexml_load_file("yajimaya.php"); ではなく
$obj = simplexml_load_file("http://・・・/yajimaya.php"); のようにapacheを通して読む

なぜなら単にyajimaya.phpだとphpソースそのものを読んでしまうため。

演習2 谷島屋書店の本リストxmlファイルを読み取り表示するPHPを作成せよ。

小説 我輩は猫である 500円
小説 坊ちゃん 600円
漫画 スラムダンク 400円

演習3 よく行くスーパーの商品xmlファイルを読み取り表示するPHPを作成せよ。

 

1.4 外部xml配信サービス Yahooニュース

Yahoo!ニュースXML配信サービス

これを利用して、ニュース速報(RSSリーダー)のページを作成してみよう。
ニュースXMLのURLは、各ニュース項目のRSSのところをクリックすれば表示される。
例えば 経済ニュースの場合は 下記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>

演習4 自分の好きなニュース項目を選んで、読み取り表示してみよ

 


参考 PHPのオブジェクト

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
file_get_contents

<?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); 
} 
?>