Libxml-Rubyを使ってみる

コメントにて,id:Hexaさんに教えてもらったLibxml-Ruby.標準添付ではないので,gemでインストールしました.
そもそもlibxmlってのはCで書かれたXMLパーサ&ツールキットで,Gnomeプロジェクトで開発されたものだそうです.で,Libxml-Rubyはそのlibxml2をRubyから使おうぜって言うライブラリ.
libxml2はMac OS Xに最初っから入っているようなので,気にしないで良いみたい.
ただ,日本語が化けるのね,このヤロー.なんか,Tidyつかった時みたいな化け方(わかりにくい).
そう思って色々ググってみて,libiconvがマルチバイト回りに一枚噛んでるみたいだけど,ちゃんと入ってるしなぁ.怪しい.

どの程度の文字化けか

使用するxmlファイルは,最近課題で作ったヤツ*1

<?xml version="1.0" encoding="UTF-8"?>
<gl:goodslist xmlns:gl="http://www.example.com/goodslist">
  <gl:goods>
    <gl:name>坊ちゃん</gl:name>
    <gl:price>1050</gl:price>
    <gl:duedate>2006-10-15</gl:duedate>
  </gl:goods>
  <gl:goods>
    <gl:name>人間失格</gl:name>
    <gl:price>300</gl:price>
    <gl:duedate>2006-10-19</gl:duedate>
  </gl:goods>
</gl:goodslist>

さて,ここで一度確認しておきたいんだけど,libxmlのEncodings supportを見た感じではUTF-8準拠っぽいので,これは文字化けを気にせずにパースされるべきXMLである.
とりあえず読み込んでXMLをそのまま吐き出せるかやってみる.

require 'rubygems'
require 'xml/libxml'

doc = XML::Document.file('goods.xml')
puts doc.root

ごくごく簡単な処理だ.で,実行するとこうなる.

% ruby lxml.rb 
<gl:goodslist xmlns:gl="http://www.example.com/goodslist">
  <gl:goods>
    <gl:name>&#x574A;&#x3061;&#x3083;&#x3093;</gl:name>
(以下略)

とまぁこのように,えげつない事になってる.

parser = XML::Parser.new
parser.io = File.open('goods.xml')
doc = parser.parse

ちょっと趣向を凝らしてこういう事しても,全然ダメ.う〜んどうしよう.実装を見ようにも,全部Cだしなぁ….

入力がダメなら

出力を,と思い,やってみた.

doc = XML::Document.new
doc.encoding = 'UTF-8'
doc.root = XML::Node.new('goodslist')
root = doc.root
root << goods = XML::Node.new("goods")
goods << name = XML::Node.new("name")
name << '坊ちゃん'
goods << price = XML::Node.new("price")
price << '1050'
goods << duedate = XML::Node.new("duedate")
duedate << '2006-10-15'

puts root

実行.

% ruby lxml.rb 
<goodslist>
  <goods>
    <name>&#x574A;&#x3061;&#x3083;&#x3093;</name>
    <price>1050</price>
    <duedate>2006-10-15</duedate>
  </goods>
</goodslist>

う〜ん.

ただ

id:Hexa:20060810:1155232063を見る限りでは,すげーお手軽なんですよねー.それこそ直感的というか.あとは日本語さえ楽々操作できればなぁ.困った困った.

*1:なんちゅうXMLファイルを作っとるんやとかいう突っ込みは無しよ