View Single Post
Old 07-19-2007, 04:51 AM   · #4
Barrucadu
Formally Mikor.
 
Barrucadu's Avatar
 
Name: Michael Walker
Location: East Yorkshire, England
Trader Rating: (7)
Join Date: Aug 2005
Posts: 2,508
NP$: 144.25 (Donate)
Barrucadu is a splendid one to beholdBarrucadu is a splendid one to beholdBarrucadu is a splendid one to beholdBarrucadu is a splendid one to beholdBarrucadu is a splendid one to beholdBarrucadu is a splendid one to beholdBarrucadu is a splendid one to behold
Here is a slightly improved version:

PHP Code:
// Known Bugs:
//    Does not support nesting of complex types eg:
//        <tag><tag2><tag3>hi</tag3></tag2></tag>
//        would display as tag => xml:complex_tag, tag2 => tag3 = "hi"
class parseXML{
    
// File URL
    
var $file;
    
    
//Private variables
    
var $parser;
    var
$data;
    var
$index_array;
    var
$data_array;
    var
$xml;
    
    
//Tag variables
    
var $root_tags = array();
    var
$sub_tags = array();
    var
$offsets = array();
    
    function
presetRSS(){
        
// Set up the tags for RSS 2.0
        
$this->root_tags = array('title', 'link', 'description', 'language', 'lastBuildDate', 'copyright');
        
$this->sub_tags = array('item' => array('title', 'description', 'link', 'guid', 'pubDate', 'category'));
        
        
// Ignore the image <title> and <link> tags
        
$this->offsets = array('title' => 1, 'image' => 1);
    }
    
    function
print_error(){
        
// Display xml error message
        
die(sprintf("XML Error: %s at line %d",
            
xml_error_string(xml_get_error_code($this->parser)),
            
xml_get_current_line_number($this->parser)
        ));
        
        
// Return false
        
return false;
    }

    function
parse_file(){
        
// Create the parser
        
$this->parser = xml_parser_create();
        
// Skip whitespace between elements
        
xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);
        
// Disable upper-casing.
        
xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
        
// Read the data into $data
        
$this->data = file_get_contents($this->file);
        
//parse XML input $data into two arrays:
        // $index_array - pointers to the locations of appropriate values in $data_array - data value array.
        
xml_parse_into_struct($this->parser, $this->data, $this->data_array, $this->index_array) or $this->print_error();
        
        
// Stick it all in a nice array
        
$this->xml = array();
        
        
// Handle root tags (format: $xml[tag])
        
foreach($this->root_tags as $tag){
            if(
count($this->data_array[$this->index_array[$tag][0]]['xml:attributes']) != 0){
                foreach(
$this->data_array[$this->index_array[$tag][0]]['xml:attributes'] as $akey => $avar){
                    
$this->xml[$tag]['attributes'][$akey] = $avar;
                }
            }
            
$this->xml[$tag] = $this->data_array[$this->index_array[$tag][0]]['value'];
        }
        
        
// Now for child tags (format: $xml[parent][number][child])
        
foreach($this->sub_tags as $key => $value){
            
$children = count($this->index_array[$key]) / 2;
            
$i = 0;
            
$j = 0;
            while (
$i < $children){
                
// Skip every 2nd one, as it is a closing tag and thus has no attributes
                
if($j % 2 == 0 || $j == 0){
                    if(
count($this->data_array[$this->index_array[$key][$j]]['attributes']) != 0){
                        foreach(
$this->data_array[$this->index_array[$key][$j]]['attributes'] as $akey => $avar){
                            
$this->xml[$key][$i]['xml:attributes'][$akey] = $avar;
                        }
                    }
                    foreach(
$value as $subtag){
                        if(
in_array($subtag, $this->root_tags)){
                            
$k = $i + 1;
                        }else{
                            
$k = $i;
                        }
                        if(isset(
$this->offsets[$subtag])){
                            
$k = $k + $this->offsets[$subtag];
                        }
                        if(
count($this->data_array[$this->index_array[$subtag][$k]]['attributes']) != 0){
                            foreach(
$this->data_array[$this->index_array[$subtag][$k]]['attributes'] as $akey => $avar){
                                
$this->xml[$key][$i][$subtag]['xml:attributes'][$akey] = $avar;
                            }
                        }
                        if(
is_array($this->sub_tags[$subtag])){
                            
$this->xml[$key][$i][$subtag] = 'xml:complex_tag';
                        }else{
                            
$this->xml[$key][$i][$subtag] = $this->data_array[$this->index_array[$subtag][$k]]['value'];
                        }
                    }
                    
$i ++;
                }
                
$j ++;
            }
        }
        
        
//unsetting XML parser object
        
xml_parser_free($this->parser);
        
        
// Return the parsed file
        
return $this->xml;
    }
}


PHP Code:
$xml = new parseXML;

// RSS 2.0 File (only tested with bbc news)
$xml->file = 'http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml';
$xml->presetRSS();

$parsedXML = $xml->parse_file();

echo
'<pre>';
print_r($parsedXML);
echo
'</pre>';


Please register or log-in into NamePros to hide ads
__________________
Me | Blog | Last.fm | F@h | Archlinux.co.uk

archlinux User
Barrucadu is offline   Reply With Quote
Site Sponsors
NameChatter Proof is in the Parking NameChatter
Advertise your business at NamePros
All times are GMT -7. The time now is 03:49 PM.


Powered by: vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.