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)
SimpleXML -> Array [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
SimpleXML -> Array


 
Nedan
25-09-2011, 14:14 
 
Guten Tag,

folgendes XML-Dokument:

<Collection>
<DVD>
<ProfileTimestamp>2010-06-09T19:35:47.000Z</ProfileTimestamp>
<ID>4010232044778.5</ID>
<MediaTypes>
<DVD>true</DVD>
<HDDVD>false</HDDVD>
<BluRay>false</BluRay>
</MediaTypes>
<DVD>
</Collection>
parse ich mit Hilfe von SimpleXML

$xml = simplexml_load_file('test.xml');
$c_dvd = 0;
/** Foreach root element **/
foreach($xml as $key => $value){
/** foreach element on level 1 **/
foreach($value as $key => $value1) {
$dvds[$c_dvd][$key] = (string) $value1;
/** If element has children **/
if(count($value1) > 0) {
/** foreach element on level 2**/
foreach($value1 as $key1 => $value2) {
$dvds[$c_dvd][$key][$key1] = (string) $value2;
}
}
}
$c_dvd++;
}
Das kommt dabei heraus wenn ich mir das Array $dvds mit print_r ausgeben lasse

Array ([0] => Array (
[ProfileTimestamp] => 2010-06-09T19:35:47.000Z
[ID] => 4010232044778.5
[MediaTypes] => f



[UPC] => 4-010232-044778
)
)
Und genau da liegt das Problem. Bei MediaTypes müssten eigentlich 3 Schlüssel mit den entsprechenden Werten auftauchen. Wenn ich mir mit einem echo die Werte $key1 und $value2 ausgeben lassen funktioniert das auch. Eigentlich müsste da nach meinem Verständnis so etwas herauskommen:

Array ([0] => Array (
[ProfileTimestamp] => 2010-06-09T19:35:47.000Z
[ID] => 4010232044778.5
[MediaTypes] => array (
[DVD]=>true
[HDDVD]=>false
[BluRay]=>false
)
[UPC] => 4-010232-044778
)
)
Oder etwa nicht?

Viele Dank für's Durchlesen.
Nedan

 
TobiaZ
25-09-2011, 15:06 
 
Kannst du noch ne Testausgabe von $xml posten?
Wiese parst du das ganze noch mal von Hand?

Deine Testausgaben wirken nicht plausibel, weil da Leerzeichen drin sind, die print_r() niemals ausgeben würde.

Die Abfrage if(count($value1) > 0) { sollte eigentlich schon kommen, bevor du den Wert ins Array speicherst.

 
Nedan
25-09-2011, 22:02 
 
Hi,

ich habe den Fehler gefunden. Siehe weiter unten.
zu den Fragen:
Testausgabe direkt nach simplexml_load_file

SimpleXMLElement Object (
[DVD] => SimpleXMLElement Object (
[ProfileTimestamp] => 2010-06-09T19:35:47.000Z
[ID] => 4010232044778.5
[MediaTypes] => SimpleXMLElement Object (
[DVD] => true
[HDDVD] => false
=> false
)
)
)
Warum ich das ganze noch mal von Hand parse?
Weil nachher sowas im XML kommt:

<Actors>
<Divider Caption="1. Pilot: Kaltgestellt" Type="Episode"/>
<Actor FirstName="Jeffrey" MiddleName="" LastName="Donovan".../>
<Actor FirstName="Gabrielle" MiddleName="" LastName="Anwar".../>
<Divider Caption="2. Ausgetrickst " Type="Episode"/>
...
</Actors>
Der Divider hat keinerlei Kindelemente ist aber eine Unterteilung. Und die soll beibehalten werden.
SimpleXML macht, ohne das von Hand parsen, daraus:

[Actors] => SimpleXMLElement Object (
[Divider] => Array (
[0] => SimpleXMLElement Object (
[@attributes] => Array (
[Caption] => 1. Pilot: Kaltgestellt
[Type] => Episode
)
)
[1] => SimpleXMLElement Object (
[@attributes] => Array (
[Caption] => 2. Ausgetrickst
[Type] => Episode
)
)
)
[Actor] => Array (
[0] => SimpleXMLElement Object (
[@attributes] => Array (
[FirstName] => Jeffrey
[MiddleName] =>
[LastName] => Donovan
)
)
[1] => SimpleXMLElement Object (
[@attributes] => Array (
[FirstName] => Gabrielle
[MiddleName] =>
[LastName] => Anwar
)
)
)
So geht die Zuordnung von Divider und Schauspieler verloren.
Vielleicht kennst du eine besser Möglichkeit mit XML was dann in die Datenbank geschrieben wird. Ich bin offen für neues =)

Damit allerdings kann ich nichts anfangen. Kannst du mir genau erklären was du meinst?
Deine Testausgaben wirken nicht plausibel, weil da Leerzeichen drin sind, die print_r() niemals ausgeben würde.[B]Lösung
Es war mal wieder ein Denkfehler (rot markiert).

/** foreach element on level 1 **/
foreach($value as $key => $value1) {
$dvds[$c_dvd][$key] = (string) $value1;
/** If element has children **/
if(count($value1) > 0) {
/** foreach element on level 2**/
foreach($value1 as $key1 => $value2) {
$dvds[$c_dvd][$key][$key1] = (string) $value2;
}
}
}
}
Denkfehler deswegen:
$key ist dem Fall Mediatype und dieses Element hat weder Attribute noch Werte, sondern nur Kindelemente. Ich schreibe aber fröhlich in $value1 und das ist dann das komplette SimpleXML Object für MediaTypes:
object(SimpleXMLElement)#5 (3) {
["DVD"]=> string(4) "true"
["HDDVD"]=> string(5) "false"
["BluRay"]=> string(5) "false"
}Also muss ich, bevor ich die erste Ebene in das Array schreibe überprüfen ob das Element Kindelemente hat oder nicht.
So funktioniert es dann:

foreach($xml as $key => $value){
/** foreach element on level 1 **/
foreach($value as $key => $value1) {
/** If element has children **/
if(count($value1) > 0) {
/** foreach element on level 2**/
foreach($value1 as $key1 => $value2) {
$dvds[$c_dvd][$key][$key1] = (string)$value2;
}
} else {
$dvds[$c_dvd][$key] = (string)$value1;
}
}
$c_dvd++;
}

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:43 Uhr.