Du kannst vom unten angegebenen Skript ausgehen, welches eine XML-Datei in eine Objekthirarchie umsetzt. Durch geeignete Modifikationen solltest Du in der Lage sein, die Daten in die gewünschte Struktur zu bringen. Die Knoten werden auch unter dem Namen des Tags in m_ChildNodes abgelegt, so dass Du nicht gezwungen bist, über den Index zu gehen. Das setzt natürlich voraus, dass es nur ein Tag dieses Namens innerhalb solcher Container gibt. Andernfalls handelt es sich um ein Feld aller Kindknoten mit diesem Tagnamen, so dass das keinen Vorteil bringt.
Allerdings kannst Du schon mit kleinen Änderungen an den XML-Daten eine Vereinfachung erreichen. Statt
<ALL_GAMES>
<GAME GID='0' MATCH='Testspiel' YY='00' MM='01' DD='01'>
<RESULT>1:0</RESULT>
</GAME>
</ALL_GAMES>
solltest Du erwägen
<ALL_GAMES>
<GAME GID='0' MATCH='Testspiel' YY='00' MM='01' DD='01' RESULT='1:0' />
</ALL_GAMES>
zu verwenden, denn ein Spiel hat wohl nicht mehr als 1 Ergebnis nehme ich an. In diesem Fall liefert dir der angegebene Code das Resultat:
stdClass Object
(
[tagName] => ALL_GAMES
[childNodes] => Array
(
[0] => stdClass Object
(
[tagName] => GAME
[GID] => 0
[MATCH] => Testspiel
[YY] => 00
[MM] => 01
[DD] => 01
[RESULT] => 1:0
)
[GAME] => stdClass Object
(
[tagName] => GAME
[GID] => 0
[MATCH] => Testspiel
[YY] => 00
[MM] => 01
[DD] => 01
[RESULT] => 1:0
)
)
)
Du kannst dann über $result->childNodes[0]->RESULT auf das Ergebnis zugreifen.
Sollte Dir die Verwendung von Objekten nicht zusagen, können auch Felder anstelle der Objekte erzeugt werden.
Durch das Weglassen der [0] Indizierung in der return Zeile der parse Methode können auch mehrere hintereinander stehende Wurzelknoten zurückgegeben werden.
Eine weitere Alternative wäre eine Modifikation der XmlParser Klasse, so dass Du die Daten direkt verarbeitest und keine Notwendigkeit besteht, diese zwischenzuspeichern. Das wäre besonders dann sinnvoll, wenn Du mit recht beschränktem Speicher auskommen musst oder die Datenmenge sehr gross ist.
MfG
GK
PS: Ich habe nicht alle möglichen Handler für den xml-Parser gesetzt, da das Skript nur exemplarisch sein soll. Falls nötig kannst Du mit den xml_set_xxx_handler Funktionen andere Teile einer XML-Struktur verarbeiten.
-------------------------------
<?php
class XmlParser
{
public function __construct()
{
$this->m_Parser = xml_parser_create();
xml_set_element_handler($this->m_Parser, array($this, "startElement"), array($this, "endElement"));
xml_set_character_data_handler($this->m_Parser, array($this, "characterDataHandler"));
}
public function parse($data)
{
$this->m_Result = array();
$this->m_Stack = array();
$this->m_TextNode = null;
xml_parse($this->m_Parser, $data, true);
return($this->m_Result[0]);
}
private function characterDataHandler($parser, $data)
{
if (is_null($this->m_TextNode))
{
$this->m_TextNode = new StdClass;
$this->m_TextNode->text = $data;
}
else
{
$this->m_TextNode->text .= $data;
}
}
private function startElement($parser, $name, $attrib)
{
if (!is_null($this->m_TextNode) && !preg_match("/^\s*$/", $this->m_TextNode->text))
$this->AddNode($this->m_TextNode);
$this->m_TextNode = null;
$node->tagName = $name;
foreach ($attrib as $key => $value)
$node->$key = $value;
array_unshift($this->m_Stack, $node);
}
private function endElement($parser, $name)
{
if (!is_null($this->m_TextNode) && !preg_match("/^\s*$/", $this->m_TextNode->text))
$this->AddNode($this->m_TextNode);
$this->m_TextNode = null;
$node = array_shift($this->m_Stack);
if (!is_null($node))
$this->AddNode($node);
}
private function addNode($node)
{
if (0 == count($this->m_Stack))
{
array_push($this->m_Result, $node);
}
else
{
$parent = $this->m_Stack[0];
if (is_array($parent->childNodes))
array_push($parent->childNodes, $node);
else
$parent->childNodes = array($node);
if (is_array($parent->childNodes[$node->tagName]))
array_push($parent->childNodes[$node->tagName], $node);
else if (isset($parent->childNodes[$node->tagName]))
$parent->childNodes[$node->tagName] = array($parent->childNodes[$node->tagName], $node);
else
$parent->childNodes[$node->tagName] = $node;
}
}
private $m_Result;
private $m_Parser;
private $m_Stack;
private $m_TextNode;
}
$data = "irgendwelche XML Daten";
$parser = new XmlParser();
$result = $parser->parse($data);
print_r($result);
?>