Schönheitsfehler: XML-Parser (PHP4)

rabby

Grünschnabel
Hallo,

verwöhnt von PHP5's simplexml ärgere ich mich heute mit einer Lösung für PHP4 herum. Es geht um eine äußerst einfach gestrickte XML-Datei:
<?xml version="1.0" encoding="utf-8"?>
<myapi>
<data>
<d0>
<title>foo bla</title>
<description>bar bla</description>
</d0>
<d1>
<title>foo1</title>
<description>bar1 blub</description>
</d1>
</data>
<qid>xyz</qid>
</myapi>
Und was ich mir bisher zusammengeschnipselt habe, funktioniert sogar auch; jedoch gefällt mir das Ergebnis nicht so ganz:
PHP:
<?
$sxml=new XMLParser('test.xml');
$sxml->parse('
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<myapi>
	<data>
		<d0>
			<title>foo bla</title>
			<description>bar bla</description>
		</d0>
		<d1>
			<title>foo1</title>
			<description>bar1 blub</description>
		</d1>
	</data>
	<qid>xyz</qid>
</myapi>
');
print_r($sxml->document);
?>
<?
class XMLParser
{
	var $parser;
    var $filePath;
    var $document;
    var $currTag;
    var $tagStack;
   
    function XMLParser($path)
    {
	$this->parser = xml_parser_create();
    $this->filePath = $path;
    $this->document = array();
    $this->currTag =& $this->document;
    $this->tagStack = array();
    }
   
    function parse()
    {
	xml_set_object($this->parser, $this);
	xml_set_character_data_handler($this->parser, 'dataHandler');
	xml_set_element_handler($this->parser, 'startHandler', 'endHandler');
	
    if(!($fp = fopen($this->filePath, "r")))
	{
	    die("Cannot open XML data file: $this->filePath");
	    return false;
	}
   
	while($data = fread($fp, 4096))
	{
	    if(!xml_parse($this->parser, $data, feof($fp)))
	    {
		die(sprintf("XML error: %s at line %d",
			    xml_error_string(xml_get_error_code($this->parser)),
			    xml_get_current_line_number($this->parser)));
	    }
	}
   
	fclose($fp);
    xml_parser_free($this->parser);
   
	return true;
    }
	
	 function startHandler($parser, $name, $attribs)
	 {
	if(!isset($this->currTag[$name]))
		 $this->currTag[$name] = array();
	
	$newTag = array();
	if(!empty($attribs))
		 $newTag['attr'] = $attribs;
	array_push($this->currTag[$name], $newTag);
	
	$t =& $this->currTag[$name];
	$this->currTag =& $t[count($t)-1];
	array_push($this->tagStack, $name);
	 }
	
	 function dataHandler($parser, $data)
	 {
	$data = trim($data);
	
	if(!empty($data))
	{
		 if(isset($this->currTag['data']))
		$this->currTag['data'] .= $data;
		 else
		$this->currTag['data'] = $data;
	}
	 }
	
	 function endHandler($parser, $name)
	 {
	$this->currTag =& $this->document;
	array_pop($this->tagStack);
	
	for($i = 0; $i < count($this->tagStack); $i++)
	{
		 $t =& $this->currTag[$this->tagStack[$i]];
		 $this->currTag =& $t[count($t)-1];
	}
	 }
}
?>

Nun kommt zwar ein Array heraus, aber mit sämtlichen unnützen Keys:
Hier nur mal der Anfang:
Code:
Array
(
    [MYAPI] => Array
        (
            [0] => Array
                (
                    [DATA] => Array
                        (
                            [0] => Array
                                (
                                    [D0] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [TITLE] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [data] => foo bla
                                                                )

                                                        )

                                                    [DESCRIPTION] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [data] => bar bla
                                                                )

                                                        )

                                                )

                                        )
....
Folglich ist [0] sowie ['data'] (nicht aber ['DATA']) in jedem Fall überflüssig auf Grund der XML-Struktur.
Könnt Ihr mir bitte helfen, gleich zu verhindern, dass diese Unterteilung stattfindet.? Habe schon den ganzen Abend herumgebastelt und leider geht es danach meist nicht mehr :(

Danke für Eure Hilfe
 
Zurück