質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1914閲覧

phpでのRSS取得、Androidへの組み込み

ryoya1122

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

RSS

RSS(Really Simple Syndication)はブログのエントリやニュースの見出し、標準のフォーマットの音声やビデオなどを発行するために使われるウェブフィードのフォーマットの集合体です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/06/03 14:22

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自前サーバーのphpから複数のRSSから一括でデータを取得しようとしているのですが、

「自前サーバのPHPで、複数の外部のRSSを取得して、それを1つのRSSにマージして出力」
ですね。

そもそもRSS自体は1つのファイルで1つのサイトを扱うものなので、ファイルの中にはサイト名はないのではないでしょうか?
現在このようになっていますが、RSS処理段階でサイト名を解析する方法を知っている方いませんか?

RSS の channel 要素の子の title 要素のサイト名が入っているのではないでしょうか?

複数の RSS を配信しているなら必ずしもサイト名ではないかもしれませんが、見た感じその2つのサイトはそこにサイト名が入っています。

またどうしても出力する時間の部分が文字化けしてしまいます。

文字化けというか、そもそも RSS の pubDate 要素に Y年m月d日 H時i分 のような形式の日付は入れません。
RFC 822 なので Thu, 04 Jun 2015 02:17:04 +0900 のような形式にするべきです。
date 関数なら "D, d M Y H:i:s O" です。

投稿2015/06/03 17:17

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryoya1122

2015/06/04 03:57

それは$mydateの $myDate = date('Y/m/d',$myDateGNU); の括弧内を形式に合わせて修正すればよいでしょうか?
ngyuki

2015/06/04 06:33

いいえ `$itemPubDate = date('Y年m月d日 H時i分', strtotime($itemPubDate));` の部分です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問