XML mit php parsen?

F

freakx0

Guest
Ich möchte gerade erste Schritte im XML parsen mit php machen jedoch hängt es schon an der Idee
sad.gif

Bisher hab ich nur news (welche ja recht einheitliches Format haben) mit einer open-source Klasse geparst, jetzt will ich das aber selber mal lernen.

Wie kann ich die nachfolgende XML-Datei parsen? Ich würde das ganze am besten in ein mehrdimensionales Array packen, nur wie?
CODE
<?xml version="1.0" encoding="ISO-8859-1"?>
<spezialxml >
<uebertragung/>
<anbieter>
<nr>100179</nr>
<name>Firma Record GmbH</bane>
<spezialxml_id>22112</spezialxml_anid>
<anhang>
<anhangtitel></anhangtitel>
<format></format>
<daten>
<pfad></pfad>
</daten>
</anhang>
<artist>
<kategorie>
<nutzungsart HOEREN="1"/>

<vermarktungsart KAUF="true"/>
<art>
<genre genretyp="hiphop"/>
</art>
</kategorie>
<kontakt>
<plz>13351</plz>
<ort>Berlin</ort>
<strasse>Müllerstr.</strasse>

<hausnummer>97</hausnummer>
<bundesland></bundesland>

</kontakt>
<kontaktperson>
<email_zentrale>info@name.de</email_zentrale>
<email_direkt>nachname@name.de</email_direkt>

<tel_zentrale>030/123456</tel_zentrale>
<tel_durchw></tel_durchw>
<tel_fax>030/123457</tel_fax>
<tel_handy></tel_handy>
<name>nachname</name>

</kontaktperson>
<infos>
<alter>250</alter>
<ehe></ehe>
</infos>
<ausstattung>
<ons></ons>
<raeume></raeume>

</ausstattung>

<anhaenge>
<anhang>
<anhangtitel>cd_124.jpg</anhangtitel>

<format>JPG</format>
<daten>
<anhanginhalt>ascmabamn23abnsdam==</anhanginhalt>
</daten>
</anhang>
<anhang>
<anhangtitel></anhangtitel>
<format></format>

<daten>
<pfad></pfad> </daten>
</anhang>

</anhaenge>

</artist>
</anbieter>
</spezialxml>



php-manual gibt ja schon eine Einführung, nur so viel weiter komme ich nicht, da meine XML-Datei ja so verschachtelt ist...

CODE
<?php
$file = "data.xml";
$depth = array();

function startElement($parser, $name, $attrs)
{
global $depth;
for ($i = 0; $i < $depth[$parser]; $i++) {
echo " ";
}
echo "$name\n";
$depth[$parser]++;
}

function endElement($parser, $name)
{
global $depth;
$depth[$parser]--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
?>



Kann mir jemand einen Tipp geben, wie ich da anfangen könnte?
Die Funktion/Methode startElement wird ja bei jedem öffnenden <anhaenge> aufgerufen, soweit so klar, nur wie mache ich das mit dem übelst verschachtelten zeugs??

Gruß
Dominik
 
???

Xml wurde 1998 eingeführt, damit man flexible Datenstrukturen verwalten kann, ohne daß man jedesmal individuelle Parser konstruiert.

Folglich: Lade die Datei als Xml-Dokument und transferiere sie mit Xsl in den gewünschten Output bzw. fische dir mit XPath-Anweisungen die gewünschten Informationen heraus und verarbeite sie direkt weiter. Alles andere fällt in die Zeit Anfang der 90-er zurück.

Der Clou von Xml besteht ja gerade darin, daß man keinen individuellen Parser mehr schreibt.
 
mh, die xml soll eigentlich eingelesen werden und die daten dann in datenbank und bilder (anhänge) im Filesystem abgelegt werden. Also nicht direkt output.
Ich bekomme immer eine gleich Aufgebaute XML-Datei, mal mit z. B. 1 Anhang, mal auch mit mehreren.

Ich hoffe ich konnte dir meine Gründe jetzt etwas näher bringen?!
Ich muss jetzt halt an die Daten kommen...

gruß und thx
dominik
 
Hallo,

wenn Du es nur lesen möchtest, reicht eigentlich SimpleXML [1] von PHP völlig aus, es baut wohl kein reines Array auf, sondern ein Objekt mit ggf. einigen Arrays, doch dafür es ist sehr einfach in der Handhabung.



MfG Sascha Ahlers

[1] PHP: SimpleXML Funktionen
 
Sorry @Sascha, es ist doch absurd, eine Struktur in eine andere zu konvertieren.

Das Ding ist doch sofort lesbar, das ist ja gerade der Clou, daß man mit einer simplen Sprache sofort an jeden Einzelwert herankommt.

In VB.NET sind das irgendwie so etwa drei Zeilen:

CODE Dim _xDoc As New XmlDocument()
_xDoc.load('Dateiname') ' oder _xDoc.loadXml(direkt der String)

Console.WriteLine(_xDoc.DocumentElement.SelectSingleNode("//foo[5]/@name").Value)

liefert vom fünften Element foo den Wert des name-Attributes.

Ob man sich also einzelne Werte herauspickt oder ein ganzes Teilgerüst, ob man daraus wieder einen Output erzeugt oder irgend etwas anderes, spielt keine Rolle. Warum soll ich eine Struktur, wo ich auf alle Elemente zugreifen kann, in eine andere Struktur konvertieren? Ebenso gibt es Schleifen und alles mögliche.
 
QUOTE (jAuer @ Mo 3.4.2006, 18:57)Sorry @Sascha, es ist doch absurd, eine Struktur in eine andere zu konvertieren. [...]

Was ist den an SimpleXML zu verkehrt. SimpleXML kann ja nicht alleine eine Datenstruktur für PHP aufstellen, ich bin nur auf die Fragestellung eingegangen, aber wenn Dir so viel an XPath liegt:


CODE $xml = simplexml_load_string($string); /* oder simplexml_load_file() */
$result = $xml->xpath('/a/b/c');


Siehe auch: http://www.php.net/manual/de/function.simp...ement-xpath.php



MfG Sascha Ahlers
 
vielen dank für eure antworten. werde mich dann jetzt mal ein paar tage in richtung simpleXml vorarbeiten...

@jAuer
wie soll ich dann die Daten aus dem XML-File "extrahieren"?


gruß und nochmal großes thx
dominik
 
QUOTE wie soll ich dann die Daten aus dem XML-File "extrahieren"?


na genau so, wie es dir @Sascha aufgeschrieben hat, Du hat damit ja bereits Zugriff auf jedes Element. Und so, wie es @Sascha nun verwendet, macht er ja dasselbe wie ich - er konvertiert die Daten gerade nicht mehr in einen Array.

Ich verwende kein PHP - aber die XPath-Anweisungen sind immer einheitlich.

Ob man jetzt


CODE $result = $xml->xpath('/a/b/c');


in PHP oder


CODE Dim sResult As String = xDoc.DocumentElement.SelectSingleNode("/a/b/c").value


schreibt, hängt von der verwendeten Programmierumgebung ab.
 
Zurück
Oben