Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Citanje XML feed-a

[es] :: PHP :: Citanje XML feed-a

[ Pregleda: 2681 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mordor
Vladimir Cvetic
/dev/null

Član broj: 2797
Poruke: 420
195.252.87.*

Jabber: cvele@default.co.yu
Sajt: www.knowbies.com


Profil

icon Citanje XML feed-a27.08.2004. u 10:40 - pre 238 meseci
Za citanje xml feed-a koristim klasu koju sam preuzeo sa phpclasses i malo je modifikovao shodno mojim potrebama. Ona odlicno radi osim za URI tag...
XML: http://www.searchfeed.com/rd/f...589&cat=warhammer&nl=5

PHP KLASA:
Code:
<?php
class feedReader1{

var $feedReader1;   // parser
var $feedUrl1;      // url do ficheiro xml/rss
var $node1;         // número de nós dos items
var $channelFlag1;  // flag
var $currentTag1;   // actual tag
var $outputData1;   // array dos dados (notícias formatadas)
var $itemFlag1;     // flag
var $imageFlag1;    // flag

function feedReader1(){ //constructor iniciação dos valores por defeitos dos elementos da classe
    $this->feedReader1="";
    $this->feedUrl1="";
    $this->node1=0;
    $this->channelFlag1=false;
    $this->currentTag1="";
    $this->outputData1=array();
    $this->itemFlag1=false;
    $this->imageFlag1=false;
}

function setfeedUrl1($url){ //indicamos o endereço do ficheiro xml/rss
    $this->feedUrl1=$url;
}

function getfeedoutputdata1(){ //retornamos o array com as notícias formatadas
    return $this->outputData1;
}

function getFeedNumberOfNodes1(){ //retornamos o número de notícias
    return $this->node1;
}

function parseFeed1(){
    $this->feedReader1=xml_parser_create();
    xml_set_object($this->feedReader1,&$this);
    xml_parser_set_option($this->feedReader1,XML_OPTION_CASE_FOLDING,true);
    xml_set_element_handler($this->feedReader1,"openTag","closeTag");
    xml_set_character_data_handler($this->feedReader1,"dataHandling");
    if(!($fp=@fopen($this->feedUrl1,"r"))){
        $errorDefinition="Não foi possível encontrar o ficheiro pretendido.";
        echo $errorDefinition;
    }
    while($data=@fread($fp,4096)){
        if(!@xml_parse($this->feedReader1,$data,feof($fp))){
            $errorDefinition=xml_error_string(xml_get_error_code($this->feedReader1));
            echo $errorDefinition;
        }
    }
    xml_parser_free($this->feedReader1);
}

function openTag($parser,$name,$attrs){
        if($name){
            switch(strtolower($name)){
                case "listing":$this->channelFlag1=false;$this->imageFlag1=false;$this->itemFlag1=true;$this->node1++;break;
                default:$this->currentTag1=strtolower($name);break;
            }
        }
}

function closeTag($parser,$name){
    $this->currentTag1="";
}

function dataHandling($parser,$data){
    if($this->itemFlag1){
        switch($this->currentTag1){
            case "title":$this->outputData1["listing"][$this->currentTag1][$this->node1-1]=$data;break;
            case "uri":$this->outputData1["listing"][$this->currentTag1][$this->node1-1]=$data;break;
            case "url":$this->outputData1["listing"][$this->currentTag1][$this->node1-1]=$data;break;
            case "description":$this->outputData1["listing"][$this->currentTag1][$this->node1-1]=$data;break;
            case "bid":$this->outputData1["listing"][$this->currentTag1][$this->node1-1]=$data;break;
        }
    }
}

}
?>


Array dobijam:
Code:

              <?php
include("inc/serch_feed_xml.php");
$ob=new feedReader1();
$ob->setFeedUrl1("http://www.searchfeed.com/rd/f...cat=warhammer&nl=5&ip=".$_SERVER['REMOTE_ADDR']."");
$ob->parseFeed1();
$array=$ob->getFeedOutputData1();
$number=$ob->getFeedNumberOfNodes1();
for($i=0;$i<$number;$i++){
    echo "<div class=\"poster\" style=\"margin-bottom: 2px;\"><font size='1'><strong>&#155;</strong></font> <a class=\"head\" href='" 
. $array["listing"]["uri"][$i] . "'>" . $array["listing"]["title"][$i] . " - </a>".$array["listing"]["bid"][$i]."</div>";
}
?>


Dakle sve tagove vidi kako treba ali URI ne ... izbacuje samo zadnju varijablu iz url-a odnosno &ex=[neki broj]

Kako ovo da sredim , u cemu je problem?
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
195.252.85.*

Sajt: localhost


+5 Profil

icon Re: Citanje XML feed-a27.08.2004. u 10:56 - pre 238 meseci
pretpostavljam da se za url više puta pozove dataHandeling() event, zato što XML parseri obično seckaju parsiranje kada naiđu na enitet (što uključuje i &amp; odnosno & enkodovano u XMLu).

a pošto ti pri svakom pozivu upišeš vrednost parametra u odgovarajuću promenjivu, gubiš vrednosti upisane prilikom prethodnih poziva (efektivno "prepisuješ" preko iste promenjive sa novim vrednostima).

ukratko, zameni sve operacije dodele = sa operacijama concatenacije .= tj:

Code:
case "uri": 
$this->outputData1["listing"][$this->currentTag1][$this->node1-1] .= $data;break;


(iako ti se ovo desilo samo za URI, može se desiti i kod ostalih polja, pa promeni i ostale slučajeve..


a generalno, za parsiranje feedova, pogledaj MagpieRSS klasu.. extra je laka za korišćenje, obrađuje par različitih verzija RSSa/RDFa/Atoma, ima i neko keširanje, itd..
 
Odgovor na temu

[es] :: PHP :: Citanje XML feed-a

[ Pregleda: 2681 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.