2

新しい投稿が作成されるたびに独自の RSS を生成する古い Web サイトがあります。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);
};

まさにKISS。:)

于 2008-09-17T15:37:50.150 に答える
1

私は過去にこのLGPLライセンスのfeedcreatorクラスを使用しましたが、非常に単純な使用法で非常にうまく機能しました。

于 2008-09-17T13:03:12.593 に答える
0

完全な答えではありませんが、独自のXMLを解析する必要はありません。パフォーマンスと信頼性が損なわれます。

しかし、間違いなくそれが整形式であることを確認してください。手作業または汎用ツールを使用して生成する場合は、それほど難しくはありません。それとも、含まれているHTMLがそれを台無しにしているのでしょうか。

于 2008-09-17T13:06:32.913 に答える
0

PHP5にはSimpleXML拡張機能が付属しています。ニーズが複雑でない場合は、有効なXMLをすばやく作成する方法です。

ただし、あなたが提案している問題は、実装の問題ではなく、構文の問題のようです。おそらく、コード例、または生成されたXMLのコピーを使用して質問を更新できます。

于 2008-09-17T13:03:23.703 に答える
0

XML を不正な形式にする可能性のあるものはたくさんあります。文字エンティティ (XML タグ間のデータ内の「<」、「>」、または「&」) に問題がある可能性があります。文字列を連結するときに、htmlentities() を介してデータベースからの出力を実行してみてください。問題がどこにあるかを確認できるように、生成された XML の例を教えてください。

于 2008-09-17T15:05:06.983 に答える