AndroidでRSSリーダーを作っています。
phpの知識はほとんどありません。
http://www.panzee.biz/archives/3172
ここのサイトを参考にして
自前サーバーのphpから複数のRSSから一括でデータを取得しようとしているのですが、
ここのサイトではサイト名は取得していないので、どうにかサイト名を格納しようとしていますが、
そもそもRSS自体は1つのファイルで1つのサイトを扱うものなので、ファイルの中にはサイト名はないのではないでしょうか?
現在このようになっていますが、RSS処理段階でサイト名を解析する方法を知っている方いませんか?
またどうしても出力する時間の部分が文字化けしてしまいます。
php上で文字コードをUTFに強制しましたが変化はありませんでした。
ご教授いただけると幸いです。
<?php //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;//フィード登録
$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){ //日付 $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";
//タイトル $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('Y年m月d日 H時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;
}
?>
以下はAndroid側のxmlバース処理です。
public RssListAdapter parseXml(InputStream is) throws IOException,
XmlPullParserException {
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(is, null);
int eventType = parser.getEventType();
Item currentItem = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String tag = null;
switch (eventType) {
case XmlPullParser.START_TAG:
tag = parser.getName();
if (tag.equals("item")) {
currentItem = new Item();
} else if (currentItem != null) {
if (tag.equals("title")) {
currentItem.setTitle(parser.nextText());
} else if (tag.equals("author")) {
currentItem.setSite((parser.nextText()));
} else if (tag.equals("pubDate")) {
currentItem.setDate((parser.nextText()));
}
// else if (tag.equals("description")) {
// currentItem.setDescription(parser.nextText());
// }
}
break;
case XmlPullParser.END_TAG:
tag = parser.getName();
if (tag.equals("item")) {
mAdapter.add(currentItem);
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return mAdapter;
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/04 03:57
2015/06/04 06:33