質問: REXML::Document.new(file) end puts REXML::XPath.match(doc, "/本棚/本") ``` 以下のように返ってきます。 ``` #<本棚> # <本> # # 本> # <本> # bbb1 # bbb2 # eeee1 # ffff1 # bbb3 # ccc1 # 本> # <本> # bbb4 # bbb5 # 本> #本棚> ``` 理想は以下のように返ってきて欲しいです。 ``` #<本> # #本> #<本> # bbb1 # bbb2 # eeee1 # ffff1 # bbb3 # ccc1 #本> #<本> # bbb4 # bbb5 #本> ``` XMLファイル自体の文字コードはUTF-8です。 どのようにしたら希望通りにパースされた結果を得ることができるでしょうか?
回答: nokogiriでもよろしければ ``` require 'nokogiri' doc = nil File.open("example.xml") do |file| doc = Nokogiri::XML(file) end puts doc.xpath("/本棚/本") ``` で、以下の様に取得できました。 ``` <本> 本> <本> bbb1 bbb2 eeee1 ffff1 bbb3 ccc1 本> <本> bbb4 bbb5 本> ``` 以下の環境で確認しました * windows 7 + ruby 2.1.4 + nokogiri 1.6.5 * Ubuntu 14.04 + ruby 2.1.5 + nokogiri 1.6.5 ( ruby2.1-dev, libxml2, libxml2-dev, libxslt1.1, libxslt1-dev ) 補足の追記: いきなりnokogoriを提案した形になってしまったので少し補足します。 ubuntuやwindows上でもREXMLでは"/本棚/本"が "/本棚" と同じ動きになっていました。 また、"/山/川"などとしても同様に"/山"と同じ様な動作でしたのでnokogiriで試してみたら上手くいったので提案しました。 ruby 1.8をつかって日本語でも正しく区切られるようなページを見かけていたため、先ほど気になって試してみましたが、windows環境でrubyinstallerからruby 1.8.7を入れて質問のrexmlで"/本棚/本"のソースそのままで試したところ以下の様に取得されました。 ※ 1.8.7でコマンドプロンプト上で実行するとコマンドプロンプトがutf8をプリントできずに`本`が`<譛ャ>`と化けてしまいますが、ファイルにリダイレクトすればutf8の文字コードで以下の内容になっています。 ``` <本> 本> <本> bbb1 bbb2 eeee1 ffff1 bbb3 ccc1 本> <本> bbb4 bbb5 本> ``` 問題は Win/Linuxどちらでも起きているので、rubyかREXMLかどちらかのバージョンの問題と思われます。