[ bluesman @ 25.10.2004. 12:25 ] @
Da li je ima neko da "podeli" neku obicnu klasu za parsovanje XML fajlova koja bi trebala da vrati array struktiran kao XML dokument, zajedno sa svim tagovima i atributima? Nasao sam par ali obicno ignorisu atribute pa su mi beskorisne.
[ Ilija Studen @ 25.10.2004. 12:45 ] @
Imam ja, ali bi mi trebalo 3 dana da ih "izvučem" iz sistema.

Inače, to su prepađene PEAR klase: XML_Parser i XML_Tree (uključujući XML_TreeNode). Ne bi trebalo da bude veliki problem da ih prilagodiš svojim potrebama pošto od ostalih paketa koriste samo PEAR za error handling.

Izvuci šta ti treba :)

Pozdrav
[ mordor @ 25.10.2004. 13:24 ] @
Code:

<?php
// classse feedReader
//faz a leitura de um feed (rss ou xml)
//versão 1.0 para PHP 4
//autor: José Valente mailto:[email protected]
//2004 Portugal

class feedReader{

var $feedReader;   // parser
var $feedUrl;      // url do ficheiro xml/rss
var $node;         // número de nós dos items
var $channelFlag;  // flag
var $currentTag;   // actual tag
var $outputData;   // array dos dados (notícias formatadas)
var $itemFlag;     // flag
var $imageFlag;    // flag

function feedReader(){ //constructor iniciação dos valores por defeitos dos elementos da classe
    $this->feedReader="";
    $this->feedUrl="";
    $this->node=0;
    $this->channelFlag=false;
    $this->currentTag="";
    $this->outputData=array();
    $this->itemFlag=false;
    $this->imageFlag=false;
}

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

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

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

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

function openTag($parser,$name,$attrs){ //função startElement
        if($name){
            switch(strtolower($name)){
                case "channel":$this->channelFlag=true;break;
                case "image":$this->channelFlag=false;$this->imageFlag=true;break;
                case "item":$this->channelFlag=false;$this->imageFlag=false;$this->itemFlag=true;$this->node++;break;
                default:$this->currentTag=strtolower($name);break;
            }
        }
}

function closeTag($parser,$name){ //função endElement
    $this->currentTag="";
}

function dataHandling($parser,$data){ //função characterElement
    if($this->channelFlag){ //para a descrição do channel
        switch($this->currentTag){
            case "title":$this->outputData["channel"][$this->currentTag]=$data;break;
            case "link":$this->outputData["channel"][$this->currentTag]=$data;break;
            case "description":$this->outputData["channel"][$this->currentTag]=$data;break;
            case "language":$this->outputData["channel"][$this->currentTag]=$data;break;
            case "copyright":$this->outputData["channel"][$this->currentTag]=$data;break;
            case "docs":$this->outputData["channel"][$this->currentTag]=$data;break;
            case "lastbuilddate":$this->outputData["channel"][$this->currentTag]=$data;break;
        }
    }
    if($this->itemFlag){ //para a descrição dos items
        switch($this->currentTag){
            case "title":$this->outputData["item"][$this->currentTag][$this->node-1]=$data;break;
            case "link":$this->outputData["item"][$this->currentTag][$this->node-1]=$data;break;
            case "description":$this->outputData["item"][$this->currentTag][$this->node-1]=$data;break;
            case "author":$this->outputData["item"][$this->currentTag][$this->node-1]=$data;break;
            case "pubdate":$this->outputData["item"][$this->currentTag][$this->node-1]=$data;break;
        }
    }
    if($this->imageFlag){ //para a descrição da imagem
        switch($this->currentTag){
            case "title":$this->outputData["image"][$this->currentTag]=$data;break;
            case "url":$this->outputData["image"][$this->currentTag]=$data;break;
            case "link":$this->outputData["image"][$this->currentTag]=$data;break;
        }
    }
}

}
?>


sa phpclasses.org
[ bluesman @ 25.10.2004. 13:52 ] @
Tnx, ali ne treba me feed eader - treba mi nesto sto ce da ucita "nepredvidivo" i napravi array koji se struktuiran isto kao XML dokument, ali sa sve atributima.

Mislim da sam nasao nesto slicno, ali cu morati da prepravljam, a to sam bas hteo da izbegnem :-)
[ Goran Rakić @ 25.10.2004. 15:48 ] @
ja koristim XML Tree iz PEAR-a, stim sto kada sam ja prvi put to gledao bila je neka nekompatibilnost sa XML Parser-om pa sam morao to da sredjujem. Nadam se da su to sredili sada.
[ Ilija Studen @ 25.10.2004. 18:54 ] @
Vrlo verovatno jesu pošto ja nisam imao problema sa kombinacijom ta dva kada sam ih prilagođavao... Inače, svaki minut uložen u prepravljanje tih klasa mi se isplatio. XML otvara mnoga vrata...