PHP のPEAR モジュール「XML_Unserializer」で、
XMLパースエラー
「No unserialized data available. Use XML_Unserializer::unserialize() first.」
が出る時があります。
このエラーに対しての、対応方法を紹介します。
最初に、「XML_Unserializer」とは何をするためのものか、簡単に説明します。
様々なWEBサービスで提供されているAPIを利用するときやRSSをいじりたいときなど、最近は少なからずXMLのデータ形式を扱うことがあります。
XMLそのままでは、PHPで使用しづらいので、そのデータを連想配列に変換する必要があります。
「XML_Unserializer」を使用すれば、PHPで簡単にXMLをパース(解析)して、連想配列に変換することが出来ます。
次にパースエラー「No unserialized data available. Use XML_Unserializer::unserialize() first.」が発生する理由ですが、いつもうまく行っているのに、突然エラーが出た時は、XML_Unserializerが処理できない文字コードがXMLの中に存在している場合が多いようです。
これは、XML側の問題で、ブラウザ(Chrome,Firefox)でXMLを直接開いても、エラー表示されエラー行もわかります。
その対処方法は、XMLデータを取得した後、その文字コードを変換または、除去してから、パースすることで解決します。
具体的には、次のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
require_once("XML/Unserializer.php"); $xml_res = file_get_contents ('hoge.xml'); // XMLを取得 $search = array( "\0", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\x0b", "\x0c", "\x0e", "\x0f" ); $xml_res = str_replace($search, '', $xml_res); // ASCII制御文字を取り除く $xml_res = mb_convert_encoding($xml_res, "UTF-8", "auto"); // UTF-8に強制エンコーディング $options = array( XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE => 'parseAttributes' ); $unserializer = new XML_Unserializer($options); $unserializer->unserialize($xml_res); $res = $unserializer->getUnserializedData(); |
3~7行目と、8行目が対応策で、どちらか一方、または、両方使用します。