2008-09-17 6 views
2

새 게시물이 생성 될 때마다 자체 RSS를 생성하는 기존 웹 사이트가 있습니다. 모든 것은 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 확장자로 제공됩니다. 필요가 복잡하지 않은 PHP5는 유효한 XML을 만드는 매우 빠른 방법입니다.

그러나 문제는 구문의 구현 문제가 아닌 것으로 보입니다. 아마도 코드 예제 또는 생성 된 XML 복사본으로 질문을 업데이트 할 수 있습니다.

0

전체 대답은 아니지만 은 자신의 XML을으로 구문 분석 할 필요가 없습니다. 그것은 성능과 신뢰성을 해칠 것입니다.

그러나 확실히 형식의이어야합니다. 수작업으로 생성하거나 범용 도구를 사용하면 매우 어렵지 않습니다. 또는 포함 된 HTML이 그것을 망칠 수 있습니까?

+0

<데이터 태그 안에 HTML을 추가합니다. 나쁜 생각? XML을 구문 분석 할 필요가 없으면 기존 게시물을 지우지 않고 추가하고 싶습니다. –

+0

좋아, 그럼 잘 형성되지 않아야 해. 아, XML을 파싱하여 수정하면 ... 처음부터 모든 것을 생성하지 않는 이유는 무엇입니까? RSS 피드 인 경우 RSS 피드에 10 개 이상의 게시물이 없어야합니다. 100 명이라도 문제가되어서는 안됩니다. –

0

XML을 조작 할 수있는 요소가 많이 있습니다. 문자 엔터티 ('<', '>'또는 XML 태그 사이의 데이터에 '&')에 문제가있을 수 있습니다. 문자열을 연결할 때 htmlentities()를 통해 데이터베이스의 결과를 실행 해보십시오. 우리가 볼 수 있도록 생성 된 XML의 예제가 있습니까? 그렇다면 문제가 어디 있는지 확인할 수 있습니까?

+0

원래 게시물에 예제를 추가했습니다. –