2009-05-13 74 views
40

¿hay alguna forma de convertir json a xml en PHP? Sé que xml to json es muy posible.¿Hay alguna forma de convertir json a xml en PHP?

+0

Y aún más importante: ¿Por qué querrías hacer eso alguna vez? – NikiC

+1

'$ xml =" ";' (Haga una pregunta tonta ...) – salathe

+0

El Zend Framework tiene un [componente] que funciona muy bien (http://framework.zend.com /manual/en/zend.json.xml2json.html) para esto. – markus

Respuesta

11

Depende de cómo exactamente quiere que se vea XML. Intentaría una combinación de json_decode() y 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>'; 

(código no probado - pero se entiende la idea)

+0

Ack, ya me ganaron por medio minuto.Dejaré el mío de todos modos, es un enfoque ligeramente diferente. –

25

Si usted está dispuesto a utilizar el XML Serializer de PERA, puede convertir el JSON a un objeto PHP y entonces el objeto a XML en PHP dos sencillos pasos:

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

abrir una grieta en el JSON con json_decode, y lo atraviesan para generar XML lo desea.

En caso de que se lo pregunte, no existe un mapeo canónico entre JSON y XML, por lo que debe escribir el código de generación de XML usted mismo, según las necesidades de su aplicación.

5

que combinan las dos sugerencias anteriores en:

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

Perfecto para mí Cheers – wired00

4

Un approch nativa podría ser

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

Buen guión, gracias. – Zsolti

1

Otra opción sería utilizar un JSON streaming parser.

Usar un analizador streamer sería útil si desea omitir el gráfico de objeto intermedio creado por PHP al usar json_decode. Por ejemplo, cuando tiene un documento JSON grande y la memoria es un problema, puede generar el XML con XMLWriter directamente mientras lee el documento con el analizador de transmisión.

Un ejemplo sería 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; 
} 

El JSON2XML oyente tendría que poner en práctica el 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); 
} 

En tiempo de ejecución, el oyente recibirá los diversos eventos del analizador, por ejemplo, cuando el analizador encuentra un objeto, enviará los datos al método start_object(). Cuando encuentre una matriz, activará start_array() y así sucesivamente. En esos métodos, debe delegar los valores a los métodos apropiados en el XMLWriter, p. start_element() y así sucesivamente.

Descargo de responsabilidad: No estoy afiliado con el autor, ni he usado la herramienta antes. Escogí esta biblioteca porque la API parecía lo suficientemente simple como para ilustrar cómo usar un analizador JSON basado en eventos.

Cuestiones relacionadas