Hi!
SimpleXML arbeitet mit viel PHP-Magie (Object overloading plus SPL), da helfen einem allgemeine PHP-Kenntnisse nicht unbedingt weiter. Stattdessen sollte man in der Dokumentation nachsehen, wie man bestimmte Elemente anspricht.
So viel Magie war es dann doch nicht :-)
Aber genug, um jenseits der üblichen PHP-Regeln zu landen. Du hast ein Objekt und greifst mit -> auf seine Eigenschaften zu. Soweit ist das normal. Zusätzlich kannst du mit dem Array-Zugriff ['name'] auf Dinge zugreifen, die gar nicht direkt im Objekt enthalten sind, sondern in einer seiner Eigenschaften. So sieht das erste <option...> aus, wenn man es var_dump()t.
object(SimpleXMLElement)#6 (1) {
["@attributes"]=>
array(4) {
["value"]=>
string(12) "notinstalled"
["optionvalue"]=>
string(12) "NotInstalled"
["displayvalue"]=>
string(13) "Not Installed"
["dtype"]=>
string(1) "s"
}
}
Man sieht eine Eigenschaft namens @attributes - mit @ vorndran. Das kann man schon mal nicht auf einfachem Wege mit ->@attributes ansprechen sondern benötigt ->{@attributes} - was jedoch immer noch PHP-konform ist. Ein var_dump($option->{@attributes}) sollte nun das Array mit seinen 4 Elementen ergeben. Aber Pustekuchen, man bekommt mit object(SimpleXMLElement)#8 (0) {} ein leeres Objekt. Auch der Durchgriff mit $option->{@attributes}['value'] schlägt fehl - und zwar ohne Fehlermeldung, das ergibt einfach nur NULL als Ergebnis. Man muss das $option als nicht sichtbares Array ansprechen: $option['value'] und bekommt dann - Überraschung! keinen String sondern ein
object(SimpleXMLElement)#8 (1) {
[0]=>
string(12) "notinstalled"
}
Wundersamerweise per echo ausgegeben ergibt das dann: notinstalled. Also wenn da nicht jede Menge Magie verbaut ist, ...
SimpleXML ist zwar der einfachste Weg, um auf XML zuzugreifen, aber zugleich der am wenigsten offensichtliche.
Lo!