2014-11-17 2 views
3

Прежде чем я начну, я знаю, что есть несколько вопросов, подобных этому, но поверьте мне, я прочитал все, если не большинство из них. Я попробовал кучу решений, но никто из них, похоже, не работает. В результате я получаю пустое «дерево». Вот код, который я использую.Как преобразовать jSON в XML

$jSON = json_decode('array here'); 

function array2xml($array, $xml = false){ 
if($xml === false){ 
    $xml = new SimpleXMLElement('<result/>'); 
} 

foreach($array as $key => $value){ 
    if(is_array($value)){ 
     array2xml($value, $xml->addChild($key)); 
    } else { 
     $xml->addChild($key, $value); 
    } 
} 

return $xml->asXML(); 
} 

Это массив jSON, который я использую.

http://pastebin.com/pN3QwSHU

Я не знаю, почему он не работает. Вот результат, когда я использую эту функцию.

<result> 
<generated_in>155ms</generated_in> 
</result> 

ответ

9

Вместо того, чтобы кормить вашу функцию объекта, попробуйте кормить массив вместо:

$jSON = json_decode($raw_data, true); 
          //^add second parameter flag `true` 

Пример:

function array2xml($array, $xml = false){ 

    if($xml === false){ 
     $xml = new SimpleXMLElement('<result/>'); 
    } 

    foreach($array as $key => $value){ 
     if(is_array($value)){ 
      array2xml($value, $xml->addChild($key)); 
     } else { 
      $xml->addChild($key, $value); 
     } 
    } 

    return $xml->asXML(); 
} 

$raw_data = file_get_contents('http://pastebin.com/raw.php?i=pN3QwSHU'); 
$jSON = json_decode($raw_data, true); 

$xml = array2xml($jSON, false); 

echo '<pre>'; 
print_r($xml); 

Sample Output

+1

Есть ли способ, которым я могу отформатировать их как деревья или узлы? Я попробовал 'header ('Content-type: text/xml');', но он по-прежнему выглядит относительно одинаковым. – Criesval

+0

@Kreightive, что вы имеете в виду отформатировать их как деревья? как правильно отформатирован с вкладками? я не думаю, что вы можете превзойти его через простой xml – Ghost

+0

Да, точно @Ghost. Есть ли способ, которым я могу? – Criesval

1

Это действительно не так уж сложно чтобы сделать, у меня была аналогичная проблема, и я просто решил ее, выполнив следующее: подумал, что я поделюсь ею на всякий случай кто-то еще пытался это сделать. Это делается очень просто.

protected function display($result) { 
     if (empty($this->output_type) || strtolower($this->output_type) == "json") { 
      header('Content-type: application/json'); 
      echo json_encode($result); 
     } else if (strtolower($this->output_type) == "xml") { 
      header('Content-type: application/xml'); 
      echo '<?xml version="1.0"?>'; 
      echo "<result>"; 
      $xml_array = json_decode(json_encode($result), true); 
      $this->xmlWalker($xml_array, "start"); 
      echo "</result>"; 
     } else { //catch all why not 
      header('Content-type: application/json'); 
      echo json_encode($result); 
     } 
    } 

    protected function xmlWalker($xml_array, $parent) { 
     foreach($xml_array as $tag => $value) { 
      if ((int)$tag === $tag) { 
       $tag = mb_substr($parent, 0, -1); 
      } 
      echo "<" .$tag. ">"; 
      if (is_array($value)) { 
       $this->xmlWalker($value, $tag); 
      } else { 
       echo $value; 
      } 
      echo "</" .$tag. ">"; 
     } 
    } 

Я надеюсь, что это помогает

1

У меня были проблемы с числовыми метками с помощью Ghost Solution. Я должен был изменен его немного, чтобы удалить числовые метки (просто добавив п до):

function array2xml($array, $xml = false){ 

    if($xml === false){ 
     $xml = new SimpleXMLElement('<result/>'); 
    } 

    foreach($array as $key => $value){ 
     if(is_array($value)){ 
      array2xml($value, $xml->addChild(is_numeric((string) $key)?("n".$key):$key)); 
     } else { 
      $xml->addChild(is_numeric((string) $key)?("n".$key):$key, $value); 
     } 
    } 

    return $xml->asXML(); 
} 

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

function array2xml($array, $parentkey="", $xml = false){ 

    if($xml === false){ 
     $xml = new SimpleXMLElement('<result/>'); 
    } 

    foreach($array as $key => $value){ 
     if(is_array($value)){ 
      array2xml($value, is_numeric((string) $key)?("n".$key):$key, $xml->addChild(is_numeric((string) $key)?$parentkey:$key)); 
     } else { 
      $xml->addAttribute(is_numeric((string) $key)?("n".$key):$key, $value); 
     } 
    } 

    return $xml->asXML(); 
} 

изменяющемся вызов

$xml = array2xml($jSON, "", false); 

При этом вы получите более естественный вывод XML с использованием атрибутов и имеющие узлы с таким же именем.

-1

Встроенные функции могут это сделать.

$xml = new SimpleXMLElement('<root/>'); 
$arr = json_decode($your_array, true); 
array_walk_recursive($arr, array ($xml,'addChild')); 
Смежные вопросы