String could not be parsed as XMLの原因

String could not be parsed as XMLと怒られる件について。
対策、間違ってました。


他の可能性を考えることは大事ですね。反省。




原因は、突如含まれる制御コード(垂直タブ)でした。


当該記事では

htmlソースのせいだ!
確かにこのhtml、この1ファイルだけ(テキストのみ)で250KB弱あります。


どおりで私のロースペックマシンでは画面が重いわけです。
この量のhtmlをxmlに変換しようとしてこけるから上記エラーなわけですね。


と判断しました。


しかし、他の可能性を考えましょう。
一定の件数を超えるとなぜかString could not be parsed as XMLがでるのであれば、その「超えた件数に位置する対象(htmlソースの箇所)」に問題があるからかもしれません。


量のせいであれば、その手前の1件を削って「超えた件数に位置する対象」を加えても同じ症状がでるでしょうか。


仮説をたてたら(仮説にすぎないのであれば)、検証しないといけませんよね……動いただけで喜んじゃいけませんよね。

気付いたのは、対象を1件にしてもString could not be parsed as XMLがでる項目があったためです。
明らかにこの項目に何か問題がある……。


ページのソースをざっと見ている限りは気付きませんでした。
しかし目を皿のようにして見ると、文末にKという文字があってなぜか白黒に反転しています。


なんぞ?と思って調べてみたところ、制御コードを秀丸が代替表示してくれているようです。
秀丸で表示されるKの白黒反転は、垂直タブでした


調べてみたところ、全部、制御コードでString could not be parsed as XMLがでていたことがわかりました。
省いたら動きましたから。


String could not be parsed as XML……対策法がネットに全く見あたらなかったので、この段階で気付いてよかったですよ。
検索するとたくさんヒットするんですけど、ほぼ全て、実際にエラーが出ているページばかりがヒットするんだもの(笑)


HTMLScrapingを使う際には気をつけましょう!
(というか標準で組み込んじゃった方が安全かな?)


【2010/01/20追記】
またはまりました。
String could not be parsed as XMLでぐぐったら自分のページがヒットして、あー以前もこれに悩まされたと思い出したのでした(書いておいてよかった)

ECと書かれている制御文字はEscapeだったようです。
特定できれば、XMLオブジェクトとして取り込む前に置換かけられますね


対処法

1.秀丸に該当箇所をコピペする
2.秀丸の「その他」→「制御コード入力」
3.表示されたウィンドウで下から順にコードを入力(コピペした文字と一致するまで試す)
4.HTMLScraping classを使っている場合には「Remove BOM and NULLs」の段落に、で特定した制御コードをstr_replaceやpreg_replace削除する指示を書く