dedlfix: simplexml vs. SOAP xml

Beitrag lesen

echo $begrüßung;

Die sind doch da:
print_r($xml->children('http://www.w3.org/2003/05/soap-envelope')->children()->site->areas->area)
In dieser Ausgabe erscheint nirgendwo Aachen oder ein anderes site->areas->area->name .

Ich sag doch, SimpleXML verhält sich aufgrund der verwendeten PHP-Magie anders als Objekte ohne Magie. Diverse Dinge berechnet es erst bei einem direkten Zugriff. Manchmal sogar unterschiedlich.

$xml->children('http://www.w3.org/2003/05/soap-envelope')->children()->site->areas->area->name

Damit bekommst du ein Objekt. Wenn du an das Aachen willst, musst du das Objekt in einen String-Kontext bringen, damit intern __toString() aufgerufen wird und somit das Aachen aus dem CDATA befreit wird. Beispielsweise über

echo $xml->...

oder via Typecast

$name = (string) $xml->...

Dieses In-den-String-Kontext-Bringen passiert bei print_r() nicht, weswegen du da kein Aachen siehst.

Interessant wird es bei sub_area, denn davon gibt es mehrere. print_r(...->sub_areas) zeigt ein Array unterhalb von sub_area an, ein ->sub_areas->sub_area liefert dir aber nicht das Array sondern das erste Element daraus. Nichtsdestotrotz kann man mit foreach über ->sub_areas->sub_area iterieren und mittels Indices auf die einzelnen sub_area-Elemente zugreifen. An dieser Stelle spielen neben dem Overloading auch noch diverse Dinge der SPL mit.

Lese ich in der falschen Dokumentation

Weiß ich nicht, weil ich bisher nur durch Probleme anderer mit SimpleXML in Berührung kam, und mir das Thema weniger über die Dokumentation erarbeitet habe. Vielleicht gibt es anderswo im Netz ausführlichere Tutorials, die auch auf die Fälle eingehen, bei denen das "simple" in SimpleXML nicht mehr stimmt.

oder woher hast Du das Wissen gewonnen?

Ich weiß, dass es Overloading, "magische" Funktionen und die SPL gibt, und habe damit genügend Erfahrung gesammelt, so dass ich erkenne, dass von diesen Möglichkeiten bei SimpleXML reger Gebrauch gemacht wird. Teilweise leider nicht unbedingt nachvollziehbar für OOP-Anfänger bzw. -Normalnutzer.

echo "$verabschiedung $name";