Gibt es eine Möglichkeit, json in PHP in xml zu konvertieren?

Gibt es eine Möglichkeit, json in PHP in xml zu konvertieren? Ich weiß, dass xml zu json sehr viel möglich ist.

   

Wenn Sie den XML-Serializer von PEAR verwenden möchten, können Sie das JSON-Objekt in ein PHP-Objekt und dann das PHP-Objekt in zwei einfache Schritte in XML konvertieren:

 include("XML/Serializer.php"); function json_to_xml($json) { $serializer = new XML_Serializer(); $obj = json_decode($json); if ($serializer->serialize($obj)) { return $serializer->getSerializedData(); } else { return null; } } 

Es hängt davon ab, wie genau Sie XML aussehen sollen. Ich würde versuchen, eine Kombination von json_decode() und der PEAR::XML_Serializer ( mehr Informationen und Beispiele auf sitepoint.com ).

 require_once 'XML/Serializer.php'; $data = json_decode($json, true) // An array of serializer options $serializer_options = array ( 'addDecl' => TRUE, 'encoding' => 'ISO-8859-1', 'indent' => ' ', 'rootName' => 'json', 'mode' => 'simplexml' ); $Serializer = &new XML_Serializer($serializer_options); $status = $Serializer->serialize($data); if (PEAR::isError($status)) die($status->getMessage()); echo '
'; echo htmlspecialchars($Serializer->getSerializedData()); echo '

';

(Ungetesteter Code – aber Sie bekommen die Idee)

Öffnen Sie den JSON mit json_decode und durchlaufen Sie ihn, um den gewünschten XML- json_decode zu generieren.

Falls Sie sich wundern, es gibt keine kanonische Zuordnung zwischen JSON und XML, Sie müssen also den XML-Generierungscode selbst schreiben, basierend auf den Anforderungen Ihrer Anwendung.

Ich habe die beiden früheren Vorschläge folgendermaßen kombiniert:

 /** * Convert JSON to XML * @param string - json * @return string - XML */ function json_to_xml($json) { include_once("XML/Serializer.php"); $options = array ( 'addDecl' => TRUE, 'encoding' => 'UTF-8', 'indent' => ' ', 'rootName' => 'json', 'mode' => 'simplexml' ); $serializer = new XML_Serializer($options); $obj = json_decode($json); if ($serializer->serialize($obj)) { return $serializer->getSerializedData(); } else { return null; } } 

Eine native Annäherung könnte sein

 function json_to_xml($obj){ $str = ""; if(is_null($obj)) return ""; elseif(is_array($obj)) { //a list is a hash with 'simple' incremental keys $is_list = array_keys($obj) == array_keys(array_values($obj)); if(!$is_list) { $str.= ""; foreach($obj as $k=>$v) $str.="".json_to_xml($v)."".CRLF; $str .= ""; } else { $str.= ""; foreach($obj as $v) $str.="".json_to_xml($v)."".CRLF; $str .= ""; } return $str; } elseif(is_string($obj)) { return htmlspecialchars($obj) != $obj ? "< ![CDATA[$obj]]>" : $obj; } elseif(is_scalar($obj)) return $obj; else throw new Exception("Unsupported type $obj"); } 

Eine andere Option wäre die Verwendung eines JSON-Streaming-Parsers .

Die Verwendung eines Streamer-Parsers würde sich als nützlich erweisen, wenn Sie das von PHP erstellte Zwischenobjekt-Diagramm umgehen wollen, wenn Sie json_decode . Wenn Sie zum Beispiel ein großes JSON-Dokument haben und Speicher ein Problem darstellt, könnten Sie das XML mit XMLWriter direkt XMLWriter während Sie das Dokument mit dem Streaming-Parser lesen.

Ein Beispiel wäre https://github.com/salsify/jsonstreamingparser

 $writer = new XMLWriter; $xml->openURI('file.xml'); $listener = new JSON2XML($writer); // you need to write the JSON2XML listener $stream = fopen('doc.json', 'r'); try { $parser = new JsonStreamingParser_Parser($stream, $listener); $parser->parse(); } catch (Exception $e) { fclose($stream); throw $e; } 

Der JSON2XML-Listener muss die Listener-Schnittstelle implementieren:

 interface JsonStreamingParser_Listener { public function start_document(); public function end_document(); public function start_object(); public function end_object(); public function start_array(); public function end_array(); public function key($key); public function value($value); } 

Zur Laufzeit erhält der Listener die verschiedenen Ereignisse vom Parser, zB wenn der Parser ein Objekt findet, sendet er die Daten an die Methode start_object() . Wenn es ein Array findet, triggers es start_array() und so weiter aus. In diesen Methoden würden Sie dann die Werte an die entsprechenden Methoden im XMLWriter , zB start_element() und so weiter.

Haftungsausschluss: Ich bin weder mit dem Autor verbunden, noch habe ich das Tool vorher benutzt. Ich wählte diese Bibliothek aus, weil die API ausreichend einfach aussah, um zu veranschaulichen, wie ein ereignisbasierter JSON-Parser verwendet wird.