XML in Tabellenstruktur einlesen

Methode: get_record()

Quelldatei adressen.xml:


<adressen>
  -  <eintrag id="1" datum="2002-05-24">
  -     -  <name>Klausmann</name>
  -     -  <vorname>Heinz</vorname>
  -     -  <anschrift>
  -     -     -  <strasse info="3 x klingeln!">Feldstrasse 5</strasse>
  -     -     -  <plz>23456</plz>
  -     -     -  <ort>Teststadt</ort>
  -     -  </anschrift>
  -  </eintrag>
  -  <eintrag id="2" datum="2002-07-03">
  -     -  <name vorbestraft="ja">Meyer</name>
  -     -  <vorname>Guste</vorname>
  -     -  <anschrift>
  -     -     -  <strasse>Tannh</strasse>
  -     -     -  <plz>98765</plz>
  -     -     -  <ort>Nulldorf</ort>
  -     -  </anschrift>
  -  </eintrag>
  -  <eintrag id="3" datum="2003-02-01">
  -     -  <name>Katzbeck</name>
  -     -  <vorname>Karl-Heinz</vorname>
  -     -  <anschrift>
  -     -     -  <strasse>An der Teststrecke 123a</strasse>
  -     -     -  <plz>63555</plz>
  -     -     -  <ort>Netzbach</ort>
  -     -  </anschrift>
  -  </eintrag>
</adressen>

Diese Methode ist besonders dazu gedacht, einen schnellen Zugriff auf XML-Dateien zu erhalten, die im Grunde flache Tabellen sind, und eventuell sogar nichts anderes als ein XML-Export aus einer Datenbanktabelle oder Tabellenkalkulation sind.

Dieses Beispiel macht es sich etwas schwerer, da auch Attribute und sogar ein Element mit untergeordneten Elementen enthalten sind.

Aufgabe: Alle Datensätze aus der Datei adressen.xml einlesen, die vom Element eintrag eingeschlossen sind.
Da es in diesem Beispiel genau 3 Elemente mit dem Namen eintrag haben, erhalten wir auch drei Ergebnisse im Ergebnisarray.


<?php
require_once("../xml-line.php");
$mylines = new xml_line("xml-files/adressen.xml");
$mylines->get_record(0,"eintrag");
$mylines->xml_stream();
print $mylines->get_output();
?>

Ergebnis-Array:


<?php
echo "<pre>";
print_r($mylines->table_result);
echo "</pre>";
?>

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [_@id] => 1
                    [_@datum] => 2002-05-24
                    [name] => Klausmann
                    [vorname] => Heinz
                    [anschrift] => 
                    [anschrift/strasse] => Feldstrasse 5
                    [anschrift/strasse@] => Array
                        (
                            [info] => 3 x klingeln!
                        )

                    [anschrift/strasse@info] => 3 x klingeln!
                    [anschrift/plz] => 23456
                    [anschrift/ort] => Teststadt
                )

            [1] => Array
                (
                    [_@id] => 2
                    [_@datum] => 2002-07-03
                    [name] => Meyer
                    [name@] => Array
                        (
                            [vorbestraft] => ja
                        )

                    [name@vorbestraft] => ja
                    [vorname] => Guste
                    [anschrift] => 
                    [anschrift/strasse] => Tannh
                    [anschrift/plz] => 98765
                    [anschrift/ort] => Nulldorf
                )

            [2] => Array
                (
                    [_@id] => 3
                    [_@datum] => 2003-02-01
                    [name] => Katzbeck
                    [vorname] => Karl-Heinz
                    [anschrift] => 
                    [anschrift/strasse] => An der Teststrecke 123a
                    [anschrift/plz] => 63555
                    [anschrift/ort] => Netzbach
                )

        )

)

Besonderheit: Die Zuordung von Attributen geschieht so:
[name@vorbestraft]

Auch die Attribute des umschließenden Elements, in diesem Fall eintrag sind in Version 0.4 verfügbar:
['_@datum']

Enthält ein Element des Datensatzes ein weiteres Element, wird dies folgendermaßen in die Tabellenstruktur eingegliedert:
['anschrift/strasse']

Die get-record-Methode hat natürlich ihre Grenzen und eignet sich vor allem für Tabellen- oder Datenbankexporte. Wie in einer Datenbanktabelle muss jede Spalte einen anderen Namen haben. Würde hier ein gleichnamiges Element auftauchen, würde der vorige Wert überschrieben werden.

In Zukunft ist vorgesehen, auch diesen Fall zu berücksichtigen. Die Verwendung von geschachtelten Arrays soll aber auf jeden Fall vermieden werden.

Eine Möglichkeit, wie man mit einem Sonderfall dieses Problems umgehen kann, zeigt das Beispiel rename_element.php.

Zugriff auf einzelne Werte:

Aufgabe: Welchen Wert hat das Element name im zweiten Datensatz? Das Ergebnis-Array steckt in der Variablen table_result.


<?php
printf("<p>Der Wert ist: <b>%s</b></p>",
       $mylines->table_result[0][1]['name']);
?>

Der Wert ist: Meyer

Noch einmal zur Erinnerung: Der erste Index zählt die aufgerufenen Methoden. In diesem Beispiel gibt es nur die eine, also [0]. Der Index [1] ist das zweite zurückgelieferte Ergebnis, da wir auch hier bei 0 anfangen zu z�hlen.

Der Wert ist: Klausmann

Der Wert ist: Meyer

Der Wert ist: Katzbeck