XMLからJSON形式への変換メモ(PHP)

  • 38
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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だとパース時に落ちます。