Hi,
ich habe den Fehler gefunden. Siehe weiter unten.
zu den Fragen:
Testausgabe direkt nach simplexml_load_file
Code:
SimpleXMLElement Object (
[DVD] => SimpleXMLElement Object (
[ProfileTimestamp] => 2010-06-09T19:35:47.000Z
[ID] => 4010232044778.5
[MediaTypes] => SimpleXMLElement Object (
[DVD] => true
[HDDVD] => false
[BluRay] => false
)
)
)
Warum ich das ganze noch mal von Hand parse?
Weil nachher sowas im XML kommt:
Code:
<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:
Code:
[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?
Zitat:
|
Deine Testausgaben wirken nicht plausibel, weil da Leerzeichen drin sind, die print_r() niemals ausgeben würde.
|
Lösung
Es war mal wieder ein Denkfehler (rot markiert).
Code:
/** 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:
Code:
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:
PHP-Code:
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++;
}