2009-05-13 7 views
40

jsonをPHPのxmlに変換する方法はありますか?私はjsonへのXMLが非常に可能であることを知っています。jsonをPHPでxmlに変換する方法はありますか?

+0

さらに重要なこと:なぜあなたはそれをやりたいのですか? – NikiC

+1

'$ xml =" "!"; '(愚かな質問...) – salathe

+0

Zend Frameworkは非常にうまく動作しています[コンポーネント](http://framework.zend.com /manual/en/zend.json.xml2json.html)を参照してください。 – markus

答えて

11

これは、XMLをどのように表示したいかによって異なります。 json_decode()PEAR::XML_Serializermore 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>'; 

(未テストコード - しかし、あなたのアイデアを得る)

+0

AckのようなJSONにはまだ存在しない多くの機能があります。私はとにかく私のままにしておきます - それはやや異なるアプローチです。 –

25

あなたがPEARからXML Serializerを使用するために喜んでいる場合は、中にXMLにPHPオブジェクトとその後、PHPオブジェクトにJSONに変換することができます2つの簡単な手順:

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

亀裂がjson_decodeでJSONを開いて、あなたが好きなXMLを生成し、それを通過します。

あなたが疑問に思っている場合は、JSONとXMLの間に標準的なマッピングがないため、アプリケーションのニーズに応じてXML生成コードを自分で記述する必要があります。

5

私はに2つの以前の提案を組み合わせる:

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

私にとって完璧です。乾杯。 – wired00

4

ネイティブapprochは別のオプションは、JSON streaming parserを使用することです

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

素敵なスクリプト、ありがとう。 – Zsolti

1

かもしれません。

json_decodeを使用しているときにPHPで作成された中間オブジェクトグラフをバイパスしたい場合は、ストリーマパーサーを使用すると便利です。たとえば、大きなJSONドキュメントを取得してメモリが問題になった場合、ストリーミングパーサーを使用してドキュメントを読み取っているときにXMLWriterというXMLを直接出力できます。

一例はJSON2XMLリスナーがListener interfaceを実装する必要があります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; 
} 

次のようになります。

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()など。

免責事項:私は著者と提携しておらず、以前にこのツールを使用したこともありません。私はこのライブラリを選んだので、イベントベースのJSONパーサーの使い方を説明するのにAPIが十分に簡単に見えたからです。

関連する問題