[advanced search]
Results from the most recent live auction are here.
28 members in the live chat room. Join Chat!
Register Rules & FAQ NP$ Store Active Threads Mark Forums Read
Go Back   NamePros.Com > Design and Development > Programming > CODE
User Name
Password

Old 07-17-2007, 02:47 PM   · #1
Barrucadu
Formally Mikor.
 
Barrucadu's Avatar
 
Name: Michael Walker
Location: East Yorkshire, England
Trader Rating: (7)
Join Date: Aug 2005
Posts: 2,438
NP$: 95.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
Simple XML Class

Here is a simple class to parse XML files:

PHP Code:
// Known Bugs:
//    Does not support nesting of complex types eg:
//        <tag><tag2><tag3>hi</tag3></tag2></tag>
//        would display as tag => null, 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();
    
    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'));
    }
    
    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)
        ));
    }

    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(
count($this->data_array[$this->index_array[$subtag][$i]]['attributes']) != 0){
                            foreach(
$this->data_array[$this->index_array[$subtag][$i]]['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][$i]]['value'];
                        }
                    }
                    
$i ++;
                }
                
$j ++;
            }
        }

        
//unseting XML parser object
        
xml_parser_free($this->parser);
    }
}


Here is an example for parsing RSS 2.0 files (as you can see, there is a function to set the class up for parsing RSS)

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();

$xml->parse_file();
$parsedXML = $xml->xml;

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


(I can't believe i'm on holiday in Poland, and still doing this)


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

archlinux User

Last edited by Mikor : 07-17-2007 at 02:51 PM.
Barrucadu is offline   Reply With Quote
Old 07-17-2007, 06:09 PM   · #2
SecondVersion
while ($awake){ code(); }
 
SecondVersion's Avatar
 
Name: Eric
Location: Kentucky
Trader Rating: (137)
Join Date: Mar 2005
Posts: 4,134
NP$: 1123.00 (Donate)
SecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond reputeSecondVersion has a reputation beyond repute
Member of the Month
MOTM September 2005 Save a Life Child Abuse 9/11/01 :: Never Forget Baby Health Marrow Donor Program AIDS/HIV Breast Cancer Cystic Fibrosis Ethan Allen Fund Animal Cruelty Ethan Allen Fund Ethan Allen Fund Cancer Alzheimer's Protect Our Planet
Not bad Michael, better than some I've seen If you wouldn't mind, I may modify it a little and post it here
__________________
6k.org @ Sedo auction
SecondVersion.com - The Personal Blog of SecondVersion
Domain Name Portfolio - Get your free copy. - Version 1.0.1 now available!!
MetaCreator.com - Free Meta Tag Creator
SecondVersion is offline   Reply With Quote
Old 07-18-2007, 01:02 AM   · #3
Barrucadu
Formally Mikor.
 
Barrucadu's Avatar
 
Name: Michael Walker
Location: East Yorkshire, England
Trader Rating: (7)
Join Date: Aug 2005
Posts: 2,438
NP$: 95.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
Go for it, if you could make it better support tag nesting, that would be good.

Here is what happens at the moment:
Code:
<xml> <tag> <tag2> <tag3>Hi</tag3> </tag2> </tag> </xml>


PHP Code:
Array
(
     [
tag] => xml:complex_tag,
     [
tag2] => Array
          (
               [
tag3] => Hi
          
)
);


Edit: After checking, it also parses RSS feeds wrong, if you could also fix that, that would be great.

Edit 2: I have made a work around for RSS feeds (ignoring the image <title> and <link> tags)

PHP Code:
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)
        ));
    }

    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);
    }
}


Edit 3: If you want to have a look, here is an example with tag attributes:
PHP Code:
$xml = new parseXML;

$xml->file = 'http://mikor.clearlyhosted.org/webcomics.xml';
$xml->sub_tags = array('comic' => array('name', 'url', 'updated'));

$xml->parse_file();
$parsedXML = $xml->xml;

echo
'<pre>';
print_r($parsedXML);
echo
'</pre>';
__________________
Me | Blog | Last.fm | F@h

archlinux User

Last edited by Mikor : 07-18-2007 at 01:38 AM.
Barrucadu is offline   Reply With Quote
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,438
NP$: 95.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>';
__________________
Me | Blog | Last.fm | F@h

archlinux User
Barrucadu is offline   Reply With Quote
Closed Thread

NamePros is a revenue sharing forum.

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Forum Jump


Site Sponsors