Existe alguma maneira de converter json para xml em PHP?

Existe alguma maneira de converter json para xml em PHP ? Eu sei que xml para json é muito possível.

Se você estiver disposto a usar o XML Serializer da PEAR, poderá converter o JSON em um object PHP e, em seguida, o object PHP em XML em duas etapas fáceis:

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

Depende de como exatamente você quer que o XML se pareça. Eu tentaria uma combinação de json_decode() e o PEAR::XML_Serializer ( mais informações e exemplos em 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 '

';

(Código não testado – mas você entendeu)

Crack abrir o JSON com json_decode e atravessá-lo para gerar o XML que você quiser.

Caso você esteja se perguntando, não há mapeamento canônico entre JSON e XML, portanto, você mesmo precisa escrever o código de geração de XML, com base nas necessidades de seu aplicativo.

Eu combinei as duas sugestões anteriores em:

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

Uma aproximação nativa pode ser

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

Outra opção seria usar um analisador de streaming JSON .

Usar um analisador de streamer seria útil se você quiser ignorar o gráfico de object intermediário criado pelo PHP ao usar o json_decode . Por exemplo, quando você tem um documento JSON grande e a memory é um problema, você pode enviar o XML com o XMLWriter diretamente ao ler o documento com o analisador de stream contínuo.

Um exemplo seria 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; } 

O JSON2XML Listener precisaria implementar a interface do Listener :

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

No tempo de execução, o ouvinte receberá os vários events do analisador, por exemplo, quando o analisador localizar um object, ele enviará os dados para o método start_object() . Quando encontrar um array, ele acionará start_array() e assim por diante. Nesses methods, você delegará os valores aos methods apropriados no XMLWriter , por exemplo, start_element() e assim por diante.

Disclaimer: Eu não sou afiliado com o autor, nem usei a ferramenta antes. Eu escolhi essa biblioteca porque a API parecia suficientemente simples para ilustrar como usar um analisador JSON baseado em evento.