2008-09-17 8 views
2

新しい投稿が作成されるたびに、独自のRSSを生成する古いWebサイトがあります。私がPHP 4のサーバ上にあったときはすべて動作しましたが、ホストがPHP 5に変更されたので、私はいつも「悪い形式のXML」を持っています。私はxml_parser_create()とxml_parse(...)とfwrite(..)を使ってすべてを保存していました。PHP - RSS builder

保存するときの例です(以前の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をどのように作成して埋めますか?

+0

フィードの例が大きく役立ちます。 – ceejayoz

+0

完了、私のコードのスニペットを入れました –

答えて

2

swcombine.comでFeedcreatorを使用しています。それを使って、あなたの問題はなくなります。

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 = '[email protected]'; 
    $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::)

はここで一度インストールして使用するためのPHPコードがあります。 :)

+0

かなり面白いです、私は仕事から降りることができたらすぐに解決策をチェックします! –

+0

それは動作します!!!! Thx Veynom! –

2

私はsimpleXMLを使用して、必要な構造を作成し、XMLをエクスポートします。それから私はfile_put_contents()でディスクにキャッシュします。

1

私はこれまでにthis LGPL-licensed feedcreator classを使用していました。これは、私が以前使っていた非常に簡単な使い方ではかなりうまく機能しました。

+0

私もこれを使用します。拡張性があり、簡単に使えるようになり、有効なRSSをすぐに作成できます。 – cori

0

PHP5にはSimpleXMLという拡張子が付いています。これは、あなたのニーズが複雑でない場合に有効なXMLを構築するかなり簡単な方法です。

しかし、あなたが示唆している問題は、実装上の問題よりも構文の問題ではないようです。おそらく、コード例や生成されたXMLのコピーで質問を更新することができます。

0

完全な答えではありませんが、は、自分自身のXMLをのように解析する必要はありません。それは性能と信頼性を損なうでしょう。

間違いなく整形式であることを確認してください。手で、または汎用ツールを使用して生成するのは非常に難しいことではありません。または、あなたのインクルードされたHTMLがそれを壊すかもしれない

+0

私は<[データタグの内部にHTMLを追加します。悪いアイデア? XMLを解析しなくても、古い投稿を消去せずに追加したいのですがどうすればいいですか? –

+0

それは、整形式を破るべきではありません。ああ、あなたはそれを修正するためにXMLを解析しています...なぜ、最初からすべてを生成しないのですか? RSSフィードの場合、10個以上の投稿があるはずはありません。あなたが100を持っていても、それは問題ではありません。 –

0

XMLを不正にする可能性のあるものはたくさんあります。文字エンティティ( '<'、 '>'、またはXMLタグ間のデータに '&')に問題がある可能性があります。文字列を連結するとき、htmlentities()を介してデータベースから何か出力を実行してみてください。私たちが見るために生成されたXMLの例を持っていますので、どこに問題があるかを確認できますか?

+0

元の投稿に例を追加しました。 –