# XML file auslesen...



## CrushLog (21. November 2007)

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:


```
<?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:


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

Bekomme ich nur Fehler:


```
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!


----------



## CrushLog (22. November 2007)

Hat denn keiner einen Tip oder kann mir helfen? Wäre recht wichtig und ich komm echt nicht mehr weiter...

Danke.


----------



## ristone (22. November 2007)

Da Teile deiner Fehlerbeschreibung nicht in deinen Code drin sind kann man da nur Raten.

An deiner Stelle würd ich mal http://de.php.net/manual/de/ref.xmlreader.php schauen der funktioniert sehr gut.


----------



## Marvin Schmidt (22. November 2007)

Moin moin!



CrushLog hat gesagt.:


> Das XML file sieht wir folgt aus:
> 
> 
> ```
> ...



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:

```
<?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:


```
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:

```
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


----------

