Есть ли способ преобразовать JSON в XML в PHP? - PullRequest
42 голосов
/ 13 мая 2009

Есть ли способ конвертировать json в xml в PHP? Я знаю, что XML для JSON очень возможно.

Ответы [ 6 ]

26 голосов
/ 13 мая 2009

Если вы хотите использовать XML Serializer из PEAR, вы можете преобразовать 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;
    }
}
11 голосов
/ 13 мая 2009

Это зависит от того, как именно вы хотите, чтобы XML выглядел. Я бы попробовал комбинацию json_decode() и PEAR::XML_Serializer ( больше информации и примеров на sitepoint.com ).

<code>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 '
';

(непроверенный код - но вы поняли)

8 голосов
/ 03 декабря 2010

Взломайте JSON с помощью json_decode и просмотрите его, чтобы сгенерировать любой желаемый XML.

Если вам интересно, между JSON и XML нет канонического отображения, поэтому вы должны сами написать код генерации XML, исходя из потребностей вашего приложения.

5 голосов
/ 01 февраля 2011

Я объединил два предыдущих предложения в:

/**
 * 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;
    }
}
3 голосов
/ 03 сентября 2012

Собственный подход может быть

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");
}
1 голос
/ 08 июля 2013

Другой вариант - использовать потоковый анализатор JSON .

Использование парсера стримеров будет полезно, если вы хотите обойти граф промежуточных объектов, созданный PHP при использовании json_decode. Например, когда вы получили большой JSON-документ и проблема с памятью, вы можете вывести XML с XMLWriter напрямую во время чтения документа с помощью потокового анализатора.

Один пример будет 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 Listener потребуется реализовать интерфейс 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);
}

Во время выполнения слушатель будет получать различные события от анализатора, например, когда анализатор находит объект, он отправляет данные в метод start_object(). Когда он находит массив, он запускает start_array() и так далее. В этих методах вы затем делегировали бы значения соответствующим методам в XMLWriter, например, start_element() и т. Д.

Отказ от ответственности: Я не связан с автором, и я не использовал инструмент раньше. Я выбрал эту библиотеку, потому что API выглядел достаточно простым, чтобы проиллюстрировать, как использовать анализатор JSON на основе событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...