有什么办法可以在PHP中将json转换为xml?

有什么办法可以在PHP中将json转换为xml? 我知道xml到json的可能性很大。

il_raffa asked 2020-08-12T04:00:42Z
6个解决方案
26 votes

如果您愿意使用PEAR的XML Serializer,则可以通过两个简单的步骤将JSON转换为PHP对象,然后将PHP对象转换为XML:

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;
    }
}
Samir Talwar answered 2020-08-12T04:00:48Z
11 votes

这取决于您希望XML看起来如何。 我会尝试将PEAR::XML_SerializerPEAR::XML_Serializer结合使用(更多信息和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>';

(未经测试的代码-但您知道了)

Tomalak answered 2020-08-12T04:01:12Z
8 votes

使用json_decode破解JSON,然后遍历它以生成所需的XML。

如果您想知道,JSON和XML之间没有规范的映射,因此您必须根据应用程序的需要自己编写XML生成的代码。

Marcelo Cantos answered 2020-08-12T04:01:37Z
5 votes

我将前面的两个建议合并为:

/**
 * 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;
    }
}
spiky answered 2020-08-12T04:01:58Z
3 votes

本机方法可能是

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");
}
131 answered 2020-08-12T04:02:18Z
1 votes

另一个选择是使用JSON流解析器。

如果要在使用json_decode时绕过PHP创建的中间对象图,则使用流式分析器将很方便。例如,当您有一个大型JSON文档并且存在内存问题时,可以在读取时直接使用start_element()输出XML 带流解析器的文档。

一个例子是[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;
}

JSON2XML侦听器将需要实现侦听器接口:

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

在运行时,侦听器将从解析器接收各种事件,例如 解析器找到对象后,它将把数据发送到start_element()方法。 找到数组时,将触发start_array(),依此类推。 在这些方法中,您可以将值委托给XMLWriter中的相应方法,例如 start_element()等。

免责声明:我不隶属于作者,也从未使用过该工具。 我之所以选择这个库是因为该API看起来足够简单,可以说明如何使用基于事件的JSON解析器。

Gordon answered 2020-08-12T04:03:02Z
translate from https://stackoverflow.com:/questions/856833/is-there-any-way-to-convert-json-to-xml-in-php