phpでRSSをまとめて出力するためにXMLバーサを作っています。
AndroidでのRSSリーダーで使用するもので当方phpの知識はほとんどありません。
もともとのソースコードではサイトのタイトルを取得することができず、自分なりに[siteTitle]というタグ名でサイトのタイトルを取得しようとしてみましたが、エラーは吐かないもののsiteTitleタグ内は空になっていました。
まずこちらが元のソースコードです。
どうすればChannelの子要素のtitleを取得できるか、ご教授願います。
文字数の都合のため編集前のソースコードはこちらをご覧ください。
http://18free.16mb.com/before.txt
こちらが編集後のソースコードです
<?php header("Content-Type: text/html; charset=UTF-8"); //XML上部分作成 $rssHeader = <<<RSS <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>サイトタイトル</title> <description>サイト概要</description> <link>サイトURL</link> <author>管理人</author> <pubDate>日付</pubDate> <language>ja</language> RSS;//フィード登録(例:サッカー関連2chまとめのRSSフィード)
$data['feedurl'][] = 'http://alfalfalfa.com/index.rdf';
$data['feedurl'][] = 'http://news.2chblog.jp/index.rdf';
$rssList = $data['feedurl'];
//同時呼び出し
$rssdataRaw = multiRequest($rssList);
$count = '0';
for($n=0; $n<count($rssdataRaw); $n++){
//URL設定
$rssdata = simplexml_load_string($rssdataRaw[$n]);
if($rssdata->channel->item) $rssdata = $rssdata->channel; if($rssdata->item){ foreach($rssdata->item as $myEntry){ -----ここから編集部------ $sitetitle = $myEntry->channel->title; $outdata[myDateGNU]['siteTitle'] = $sitetitle; ------ここまで編集部------ //日付 $rssDate = $myEntry->pubDate; if(!$rssDate) $rssDate = $myEntry->children("http://purl.org/dc/elements/1.1/")->date; //管理人 $myAuther = $myEntry->children("http://purl.org/dc/elements/1.1/")->creator; date_default_timezone_set('Asia/Tokyo'); $myDateGNU = strtotime($rssDate); $myDate = date('Y/m/d',$myDateGNU); //タイトル $myTitle = $myEntry->title; $outdata[$myDateGNU]['myTitle'] = $myTitle; //概要 $myDescription = $myEntry->description; $outdata[$myDateGNU]['myDescription'] = $myDescription; //リンクURL $myLink = $myEntry->link; $outdata[$myDateGNU]['myLink'] = $myLink; //日付 $outdata[$myDateGNU]['rssDate'] = $rssDate; //管理人 $outdata[$myDateGNU]['myAuther'] = $myAuther; //ソート用 $outdata[$myDateGNU]['myDateGNU'] = $myDateGNU; //出力内容(CSSOK) if(preg_match('/PR:/',$myTitle)) continue; } }
}
$date = array();
foreach($outdata as $key => $row){
$date[$key] = $row['myDateGNU'];
}
array_multisort($date, SORT_DESC, SORT_NUMERIC, $outdata);
//記事情報取得
$dataList = array();
$dataList = $outdata; //適当に記事データを取得する処理
//XMLの記事部分作成
$item = "";
foreach($dataList as $value){
$item .= "<item>n";
--------ここから編集部--------
$itemSitetitle = $value['siteTitle'];
$item .= "<siteTitle>" . $itemSitetitle . "</siteTitle>n";
--------ここまで編集部-----------
//タイトル
$itemTitle = $value['myTitle'];
$item .= "<title>" . $itemTitle . "</title>n";
//概要 $itemDescription = $value['myDescription']; $item .= "<description>" . $itemDescription . "</description>n"; //リンク $itemLink = $value['myLink']; $item .= "<link>" . $itemLink . "</link>n"; //管理人 $itemAuther = $value['myAuther']; $item .= "<author>" . $itemAuther . "</author>n"; //更新日付 $itemPubDate = $value['rssDate']; $itemPubDate = date('m/d G:i', strtotime($itemPubDate)); $item .= "<pubDate>$itemPubDate</pubDate>n"; $item .= "</item>n";
}
//XML下部分作成
$rssFooter = <<<RSS
</channel>
</rss>
RSS;
//XML出力
echo $rssHeader.$item.$rssFooter;
//同時呼び出し関数
function multiRequest($data, $options = array()) {
// array of curl handles
$curly = array();
// data to be returned
$result = array();
// multi handle
$mh = curl_multi_init();
// loop through $data and create curl handles
// then add them to the multi-handle
foreach ($data as $id => $d) {
$curly[$id] = curl_init(); $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; curl_setopt($curly[$id], CURLOPT_URL, $url); curl_setopt($curly[$id], CURLOPT_HEADER, 0); curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); // post? if (is_array($d)) { if (!empty($d['post'])) { curl_setopt($curly[$id], CURLOPT_POST, 1); curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); } } // extra options? if (!empty($options)) { curl_setopt_array($curly[$id], $options); } curl_multi_add_handle($mh, $curly[$id]);
}
// execute the handles
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
// get content and remove handles
foreach($curly as $id => $c) {
$result[$id] = curl_multi_getcontent($c);
curl_multi_remove_handle($mh, $c);
}
// all done
curl_multi_close($mh);
return $result;
}
?>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。