JSON Feed to RSS (Проблемы) - PullRequest
       2

JSON Feed to RSS (Проблемы)

0 голосов
/ 19 февраля 2020

У меня проблема с преобразованием канала 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");

1 Ответ

0 голосов
/ 19 февраля 2020

Преобразование в 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'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...