2

我有一个旧网站,每次创建新帖子时都会生成自己的 RSS。当我在使用 PHP 4 的服务器上时一切正常,但现在主机更改为 PHP 5,我总是有一个“格式错误的 XML”。我正在使用 xml_parser_create() 和 xml_parse(...) 和 fwrite(..) 来保存所有内容。

这是保存时的示例(当然,我在保存之前阅读以附加旧的 RSS 行)。

function SaveXml()
{
    if (!is_file($this->getFileName()))
    {
        //Création du fichier
        $file_handler = fopen($this->getFileName(),"w");

        fwrite($file_handler,"");

        fclose($file_handler);
    }//Fin du if

    //Header xml version="1.0" encoding="utf-8"
    $strFileData = '<?xml version="1.0" encoding="iso-8859-1" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>'.$this->getProjectName().'</title><link>http://www.mywebsite.com</link><description>My description</description><lastBuildDate>' . date("r"). '</lastBuildDate>';

    //Data
    reset($this->arrData);
    foreach($this->arrData as $i => $value)
    {
        $strFileData .= '<item>';
            $strFileData .= '<title>'. $this->GetNews($i,0) . '</title>';
            $strFileData .= '<pubDate>'. $this->GetNews($i,1) . '</pubDate>';
            $strFileData .= '<dc:creator>'. $this->GetNews($i,2) . '</dc:creator>';
            $strFileData .= '<description><![CDATA['. $this->GetNews($i,3) . ']]> </description>';
            $strFileData .= '<link><![CDATA['. $this->GetNews($i,4) . ']]></link>';
            $strFileData .= '<guid>'. $this->GetNews($i,4) . '</guid>';
            //$strFileData .= '<category>'. $this->GetNews($i,5) . '</category>';
            $strFileData .= '<category>Mycategory</category>';
        $strFileData .= '</item>';

    }//Fin du for i


    $strFileData .= '</channel></rss>';



    if (file_exists($this->getFileName()))//Détruit le fichier
        unlink($this->getFileName());


    $file_handler = fopen($this->getFileName(),"w");



    fwrite($file_handler,$strFileData);

    fclose($file_handler);
}//Fin de SaveXml

我的问题是:你如何在 PHP 中创建和填写你的 RSS?

4

6 回答 6

2

我将使用simpleXML创建所需的结构并导出 XML。然后我会用 file_put_contents() 将它缓存到磁盘。

于 2008-09-17T13:02:09.773 回答
2

在 swcombine.com,我们使用Feedcreator。使用那个,你的问题就会消失。:)

这是安装后使用它的 PHP 代码:

function feed_simnews() {
    $objRSS = new UniversalFeedCreator();
    $objRSS->title = 'My News';
    $objRSS->link = 'http://link.to/news.php';
    $objRSS->description = 'daily news from me';
    $objRSS->xsl = 'http://link.to/feeds/feedxsl.xsl';
    $objRSS->language = 'en';
    $objRSS->copyright = 'Copyright: Mine!';
    $objRSS->webmaster = 'webmaster@somewhere.com';
    $objRSS->syndicationURL = 'http://link.to/news/simnews.php';
    $objRSS->ttl = 180;

    $objImage = new FeedImage();
    $objImage->title = 'my logo';
    $objImage->url = 'http://link.to/feeds/logo.jpg';
    $objImage->link = 'http://link.to';
    $objImage->description = 'Feed provided by link.to. Click to visit.';
    $objImage->width = 120;
    $objImage->height = 60;
    $objRSS->image = $objImage;

    //Function retrieving an array of your news from date start to last week
    $colNews = getYourNews(array('start_date' => 'Last week'));

    foreach($colNews as $p) {
        $objItem = new FeedItem();
        $objItem->title = $p->title;
        $objItem->description = $p->body;
        $objItem->link = $p->link;
        $objItem->date = $p->date;
        $objItem->author = $p->author;
        $objItem->guid = $p->guid;

        $objRSS->addItem($objItem);
    }

    $objRSS->saveFeed('RSS2.0', 'http://link.to/feeds/news.xml', false);
};

相当亲吻。:)

于 2008-09-17T15:37:50.150 回答
1

我过去曾使用过这个 LGPL 许可的 feedcreator 类,它非常适合我非常简单的使用。

于 2008-09-17T13:03:12.593 回答
0

PHP5 现在带有SimpleXML扩展,如果您的需求不复杂,它是构建有效 XML 的一种非常快速的方法。

但是,您建议的问题似乎不是实现问题,而是语法问题。也许您可以使用代码示例或生成的 XML 副本来更新您的问题。

于 2008-09-17T13:03:23.703 回答
0

不是完整的答案,但您不必解析自己的 XML。它会损害性能和可靠性。

但一定要确保它格式正确。如果您手动生成它或使用通用工具生成它应该不会很难。或者也许你包含的 HTML 毁了它?

于 2008-09-17T13:06:32.913 回答
0

有很多事情会导致 XML 格式错误。这可能是字符实体的问题(XML 标记之间的数据中的“<”、“>”或“&”)。连接字符串时,尝试通过 htmlentities() 运行数据库的任何输出。您是否有一个生成的 XML 示例供我们查看,以便我们了解问题出在哪里?

于 2008-09-17T15:05:06.983 回答