XML file auslesen...

CrushLog

Erfahrenes Mitglied
Hallo,

ich hab mich bis jetzt noch nicht wirklich mit dem Thema auseinander gesetzt, muss nun aber eine XML Datei in PHP einlesen, bzw ausgelesene Werte in MySQL eintragen.
Ich hab mich etwas schlau gemacht über die SimpleXML funktion ab PHP 5, wirklich weiter gebracht hat mich das nach stundenlanger Sucher aber nicht wirklich.

Das XML file sieht wir folgt aus:

Code:
<?xml version="1.0" encoding="iso-8859-1" ?>
<process timestamp='1189838013' bill='120000'>
  <check type='type1' name='test1' id='1'/>
  <comment>comment1</comment>
</process>
<process timestamp='1189838118' bill='100000'>
  <check type='type2' name='test2' id='2'/>
  <comment>comment2</comment>
</process>
...

Wenn ich das File nun folgendermassen versuche einzulesen:

PHP:
...
				$uploadedfile = $uploaddir . $_FILES['xmlfile']['name'];
				
				$xml = simplexml_load_file($uploadedfile);
				
				foreach($xml->process as $processes) {
				
					echo $processes->comment;
				
				}
...

Bekomme ich nur Fehler:

Code:
Warning: simplexml_load_file() [function.simplexml-load-file]: files/save2.xml:6: parser error : Extra content at the end of the document in XXX\xml.php on line 42

Warning: simplexml_load_file() [function.simplexml-load-file]: <transfer timestamp='1189837818' credits='-120000'> in XXX\xml.php on line 42

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in XXX\xml.php on line 42

Warning: Invalid argument supplied for foreach() in XXX\xml.php on line 44

Frage: wie kann ich PHP nun dazu bringen das ordentlich Eintrag für Eintrag auszulesen und vorallem: wie kann ich die Attribute vernünftig auslesen, also timestamp, type, name, id usw.?

Bin echt ein bisschen überfordert, wäre nett, wenn mir mal jemand helfen könnte.
Achso, und ja: ich habe die Suche benutzt, aber leider nichts passendes gefunden, bzw lange herum probiert...

Danke im Voraus!
 
Moin moin!

Das XML file sieht wir folgt aus:

Code:
<?xml version="1.0" encoding="iso-8859-1" ?>
<process timestamp='1189838013' bill='120000'>
  <check type='type1' name='test1' id='1'/>
  <comment>comment1</comment>
</process>
<process timestamp='1189838118' bill='100000'>
  <check type='type2' name='test2' id='2'/>
  <comment>comment2</comment>
</process>
...
[...]
Code:
Warning: simplexml_load_file() [function.simplexml-load-file]: files/save2.xml:6: parser error : Extra content at the end of the document in XXX\xml.php on line 42

Warning: simplexml_load_file() [function.simplexml-load-file]: <transfer timestamp='1189837818' credits='-120000'> in XXX\xml.php on line 42

Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in XXX\xml.php on line 42

Warning: Invalid argument supplied for foreach() in XXX\xml.php on line 44

Wohlgeformte XML-Dateien dürfen nur ein Wurzelelement beinhalten, bei dir folgen aber noch weitere Elemente nach dem das zuerst geöffnete Element beendet wurde, daher beschwert sich der Parser über zusätzlichen Inhalt am Ende des Dokuments. Das kannst du aber leicht beheben indem du die process-Elemente mit einem Element umschließt, zum Beispiel so:
Code:
<?xml version="1.0" encoding="iso-8859-1" ?>
<processes>
        <process timestamp='1189838013' bill='120000'>
                <check type='type1' name='test1' id='1'/>
                <comment>comment1</comment>
        </process>
        <process timestamp='1189838118' bill='100000'>
                <check type='type2' name='test2' id='2'/>
                <comment>comment2</comment>
        </process>
</processes>

Um herauszufinden, wie du die Daten zu handhaben hast, dürfte [phpf]print_r[/phpf] hilfreich sein, die Ausgabe des obigen Beispiels sähe so aus:

Code:
SimpleXMLElement Object
(
    [process] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [timestamp] => 1189838013
                            [bill] => 120000
                        )

                    [check] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [type] => type1
                                    [name] => test1
                                    [id] => 1
                                )

                        )

                    [comment] => comment1
                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [timestamp] => 1189838118
                            [bill] => 100000
                        )

                    [check] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [type] => type2
                                    [name] => test2
                                    [id] => 2
                                )

                        )

                    [comment] => comment2
                )

        )

)

Deine foreach-Schleife ist also absolut richtig und funktionierte nur aufgrund der voherigen Fehler nicht.

Die Attribute des ersten process-Elements würdest du beispielsweise so durchgehen:
PHP:
foreach($xml->process[0]->attributes() as $attribut => $value) {
    echo $attribut . ' = ' . $value . "<br />\n";
}

Ich hoffe, dass ich dir damit weiterhelfen konnte.

Gutes Gelingen & schönen Gruß nach Hamburg
Marvin
 
Zurück