人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

simplexml_load_file()関数で、

http://b.hatena.ne.jp/keyword/web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9?mode=rss&sort=count

を取得すると、

445: parser error : PCDATA invalid Char value 11 in ....

というエラーWarningが発生します。

最後の
&sort=count
を外すと、正常にパースできます。

調べてみてもよくわからず、
XML内のホットペッパー辺りの文に変なワードがありそうな気配なのですが・・・。

うまく解決できずに困っています。

解決策やエラー対策に心当たりがありましたら、アドバイスお願いします。

●質問者: onigirin
●カテゴリ:ウェブ制作
✍キーワード:Char Warning XML アドバイス エラー
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● じゃっくそにっく
●100ポイント ベストアンサー

こんにちは。

問題の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ライブラリが使える環境で動作
<html><head><meta http-equiv="Content-type" content="text/html; charset=UTF-8" >
</head><body>
<?php

$baseEnc = "UTF-8";// simplexmlがあつかう文字コード形式 = UTF-8
// RSS
$target = 'http://b.hatena.ne.jp/keyword/web%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9?mode=rss&amp;sort=count';

echo "読み込むアドレス : <a href=$target>$target</a><br>\n<br>\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 "-- 読み込んだデータのダンプ出力-------------<br>\n";
// ダンプ出力 (UTF-8で出力されます)
var_dump($xml);
?>
</body></html>
◎質問者からの返答

どうもありがとうございます。

早速頂いたコードを関数にして使ってみたところ・・・。

無事表示されました!

にっくき をなんとか退治できました!

結局うまく場合わけできなかったので、

simplexml_load_fileを使わずに

今回頂いたコードで全てパースすることにしました。

今後エラーが出たら、文字を追加していけば対応できるみたいですね。

大規模なサービスだと、こういうのも全て除去していくのが大変そうですねぇ・・・。

最近の悩みがようやく解消しました!

どうもありがとうございます!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ