数値文字参照の変換

親切なのか?お節介なのか?環境の問題(libxml-ruby/iconv?)か?
XML::Document#find(xpath).each で返されるXML::Nodeオブジェクトから
XML::Node#find(xpath)でNodeの値(CDATA)を取得すると、数値文字参照(&#x30AZ等)で取得できてしまう。

これをStringオブジェクトとして操作しようとすると・・・
当然操作できす。

よって、下のおまじないw

xpath = "/root/data[@hoge=\"hoge\" and @moge=\"moge\"]"

doc.find(xpath).each{|data|
    text = data.find("./data/text()").to_s

    # ここがおまじない↓
    text = text.gsub(/&#(?:(\d*?)|(?:[xX]([0-9a-fA-F]{4})));/) { [$1.nil? ? $2.to_i(16) : $1.to_i].pack('U') }
}

はてなダイアリーで見つけたんですがね。。。