まめ畑

ゆるゆると書いていきます

REXMLでパースが失敗したのでこうしてみた

いつもお世話になっているREXMLでXMLをパースしようとしたら、パースできないっす!っといって落ちるのではまった。

こんなエラーを出して落ちた。
/usr/lib/ruby/site_ruby/1.8/rexml/parsers/treeparser.rb:95:in `parse': # (REXML::ParseException)


エラーはこの箇所
REXML::Document.new(open("http://hoge/hogu"))

REXMLは内部でUTF-8を使用しているので、そのあたりかとおも思ったけど、パースしようとしてるXMLはもちろんUTF-8なわけで。
悪あがきで文字コードを変えて読込ませたりしたけどダメ。


で、さらに悪あがきで原因と思われる文字を消そうとしても何か上手くいかない。
ターンエイが原因と思われるんですが、上手く置換できないという自体に・・・。
なぜだ?


パースをしなきゃその先に進まないので、困ったところでひらめいた。
hpricotを使おう。

使ってみたら上手くいった。

こんな感じ。
xml = Hpricot(open("http://hoge/hogu"))

hpricotでXMLから要素を取り出すには


xml.search("root/hoge"){|contents|
piyo = contents.search("piyo").inner_text
}

こうする事で

<root>
   <hoge>
      <piyo>test</piyo>
   </hoge>
</root>

このXMLでtestが取り出せます。
hogeが複数あるなら、その分取れます。


うーん。こっちの方がREXMLを使うよりシンプルかな。
とりあえず今回はこの方法でいこう。