phpでjsonからxmlに変換したかったのですが、何故かちょっと調べた感じで出てこなかったので書いてみました。でもJSONの仕様をあんまり把握してないので、間違ってたらすいません。
< ?php require_once('XML/Util.php'); /** * @param $obj 変換する連想配列 * @param $root 補完するルートタグ * @param $encoding 出力するXMLのエンコーディング * @return DOMオブジェクト */ function json2xml($obj, $root=null, $encoding="") { $body = $root ? _tag($root, _json2xml($obj, $encoding)) : _json2xml($obj, $encoding); $dom = DomDocument::loadXML($body); if ($encoding) $dom->encoding = $encoding; return $dom; } function _json2xml($obj, $encoding="") { $result = ""; while (list($key, $val) = each($obj)) { $tagName = preg_match('/^\d+$/', $key) ? 'array_item' : $key; switch (gettype($val)) { case "object": case "array": $result .= _tag($tagName, _json2xml($val, $encoding)); break; default: # $result .= _tag($tagName, htmlentities($val, ENT_QUOTES, $encoding)); $result .= _tag($tagName, XML_Util::replaceEntities($val)); break; } } return $result; } function _tag($name, $value) { return "< $name>$value < /$name>"; } ?>
使い方はこんな感じでしょうか。
jsonっていうか、連想配列がxmlになるのは良いですね。
< ?php require_once('json2xml.php'); $obj = array( "name" => "taichino ", "yomi" => "たいちーの", "age" => 25, "skill" => array( "php" => 4, "perl" => 3, "python" => 1), "favorite" => array("carbon emacs", "tramp", "cent os") ); $dom = json2xml($obj, 'root', "utf-8"); $dom->formatOutput = true; echo $dom->saveXML(); ?>
[追記]2009/06/24
encodeの受け渡しが出来ておらず、日本語を上手く処理できてなかったので、修正しました。本文修正済みです。
[追記]2009/06/29
文字参照の置換にhtmlentitiesを使用していましたが、標準でDomDocumentが対応していない文字まで置換されて、その結果エラーが発生していましたので、XML_Util::replaceEntitiesを用いた置換に修正しました。本文修正済みです。コメント化して元のコードは残してあります。修正に伴い、pearパッケージのXML_Utilのインストールが必要になりました。




