2009-05-13 6 views
40

est-il un moyen de convertir json en XML en PHP? Je sais que XML à JSON est très possible.Existe-t-il un moyen de convertir json en XML en PHP?

+0

Et encore plus important: Pourquoi voudriez-vous jamais faire cela? – NikiC

+1

'$ xml =" ";' (Poser une question idiote ...) – salathe

+0

Le Zend Framework a un très bon fonctionnement [component] (http://framework.zend.com /manual/en/zend.json.xml2json.html) pour cela. – markus

Répondre

11

Cela dépend de la façon dont vous voulez que votre XML ressemble exactement. Je voudrais essayer une combinaison de json_decode() et le PEAR::XML_Serializer (more info and examples on 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 '<pre>'; 
echo htmlspecialchars($Serializer->getSerializedData()); 
echo '</pre>'; 

(code non testé - mais vous voyez l'idée)

+0

Ack, vous me battre par une demi-minute.Je vais laisser le mien de toute façon - c'est une approche légèrement différente. –

25

Si vous êtes prêt à utiliser le XML Serializer de PEAR, vous pouvez convertir le JSON à un objet PHP puis l'objet PHP XML deux étapes faciles:

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

Crack ouvrir le JSON avec json_decode, et parcourir pour générer tout XML que vous voulez. Dans le cas où vous vous poseriez la question, il n'y a pas de correspondance canonique entre JSON et XML, vous devez donc écrire le code de génération XML vous-même, en fonction des besoins de votre application.

5

je combine les deux suggestions précédentes dans:

/** 
* 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

Parfait pour moi Cheers – wired00

4

Une approch native peut être

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

Beau script, merci. – Zsolti

1

Une autre option serait d'utiliser un JSON streaming parser. L'utilisation d'un analyseur de flux est pratique si vous souhaitez ignorer le graphique d'objet intermédiaire créé par PHP lors de l'utilisation de json_decode. Par exemple, lorsque vous avez un grand document JSON et que la mémoire est un problème, vous pouvez sortir le XML avec XMLWriter directement lors de la lecture du document avec l'analyseur de flux.

Un exemple serait 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; 
} 

Le JSON2XML Listener aurait besoin de mettre en œuvre le Listener interface:

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

Lors de l'exécution, l'auditeur recevra les différents événements de l'analyseur, par exemple Lorsque l'analyseur trouve un objet, il envoie les données à la méthode start_object(). Quand il trouve un tableau, il déclenchera start_array() et ainsi de suite. Dans ces méthodes, vous devez ensuite déléguer les valeurs aux méthodes appropriées dans XMLWriter, par ex. start_element() et ainsi de suite.

Clause de non-responsabilité: Je ne suis pas affilié à l'auteur, et je n'ai jamais utilisé l'outil auparavant. J'ai choisi cette bibliothèque parce que l'API semblait suffisamment simple pour illustrer comment utiliser un analyseur JSON basé sur un événement.

Questions connexes