質問: simplexml_load_file()関数で、 を取得すると、 445: parser error : PCDATA invalid Char value 11 in .... というエラーWarningが発生します。 最後の &sort=count を外すと、正常にパースできます。 調べてみてもよくわからず、 XML内のホットペッパー辺りの文に変なワードがありそうな気配なのですが・・・。 うまく解決できずに困っています。 解決策やエラー対策に心当たりがありましたら、アドバイスお願いします。
回答: こんにちは。 #### 問題のRSS(2007/05/31時点)について 問題のRSSをこちらでチェックしたところ、「。」と「多」の間に、エラーを発生させる文字が入っていました。 一度ローカルに保存し、秀丸などのUTF-8編集可能なエディタで見るとわかります。 #### simplexml_load_file()エラー処理の基本手順 simplexml_load_file()でうまく動かないときなど、 何かエラー対策をしなければならないときは、 1. file_get_contents(url)関数で、参照先の内容を一旦文字列に取り込む。 2. 取り込んだ文字列を、preg_replace()やmb_convert_encoding()など必要なものを使い、エラーが出ないように手を加える。 3. simplexml_load_string()で、処理した文字列をxmlに読み込む。 という手順をとります。 今回の不正な文字を除去するソースを書きました。 simplexmlがUTF-8を扱うので、UTF-8です。 文字コードの関係でコピペでは問題がおきるかもしれないので、 念のためファイルをこちらのページの添付ファイルにアップしました。(readRss.zip) PHP/XMLデータの取得と設定 - 情報処理研究所 ジャックズラボ(jack's Lab) ##### ソース: UTF-8, simplexmlライブラリが使える環境で動作 ``` $target\n\n"; // 一度文字列にバッファする(読み込む) $contents = file_get_contents($target); // 文字コード変換用 mb_language("Japanese");//一応 mb_internal_encoding("EUC-JP");//mb_convert_kana使用時に必要 mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS");//mb_detect_encoding使用時に必要 // エンコードを取得 $targetEnc = mb_detect_encoding($contents); // エンコードが違う場合は合わせる if ( $targetEnc != $baseEnc ) { $contents = mb_convert_encoding($contents, $baseEnc, $targetEnc); } // ■問題の不正文字コードの除去 // // 不正文字コードの除去 方式 1: 方式2がだめなときに使ってください // $contents = preg_replace("/。(.*?)多/", "。多", $contents); // 問題が起きる文字コードの除去 方式 2 // preg_replaceで文字コード除去(デフォルトでグローバル) $contents = preg_replace("//", "", $contents); // xmlに読み込む $xml = simplexml_load_string($contents); echo "-- 読み込んだデータのダンプ出力-------------\n"; // ダンプ出力 (UTF-8で出力されます) var_dump($xml); ?> ```