Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
XML-Knoten: mehrere Kinderelemente: Array, nur ein Element, direkter Zugriff auf Kind [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
XML-Knoten: mehrere Kinderelemente: Array, nur ein Element, direkter Zugriff auf Kind


 
Lennynero
01-09-2010, 11:46 
 
Hi,

gegeben sind zwei XML mit etwa der folgenden Struktur:


<Buecherei>
<Buch>
<Autor>Umberto Eco</Autor>
<Titel>Das Foucaultsche Pendel</Titel>
</Buch>
<Strasse>Bahnhofstr</Strasse>
<Stadt>Berlin</Stadt>
</Buecherei>


und


<Buecherei>
<Buch>
<Autor>Dan Brown</Autor>
<Titel>Das Symbol</Titel>
</Buch>
<Buch>
<Autor>Douglas Adams</Autor>
<Titel>Per Anhalter durch die Galaxis</Titel>
</Buch>
<Buch>
<Autor>Philip Vandenberg</Autor>
<Titel>Das fuenfete Evangelium</Titel>
</Buch>
<Buch>
<Autor>George Orwell</Autor>
<Titel>1984</Titel>
</Buch>
<Strasse>Berliner Strasse</Strasse>
<Stadt>Frankfurt am Main</Stadt>
</Buecherei>


PHP macht aus dem ersten mit SimpleXML dann so etwas:


array(
'Buch' => array(
'Autor' => 'Umberto Eco',
'Titel' => 'Das Foucaultsche Pendel',
),
'Strasse' => 'Bahnhofstr',
'Stadt' => 'Berlin',
)


Aus dem zweiten dann schlauerweise


array(
'Buch' => array(
1 => array(
'Autor' => 'Dan Brown',
'Titel' => '>Das Symbol',
)
2 => array(
'Autor' => 'Douglas Adams',
'Titel' => 'Per Anhalter durch die Galaxis',
)
3 => array(
'Autor' => 'Philip Vandenberg',
'Titel' => 'Das fuenfete Evangelium',
)
4 => array(
'Autor' => 'George Orwell',
'Titel' => '1984',
)
),
'Strasse' => 'Bahnhofstr',
'Stadt' => 'Berlin',
)


Prinzipiell ist das ja richtig, macht aber die Auswertung schwieriger, weil man ja den Fall abfangen muss.

Ich hatte das auch schon mit einem XML versucht, bei dem ich explizit einen "Zwischenknoten" hinzugefügt hatte, das Problem ist geblieben.

Gibt es da eine Einstellung, die mir das entsprechende Array mit der gleichen Struktur zurückgibt?

Gruss,
Markus

 
ezkimo
01-09-2010, 12:20 
 
Vielleicht wäre es in diesem Fall einfacher mit dem DomDocument Objekt von PHP zu arbeiten.

Ein kleines Beispiel:

$str = <<<XML
<Buecherei>
<Buch>
<Autor>Dan Brown</Autor>
<Titel>Das Symbol</Titel>
</Buch>
<Buch>
<Autor>Douglas Adams</Autor>
<Titel>Per Anhalter durch die Galaxis</Titel>
</Buch>
<Buch>
<Autor>Philip Vandenberg</Autor>
<Titel>Das fuenfete Evangelium</Titel>
</Buch>
<Buch>
<Autor>George Orwell</Autor>
<Titel>1984</Titel>
</Buch>
<Strasse>Berliner Strasse</Strasse>
<Stadt>Frankfurt am Main</Stadt>
</Buecherei>
XML;
$dom = new DomDocument();
$dom->loadXML($str);

$items = $dom->getElementsByTagName('Buch');
for ($i = 0; $i < $items->length; $i++) {
echo $items->item($i)->nodeName . " => " . $items->item($i)->nodeValue . "<br />";
}


Da Du in beiden XML Varianten den Buch Knoten hast, kannst Du mit dem DomNodeList Objekt relativ einfach den Elternknoten durchlaufen. Dazu auch einfach ins Manual schauen. In den User Kommentaren findet man geradezu Erstaunliches. ;)

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:25 Uhr.