XMLパースエラー「No unserialized data available. Use XML_Unserializer ::unserialize() first.」が出た時。

PHP のPEAR モジュール「XML_Unserializer」で、
XMLパースエラー
「No unserialized data available. Use XML_Unserializer::unserialize() first.」
が出る時があります。
このエラーに対しての、対応方法を紹介します。

XML to PHP

最初に、「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データを取得した後、その文字コードを変換または、除去してから、パースすることで解決します。
具体的には、次のようにします。

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行目が対応策で、どちらか一方、または、両方使用します。

  • 人気ブログランキングへ
  • FC2ランキングへ
  • ブログランキング・にほんブログ村へ
  • おきてがみ

関連記事

カテゴリー:PHP
タグ: , ,

コメントを残す