#XMLからJSON形式への変換メモ(PHP)
つまづきどころのメモ。
基本形
$obj = simplexml_load_string($xml);
$json = json_encode($obj);
直では変換できないので一旦Objectに直してからjson_encodeする。
CDATAがある場合
そのままでは変換時に値が入らないので、simplexml_load_string
にオプションを指定する
$obj = simplexml_load_string($xml, NULL, LIBXML_NOCDATA);
$json = json_encode($obj);
文字コード
simplexml_load_string
を使う場合、
XMLの最初の宣言と中の文字コードが一致している必要がある。
対応していない文字コードの場合、mb_convert_encoding
でUTF-8に一旦変換しておき、
XMLのヘッダーを
<?xml version="1.0" encoding="UTF-8" ?>
に無理やり置き換えて読ませる(苦肉の策)
XML → JSONの罠
XMLとJSONは100% 1対1で対応可能なフォーマットではないので、
変換時にトラブルが時々起こります。
要素数1の配列
<items>
<item>Hoge</item>
</items>
と
<items>
<item>Hoge</item>
<item>Fuga</item>
</items>
では要素数が違うだけでほぼ同じXMLです。
しかし、これをJSONに変換すると
{"item":"Hoge"}
と
{"item":["Hoge","Fuga"]}
のようになります。
このJSONからHogeを取り出そうとすると、
要素数1の場合は $data["item"]
ですが、
要素数2以上の場合 $data[0]["item"]
になってしまいます。
要素数に応じて配列が現れたりするので注意しましょう。
特に配列だと思っていた時に、返ってくる要素が1だとパース時に落ちます。