JSON 订阅 RSS(问题)
JSON Feed to RSS (Problems)
我在将 JSON 提要转换为 RSS 提要时遇到问题。我正在尝试在一个函数中执行此操作,如下所示。
我在 GitHub 上找到了代码 — 但它不能正常工作 — 我不知道如何修复它。
在PHP代码的底部:echo convert_jsonfeed_to_rss($content)."\n";
我期待它打印出 RSS XML 提要 — 它没有。
<?php
//Convert JSONfeed to RSS in a single function as a drop in to make adding JSONfeed
//support to an aggregator easier
function convert_jsonfeed_to_rss($content = NULL, $max = NULL)
{
//Test if the content is actual JSON
json_decode($content);
if( json_last_error() !== JSON_ERROR_NONE) return FALSE;
//Now, is it valid JSONFeed?
$jsonFeed = json_decode($content, TRUE);
if (!isset($jsonFeed['version'])) return FALSE;
if (!isset($jsonFeed['title'])) return FALSE;
if (!isset($jsonFeed['items'])) return FALSE;
//Decode the feed to a PHP array
$jf = json_decode($content, TRUE);
//Get the latest item publish date to use as the channel pubDate
$latestDate = 0;
foreach ($jf['items'] as $item) {
if (strtotime($item['date_published']) > $latestDate) $latestDate = strtotime($item['date_published']);
}
$lastBuildDate = date(DATE_RSS, $latestDate);
//Create the RSS feed
$xmlFeed = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"></rss>');
$xmlFeed->addChild("channel");
//Required elements
$xmlFeed->channel->addChild("title", $jf['title']);
$xmlFeed->channel->addChild("pubDate", $lastBuildDate);
$xmlFeed->channel->addChild("lastBuildDate", $lastBuildDate);
//Optional elements
if (isset($jf['description'])) $xmlFeed->channel->description = $jf['description'];
if (isset($jf['home_page_url'])) $xmlFeed->channel->link = $jf['home_page_url'];
//Items
foreach ($jf['items'] as $item) {
$newItem = $xmlFeed->channel->addChild('item');
//Standard stuff
if (isset($item['id'])) $newItem->addChild('guid', $item['id']);
if (isset($item['title'])) $newItem->addChild('title', $item['title']);
if (isset($item['content_text'])) $newItem->addChild('description', $item['content_text']);
if (isset($item['content_html'])) $newItem->addChild('description', $item['content_html']);
if (isset($item['date_published'])) $newItem->addChild('pubDate', $item['date_published']);
if (isset($item['url'])) $newItem->addChild('link', $item['url']);
//Enclosures?
if(isset($item['attachments'])) {
foreach($item['attachments'] as $attachment) {
$enclosure = $newItem->addChild('enclosure');
$enclosure['url'] = $attachment['url'];
$enclosure['type'] = $attachment['mime_type'];
$enclosure['length'] = $attachment['size_in_bytes'];
}
}
}
//Make the output pretty
$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xmlFeed->asXML());
return $dom->saveXML();
}
$content = @file_get_contents("http://timetable.manton.org/feed.json");
echo convert_jsonfeed_to_rss($content)."\n";
我尝试将 $content
变量放在 convert_jsonfeed_to_rss
函数之前 — 同样的问题。
$content = @file_get_contents("http://timetable.manton.org/feed.json");
最后转换为 DOMDocument 似乎是个问题,它反对文档的几个部分。
一种更快的方法(在这种情况下似乎更可靠)是只使用 dom_import_simplexml()
$dom = dom_import_simplexml($xmlFeed)->ownerDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
return $dom->saveXML();
(来自 )。
编辑
从您更新的代码来看,您没有正确使用层次结构(并且可能没有启用错误来显示不工作的地方)。
你需要像...
foreach ($jf['data']['feed'] as $item1) {
// foreach ($item1['feed'] as $item) {
$item = $item1['article'];
我在将 JSON 提要转换为 RSS 提要时遇到问题。我正在尝试在一个函数中执行此操作,如下所示。
我在 GitHub 上找到了代码 — 但它不能正常工作 — 我不知道如何修复它。
在PHP代码的底部:echo convert_jsonfeed_to_rss($content)."\n";
我期待它打印出 RSS XML 提要 — 它没有。
<?php
//Convert JSONfeed to RSS in a single function as a drop in to make adding JSONfeed
//support to an aggregator easier
function convert_jsonfeed_to_rss($content = NULL, $max = NULL)
{
//Test if the content is actual JSON
json_decode($content);
if( json_last_error() !== JSON_ERROR_NONE) return FALSE;
//Now, is it valid JSONFeed?
$jsonFeed = json_decode($content, TRUE);
if (!isset($jsonFeed['version'])) return FALSE;
if (!isset($jsonFeed['title'])) return FALSE;
if (!isset($jsonFeed['items'])) return FALSE;
//Decode the feed to a PHP array
$jf = json_decode($content, TRUE);
//Get the latest item publish date to use as the channel pubDate
$latestDate = 0;
foreach ($jf['items'] as $item) {
if (strtotime($item['date_published']) > $latestDate) $latestDate = strtotime($item['date_published']);
}
$lastBuildDate = date(DATE_RSS, $latestDate);
//Create the RSS feed
$xmlFeed = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"></rss>');
$xmlFeed->addChild("channel");
//Required elements
$xmlFeed->channel->addChild("title", $jf['title']);
$xmlFeed->channel->addChild("pubDate", $lastBuildDate);
$xmlFeed->channel->addChild("lastBuildDate", $lastBuildDate);
//Optional elements
if (isset($jf['description'])) $xmlFeed->channel->description = $jf['description'];
if (isset($jf['home_page_url'])) $xmlFeed->channel->link = $jf['home_page_url'];
//Items
foreach ($jf['items'] as $item) {
$newItem = $xmlFeed->channel->addChild('item');
//Standard stuff
if (isset($item['id'])) $newItem->addChild('guid', $item['id']);
if (isset($item['title'])) $newItem->addChild('title', $item['title']);
if (isset($item['content_text'])) $newItem->addChild('description', $item['content_text']);
if (isset($item['content_html'])) $newItem->addChild('description', $item['content_html']);
if (isset($item['date_published'])) $newItem->addChild('pubDate', $item['date_published']);
if (isset($item['url'])) $newItem->addChild('link', $item['url']);
//Enclosures?
if(isset($item['attachments'])) {
foreach($item['attachments'] as $attachment) {
$enclosure = $newItem->addChild('enclosure');
$enclosure['url'] = $attachment['url'];
$enclosure['type'] = $attachment['mime_type'];
$enclosure['length'] = $attachment['size_in_bytes'];
}
}
}
//Make the output pretty
$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xmlFeed->asXML());
return $dom->saveXML();
}
$content = @file_get_contents("http://timetable.manton.org/feed.json");
echo convert_jsonfeed_to_rss($content)."\n";
我尝试将 $content
变量放在 convert_jsonfeed_to_rss
函数之前 — 同样的问题。
$content = @file_get_contents("http://timetable.manton.org/feed.json");
最后转换为 DOMDocument 似乎是个问题,它反对文档的几个部分。
一种更快的方法(在这种情况下似乎更可靠)是只使用 dom_import_simplexml()
$dom = dom_import_simplexml($xmlFeed)->ownerDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
return $dom->saveXML();
(来自 )。
编辑
从您更新的代码来看,您没有正确使用层次结构(并且可能没有启用错误来显示不工作的地方)。
你需要像...
foreach ($jf['data']['feed'] as $item1) {
// foreach ($item1['feed'] as $item) {
$item = $item1['article'];