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内のホットペッパー辺りの文に変なワードがありそうな気配なのですが・・・。

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

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

回答の条件
  • 1人3回まで
  • 登録:2007/05/31 04:39:44
  • 終了:2007/05/31 08:53:50

ベストアンサー

id:jack_sonic No.1

じゃっくそにっく回答回数123ベストアンサー獲得回数252007/05/31 06:44:06

ポイント100pt

こんにちは。

問題の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>
id:onigirin

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

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

無事表示されました!

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

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

simplexml_load_fileを使わずに

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

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

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

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

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

2007/05/31 07:37:15

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません