phpでjson2xml

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のインストールが必要になりました。

Leave a Reply

Your email address will not be published. Required fields are marked *