simpleXML Alternative (PHP4)
Webentwicklung, Widget, Wordpress

Da simplexml leider nicht in meinem PHP4 laufen möchte und weil ich dennoch eine XML-Schnittstelle benötige, die in PHP5 und PHP4 funktioniert, habe ich nun länger nach einer passenden Klasse zu diesem Zweck gesucht und wurde auch fündig. Nach kleineren Modifikationen ist die Ausgabe auch bei komplexen XML-Dateien wie denen der Ebay API, die doch recht umfangreich ist, dennoch gut lesbar und einfach zu verwenden. Ähnlich wie bei simplexml, jedoch mit dem Unterschied, dass anstelle des SimpleXML Objekts ein PHP Array Objekt verwendet wird.

Verbesserungstipps und -wünsche usw. können jederzeit per Mail geschickt werden.  

<? 

class sxml
{
    var $parser;
    var $error_code;
    var $error_string;
    var $current_line;
    var $current_column;
    var $data = array();
    var $datas = array();
    function parse($data)
    {
        $this->parser = xml_parser_create('UTF-8');
        xml_set_object($this->parser, $this);
        xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);
        xml_set_element_handler($this->parser, 'tag_open', 'tag_close');
        xml_set_character_data_handler($this->parser, 'cdata');
        if (!xml_parse($this->parser, $data))
        {
            $this->data = array();
            $this->error_code = xml_get_error_code($this->parser);
            $this->error_string = xml_error_string($this->error_code);
            $this->current_line = xml_get_current_line_number($this->parser);
            $this->current_column = xml_get_current_column_number($this->parser);
        }
        else
        {
            $this->data = $this->data['child'];
        }
        xml_parser_free($this->parser);
    }

    function tag_open($parser, $tag, $attribs)
    {
        $this->datas[] =& $this->data;
        $this->data =& $this->data['child'][$tag][];
    }

    function cdata($parser, $cdata)
    {
        @$this->data['data'] .= $cdata;
    }

    function tag_close($parser, $tag)
    {
        $this->data =& $this->datas[count($this->datas)-1];
        array_pop($this->datas);
    }
}

?> 

<?

        //Demo: Einsatz von sxml

        $url='http://server-von-dem-die-xml-gela.de/n-wird.xml';

        $xml_parser = new sxml;
        $src=implode ('', file ($url));
        $xml_parser->parse($src);
        $xml=$xml_parser->data;

        print_r($xml);
?>