PHP xml json dönüştürmek için bir yolu var mı? Ben json ile xml çok mümkün olduğunu biliyoruz.
Eğer XML Serializer ARMUT gelen, bir PHP nesne ve iki kolay adımda XML sonra PHP nesnesine JSON dönüştürebilirsiniz kullanmaya istekli değilseniz:
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;
}
}
Bu gibi bakmak XML nasıl tam olarak istediğiniz bağlıdır. I bir arada çalışacaktı json_decode()
and the 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>';
(Denenmemiş kodu - ama fikir olsun)
Ben daha önceki iki öneri birleştirilebilir:
/**
* 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;
}
}
Bir yerli approch olabilir
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");
}
Başka bir seçenek, bir JSON streaming parser kullanmak olacaktır.
Eğer json_decode
kullanırken PHP tarafından oluşturulan ara nesne grafiği atlamak istiyorsanız bir flama ayrıştırıcı kullanarak kullanışlı gelirdi. Eğer var Örneğin, bir büyük JSON belge ve bellek bir konudur, yaparsın çıkış ile XML XMLWriter
a> akış ayrıştırıcı belgeyi okurken doğrudan ederken.
Bir örnek https://github.com/salsify/jsonstreamingparser olur
$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 Dinleyici uygulamak gerekir 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);
}
Çalışma zamanında, dinleyici, çözümleyici, örneğin çeşitli etkinlikler alacak ayrıştırıcı bir nesne bulduğunda, start_object()
yöntemine veri gönderir. Bir dizi bulduğunda, böylece start_array()
tetikleyecektir ve. Bu yöntemlerde sonra XMLWriter
, örneğin uygun yöntemlere değerleri temsilci ediyorum start_element()
a> vb.
Disclaimer: Ben yazar ile bağlı değilim, ne de ben daha önce aracı kullanmış. API bir olay bazlı JSON ayrıştırıcı nasıl kullanılacağını göstermek için yeterince basit görünüyordu, çünkü ben bu kütüphaneyi aldı.