Libxml-Rubyを使ってみる
コメントにて,id:Hexaさんに教えてもらったLibxml-Ruby.標準添付ではないので,gemでインストールしました.
そもそもlibxmlってのはCで書かれたXMLパーサ&ツールキットで,Gnomeプロジェクトで開発されたものだそうです.で,Libxml-Rubyはそのlibxml2をRubyから使おうぜって言うライブラリ.
libxml2はMac OS Xに最初っから入っているようなので,気にしないで良いみたい.
ただ,日本語が化けるのね,このヤロー.なんか,Tidyつかった時みたいな化け方(わかりにくい).
そう思って色々ググってみて,libiconvがマルチバイト回りに一枚噛んでるみたいだけど,ちゃんと入ってるしなぁ.怪しい.
どの程度の文字化けか
<?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>坊ちゃん</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>坊ちゃん</name> <price>1050</price> <duedate>2006-10-15</duedate> </goods> </goodslist>
う〜ん.
ただ
id:Hexa:20060810:1155232063を見る限りでは,すげーお手軽なんですよねー.それこそ直感的というか.あとは日本語さえ楽々操作できればなぁ.困った困った.