XML in JSON oder Arrays umwandeln in PHP

Datum: 8. April 2014
Autor: Stefan Oswald


Ich bin heute über die mir bisher in diesem Ausmaß noch gar nicht bekannte Mächtigkeit der JSON-Funktionen von PHP gestolpert: Wie sich bei einer imx.Mapwork Anpassung herausgestellt hat, kann json_encode() so ziemlich alles als Parameter erhalten – einschließlich SimpleXMLElement. Der einzige Typ, der nicht verarbeitet werden kann, ist „resource“.

Auf diese Art ist es sehr leiht, XML in JSON, und über diesen Umweg natürlich auch in ein assoziatives Array umzuwandeln:

$xml = simplexml_load_file('data.xml');
$json = json_encode($xml);
$array = json_decode($json, true);

Einen kleinen Pferdefuß gibt es dabei, aber auch der kann umgangen werden: CDATA-Sektionen werden nicht mit umgewandelt. Das PHP-Team bewertet dies interessanter Weise nicht als Bug [1] und sagt, man solle die CDATA-Tags vorher in Strings umwandeln. Bei einem automatisierten Prozess ist das natürlich nicht so einfach möglich… die Lösung ist aber denkbar einfach: Bei der Erzeugung des SimpleXMLElement muss die Option LIBXML_NOCDATA verwendet werden. Dies ist standardmäßig nicht der Fall, aber man kann ein bestehendes SimpleXMLElement einfach erneut umwandeln:

/**
* Gives an array representation of the given SimpleXMLElement, using json_decode()
* to convert SimpleXMLElement to JSON and json_decode() to convert JSON to array.
* Also works for CDATA sections.
*
* @param SimpleXMLElement $xml
* @return array
*/
function xmlToArray(SimpleXMLElement $xml) {
$xmlString = $xml->asXML();
$xmlCopy = simplexml_load_string($xmlString, SimpleXMLElement, LIBXML_NOCDATA);
$json = json_encode($xmlCopy);
return json_decode($json, true);
}

Zuerst wird das bestehende SimpleXMLElement in einen String umgewandelt. Dieser wird dann wiederum in ein SimpleXMLElement umgewandelt, unter Verwendung der Parser-Option LIBXML_NOCDATA. Wird das somit erzeugte, neue SimpleXMLElement nun mit json_encode() geparst, werden die CDATA-Inhaltemit berücksichtigt.

[1] https://bugs.php.net/bug.php?id=41976

Kommentare

Selber kommentieren:






Weitere Beiträge zum Thema Technologie


Neues vom IE, Spartan Browser und Facebook Video

Autor: Benjamin Hofmann


Technologie


Der Spartan-Browser kommt ja so langsam ins Rollen, also gibt’s Neuigkeiten, was das für den IE bedeuten wird: „Gerüchte über das Ende des Internet Explorer sind stark übertrieben“, hält Microsoft zwar dagegen. Tatsächlich erneuerte dieser Post aber nur das Bekenntnis, den Internet Explorer für Firmenkunden am Leben zu erhalten“ Microsoft arbeitet seit einiger Zeit mit …


Beitrag lesen
26.
März
2015

Builder Pattern Eclipse Plugin

Autor: Christian Göbel


Technologie


J. Bloch schildert in „Effective Java“ die Vorzüge des Builder Patterns, insbesondere bei Konstruktoren mit mehr als 4 Parametern: verbesserte Lesbarkeit, vor allem bei einer Vielzahl an optionalen Parametern konsistente, in sich abgeschlossene Erzeugung von unveränderlichen Objekten (im Vergleich zur Erzeugung mittels JavaBean Settern) Trotzdem ist das Schreiben des Builder-Codes ein wenig zeitaufwändig. Mittels dieses …


Beitrag lesen
05.
Juli
2012

ML Conference 2018

Autor: Tobias Pfannkuche


Technologie // Über den Tellerrand


„Your scientists were so preoccupied with whether or not they could, they didn’t stop to think if they should.“ Ian Malcolm, Jurassic Park „Machine Learning sucks. It really does.“ Dr. Pieter Buteneers, ML Conference 2018 „Don’t wait for perfection.“ Dr. Ulrich Bodenhausen, ML Conference 2018 Ein Bericht zur ML-Konferenz rund um das Thema Künstliche Intelligenz …


Beitrag lesen
27.
Juni
2018

Build seven good object-oriented habits in PHP

Autor: Benjamin Hofmann


Technologie


Es ist zwar schon eine ganze Weile her, dass ich bei IBM über einen wirklich guten Artikel zu OOP in PHP gestoßen bin. Darin geht es um gute Gewohnheiten beim Schreiben von Code. Es geht um insgesamt sieben gute Gewohnheiten: Be modest. Be a good neighbor. Avoid looking at Medusa. Embrace the weakest link. You’re …


Beitrag lesen
19.
Januar
2017