Проблемы с созданием действительного RSS-канала в PHP - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь получить RSS-канал, изменить какой-либо текст, а затем снова использовать его в качестве RSS-канала.Однако код, который я написал, не проверяется должным образом.Я получаю эти ошибки:

строка 3, столбец 0: отсутствует атрибут rss: версия

строка 14, столбец 6: элемент неопределенного элемента: содержимое (10 вхождений)

Вот мой код:

<?php
header("Content-type: text/xml");

echo "<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type='text/xsl'?>
<?xml-stylesheet type='text/xsl' media='screen'                 
href='/~d/styles/rss2full.xsl'?>
<rss xmlns:content='http://purl.org/rss/1.0/modules/content/'>

<channel>
<title>Blaakdeer</title>
<description>Blog RSS</description>
<language>en-us</language>
";


$html = "";
$url = "http://feeds.feedburner.com/vga4a/mPSm";
$xml = simplexml_load_file($url);

for ($i = 0; $i < 10; $i++){
$title = $xml->channel->item[$i]->title;
$description = $xml->channel->item[$i]->description;
$content = $xml->channel->item[$i]->children("content", true);
$content = preg_replace("/The post.*/","", $content);

echo "<item>
<title>$title</title>
<description>$description</description>
<content>$content</content>
</item>";
 }


echo "</channel></rss>";

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Так же, как вы не рассматриваете XML как строку при ее анализе, вы не рассматриваете его как строку при создании.Используйте соответствующие инструменты для создания вашего XML;в этом случае класс DomDocument.

У вас был ряд проблем с вашим XML;Самым большим является то, что вы создавали элемент <content>, но исходный RSS содержал элемент <content:encoded>.Это означает, что имя элемента encoded, но оно находится в пространстве имен content.Большая разница между этим элементом и именем content.Я добавил комментарии, чтобы объяснить другие шаги.

<?php

// create the XML document with version and encoding
$xml = new DomDocument("1.0", "UTF-8");
$xml->formatOutput = true;
// add the stylesheet PI
$xml->appendChild(
    $xml->createProcessingInstruction(
        'xml-stylesheet',
        'type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"'
    )
);
// create the root element
$root = $xml->appendChild($xml->createElement('rss'));
// add the version attribute
$v = $root->appendChild($xml->createAttribute('version'));
$v->appendChild($xml->createTextNode('2.0'));
// add the namespace
$root->setAttributeNS(
    'http://www.w3.org/2000/xmlns/',
    'xmlns:content',
    'http://purl.org/rss/1.0/modules/content/'
);
// create some child elements
$ch = $root->appendChild($xml->createElement('channel'));
// specify the text directly as second argument to
// createElement because it doesn't need escaping
$ch->appendChild($xml->createElement('title', 'Blaakdeer'));
$ch->appendChild($xml->createElement('description', 'Blog RSS'));
$ch->appendChild($xml->createElement('language', 'en-us'));

$url = "http://feeds.feedburner.com/vga4a/mPSm";
$rss = simplexml_load_file($url);

for ($i = 0; $i < 10; $i++) {
    if (empty($rss->channel->item[$i])) {
        continue;
    }
    $title = $rss->channel->item[$i]->title;
    $description = $rss->channel->item[$i]->description;
    $content = $rss->channel->item[$i]->children("content", true);
    $content = preg_replace("/The post.*/","", $content);

    $item_el = $ch->appendChild($xml->createElement('item'));

    $title_el = $item_el->appendChild($xml->createElement('title'));
    // this stuff is unknown so it has to be escaped
    // so have to create a separate text node
    $title_el->appendChild($xml->createTextNode($title));

    $desc_el = $item_el->appendChild($xml->createElement('description'));
    // the other alternative is to create a cdata section
    $desc_el->appendChild($xml->createCDataSection($description));

    // the content:encoded element is not the same as a content element
    // the element must be created with the proper namespace prefix
    $cont_el = $item_el->appendChild(
        $xml->createElementNS(
            'http://purl.org/rss/1.0/modules/content/',
            'content:encoded'
        )
    );
    $cont_el->appendChild($xml->createCDataSection($content));
}

header("Content-type: text/xml");
echo $xml->saveXML();
0 голосов
/ 22 мая 2019

Первая ошибка - просто отсутствующий атрибут, достаточно просто:

<rss version="2.0" ...>

Для <p> и других HTML-элементов вам необходимо экранировать их. Файл должен выглядеть так:

&lt;p&gt;...

Есть и другие способы, но это самый простой способ. В PHP вы можете просто вызвать функцию для кодирования объектов.

$output .= htmlspecialchars(" <p>Paragraph</p> ");

Что касается проблемы с тегом <content>, она должна быть <description>. Тег <content> в настоящее время генерирует две ошибки. Изменение его на <description> в обоих местах должно исправить обе ошибки.

В противном случае, похоже, вы понимаете основы. Вы <open> и </close> теги, и те должны совпадать. Вы также можете использовать так называемые пустые теги: <empty/>, которые существуют сами по себе, но не включают в себя контент и закрывающий тег.

...