Webエンジニアの開発記

Webエンジニアの開発記録です。Java,SAStruts,jQuery,AmazonWebService,マッシュアップ。

はてなブログをDOM解析しようとしたら、SAXParseException。

あろうことか、本ブログをDOM解析しようとしたら、

SAXParseExceptionが発生してしまい、

DOMを構築できませんでした。

↓↓

f:id:tahkah0124:20131215215131j:plain

 

取得したレスポンスをInputStreamとして、

そのままDocumentBuilderのparseメソッドに渡しただけです。

 

エラーログは、

「要素タイプ"html"に関連付けられている属性名"itemscope"の後には、' = '文字が必要です。」

 

 当はてなブログのHTMLソースを見たところ、

下記の25行目のところ。

htmlタグに確かにitemscopeという属性があります。

f:id:tahkah0124:20131215220215j:plain

困りました。

 

考えた対策は2つ。

A:InputStreamを文字列化して、該当のitemscopeのところだけ削除する。

削除した後の文字列をDOM解析させる。

 

B:DOM解析エラーでも落ちないようなXMLパーサーを探す。

 

できればBが見つかって欲しいですね。

Aは根本的な対処じゃないので、この先解析しようとしたHTMLの構造に不備があると、

その都度対策をしていかないといけないわけで、それは時間がかかりますよ。

 

Bで適度に構造に不備があればスキップしてくれたり、

適当に回避してくれるようなパーサーがあればいいのですが。

 

ちょっとネットで探してみたところ、IBMさんが詳しい事書いていました。

XML の構文解析でのエラーを処理するこれ読んでBの方針で対策を考えてみます。

それにしてもはてなブログさん、いきなりやってくれましたね。

itemscopeって何の属性やねんっていう話もありますけど、

正しくはitemscope="itemscope"という記載が正だそうです。

 

itemscopoeとは、マイクロデータを含んだ要素である事を示す 属性値。

ですが、マイクロデータって何?以降は追わないことにしました。

 

似た様な記述の仕方に、checked="checked"ってcheckedだけでもええやん。

みたいな話もあります。

 

解析しようとしたXMLが構造不備の場合なんて、

全然ありますもんね。

 

そんなの逐一エスケープ処理みたいなことしていたら、

一生が終わってしまいますよ。

 

なんとかBの方針でいける方法が見つかって欲しい。