RSSを自分のサイトに表示に表示しようとしています。

http://1811way.com/work008/source20120728.txt
を参照してください。

3行目
$rssdata = simplexml_load_file("http://ideblog.info/feed");

$rssdata = simplexml_load_file("http://blogs.yomiuri.co.jp/olympic2012/atom.xml");
に換えるとエラーになります。
エラーメッセージ(同じようなメッセージが全部で9件)
Notice: Trying to get property of non-object in C:\Tools\htdocs\phpstudy\rss01.php on line 13

simplexml_load_file関数に入れるプロパティが違う、といことだと思いますが、
どう修正すればいいか、わかりません。

上記サイトを元に、ご指摘いただけると助かります。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/07/30 15:53:58
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント300pt

rssとatomは構造に違いがあるため、読み取り方法も少し変わります。

下記、元のコードをそのまま使う形でatomにも対応させた例です。

<?php 
//ブログなどのRSS FEEDのURL設定 
$rssdata = simplexml_load_file("http://blogs.yomiuri.co.jp/olympic2012/atom.xml");
// 読み込み件数を設定 
$num_of_data = 3; 

//出力内容を空っぽに初期化 
$outdata = ""; 

if ($rssdata->getName() == 'feed') {
    // atom の場合の処理
    $children =  $rssdata->children('http://www.w3.org/2005/Atom');
    //設定した読み込み件数分だけ取得を繰り返す
    for ($i=0; $i<$num_of_data; $i++){ 
        $myEntry = $children->entry[$i]; //記事1個取得
        $myDate = $myEntry->published; //日付取得 
        $myTitle = $myEntry->title; //タイトル取得
        //リンクURL取得
        $myAttr = $myEntry->{'link'}->attributes();
        $myLink = $myAttr['href'];
        //出力内容にタイトル(リンク付)を入れる 
        $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; 
        //出力内容に日付けを入れる 
        $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; 
    }
} else {
    // rss の場合の処理
    //設定した読み込み件数分だけ取得を繰り返す 
    for ($i=0; $i<$num_of_data; $i++){ 
        $myEntry = $rssdata->channel->item[$i]; //記事1個取得 
        $myDate = $myEntry->pubDate; //日付取得 
        $myTitle = $myEntry->title; //タイトル取得 
        $myLink = $myEntry->link; //リンクURL取得 
        //出力内容にタイトル(リンク付)を入れる 
        $outdata .= '<h3 class="posttitle"><a href="' . $myLink . '">' . $myTitle . '</a></h3>' . "\n"; 
        //出力内容に日付けを入れる 
        $outdata .= '<p class="postdate">' . $myDate . '</p>' . "\n"; 
    }
}

echo $outdata; //全部出力する 
id:kohhi

早速お返事いただきありがとうございました。できました。

2012/07/28 22:40:54
  • id:fut573
    channel
      ┗item
      ┗item
      ┗item という形ではなく
    channel
    item
    item
    item という形で公開していた新聞社があったはずなので

    $myEntry = $rssdata->channel->item[$i]; //記事1個取得
    の部分は
    if(isset($rssdata->channel->item)){ $myEntry = $rssdata->channel->item[$i]; //記事1個取得}else{$myEntry = $rssdata->item[$i]}
    とやったほうが汎用性上がると思います
  • id:windofjuly
    うぃんど 2012/07/28 23:13:50
    rss2.0の構造
    channel
      ┗item
      ┗item
      ┗item

    rss1.0の構造
    channel
    item
    item
    item

    rss1.0にも対応させたい場合は、
    fut573さん御提案のように存在するかどうかで判断しても良いですし、
    下記の値で処理を分けても良いでしょう。
    (回答のコードは既存のものにatom対応だけを付加したもので、
     rss1.0への対応は考慮しておりませんでした)
    $rssdata->getName() == 'feed' // atom
    $rssdata->getName() == 'rss' // rss2.0
    $rssdata->getName() == 'rdf' // rss1.0
  • id:kohhi
    次の質問をしてしまいました。
    http://q.hatena.ne.jp/1343485953
    すいません。
    コメントいただいた部分は、あとで考えて、わからなければまた質問させていただきます。
  • id:fut573
    windofjulyさん
    たしか1つだけ getName==rss だけど構造が違うバージョンがあって、getNameで判定するとそれでエラーが出た記憶があります。
    (rss0.91だったかな?)
    でも、今の環境ならば、getNameでやったほうが美しいですね。
    この機会に自前のライブラリを書き換えちゃいました。

    質問者さん
    この手の配列を引っ張ってくるスクリプトを書くときには、 "debuglib.php" というものを使うと分かりやすいと思います。(構造が視覚的に把握できるので)
  • id:kohhi
    fut573さん
    アドバイスありがとうございます。
    "debuglib.php"はEC studioさんのサイトで勉強してみます。
  • id:Cherenkov
    自分はこういうの
    function pr($var) {
    echo '<pre>'; print_r($var); echo '</pre>';
    }
  • id:kohhi
    Cherenkovさん、アドバイスありがとうございます。
    次の質問もよろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません