2009-05-13 2 views
40

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

+0

Und noch wichtiger: Warum sollten Sie das jemals tun wollen? – NikiC

+1

'$ xml =" ";' (Stellen Sie eine dumme Frage ...) – salathe

+0

Das Zend Framework hat eine sehr gut funktionierende [Komponente] (http://framework.zend.com /manual/en/zend.json.xml2json.html) dafür. – markus

Antwort

11

Es hängt davon ab, wie genau Sie wollen, dass XML aussieht. Ich würde versuchen eine Kombination von json_decode() und PEAR::XML_Serializer().

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 '<pre>'; 
echo htmlspecialchars($Serializer->getSerializedData()); 
echo '</pre>'; 

(Ungeprüfte Code - aber Sie erhalten die Idee)

+0

Ack, du schlägst mich um eine halbe Minute.Ich werde sowieso meine verlassen - es ist ein etwas anderer Ansatz. –

25

Wenn Sie bereit sind, die XML Serializer von PEAR zu verwenden, können Sie die JSON an ein PHP-Objekt zu konvertieren und dann die PHP-Objekt in XML in zwei einfache Schritte:

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; 
    } 
} 
7

Risse öffnen Sie die JSON mit json_decode und durchqueren sie, was auch immer Sie wollen XML zu generieren.

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

5

I kombiniert die beiden früheren Vorschläge in:

/** 
* 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; 
    } 
} 
+0

Perfekt für mich Prost – wired00

4

Eine native approch

function json_to_xml($obj){ 
    $str = ""; 
    if(is_null($obj)) 
    return "<null/>"; 
    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.= "<hash>"; 
     foreach($obj as $k=>$v) 
     $str.="<item key=\"$k\">".json_to_xml($v)."</item>".CRLF; 
     $str .= "</hash>"; 
    } else { 
     $str.= "<list>"; 
     foreach($obj as $v) 
     $str.="<item>".json_to_xml($v)."</item>".CRLF; 
     $str .= "</list>"; 
    } 
    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"); 
} 
+0

Schönes Skript, danke. – Zsolti

1

Eine weitere Möglichkeit, eine JSON streaming parser zu verwenden wäre sein könnte.

Die Verwendung eines Streamer-Parsers ist praktisch, wenn Sie das von PHP erstellte Zwischenobjektdiagramm umgehen möchten, wenn Sie json_decode verwenden. Zum Beispiel, wenn Sie ein großes JSON-Dokument und Speicher ist ein Problem, können Sie die XML mit XMLWriter direkt beim Lesen des Dokuments mit dem Streaming-Parser ausgeben.

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 Zuhörer würde die Listener interface implementieren müssen:

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 wird der Hörer die verschiedenen Ereignisse aus dem Parser empfangen, z.B. Wenn der Parser ein Objekt findet, sendet er die Daten an die Methode start_object(). Wenn es ein Array findet, löst es start_array() und so weiter aus. In diesen Methoden würden Sie dann die Werte an die entsprechenden Methoden in der XMLWriter, z. start_element() und so weiter.

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

Verwandte Themen