这里有一个可能的解决方案。
a) 您需要某种代理来允许使用 ajax 从不同来源加载内容。建议将 CORS 标头等列入白名单并添加,以防止利用您的代理。例如,使用此功能在您的一台服务器上创建一个 php 文件:
$valid_url_regex = '/.*(rss|feed|atom).*/';
$url = $_GET['url'];
if ( !preg_match( $valid_url_regex, $url ) ) exit;
$feeds = file_get_contents($url);
//this is some workaround to get special namespaces into the json
$feeds = str_replace("<content:encoded>","<contentEncoded>",$feeds);
$feeds = str_replace("</content:encoded>","</contentEncoded>",$feeds);
$feeds = str_replace("<media:content ","<mediaContent ",$feeds);
$feeds = str_replace("</media:content>","</mediaContent>",$feeds);
$simpleXml = simplexml_load_string($feeds, "SimpleXMLElement", LIBXML_NOCDATA);//this is for CDATA
$json = json_encode($simpleXml);
header("Access-Control-Allow-Origin: http://yourdomainnamehere");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
print $json;
b) 对代理脚本执行异步 ajax 调用并处理数据:
function loadRss(url)
{
$.ajax({
url: 'yourserverurl/rssproxy.php?url='+url,
type: 'GET',
success: function(response) {
handleResponse(JSON.parse(response));
}
});
}
function handleResponse(response) {
var entries;
if(response.entry) //ATOM
entries = response.entry;
else if(response.channel.item) //RSS 1/2
entries = response.channel.item;
var feedTitle="";
if(response.title)
feedTitle = response.title;
else if(response.channel.title)
feedTitle = response.channel.title;
//iterate all news entries
$.each(entries, function (i, e) {
console.log("Entry #"+i);
console.log(e);
//access the data as necessary like e.content, e.summary, e.contentEncoded etc....
}
);
}
几年前我将我的 google rss api 更改为 YQL,现在我不得不再次这样做,花了几个小时,但这次你不会依赖某些 3rd-party 供应商,希望你可以使用你的新阅读器代码,直到 rss 因著名的过滤气泡而优先于人类消失;)
以上代码只是一个提示,当然,如果您想将响应映射到通用 YQL 结构,您将不得不投入一些时间。我没有这样做,而是根据需要访问了响应的属性。