ふと気づいたらlibxml-rubyが0.9.8になってた。
gemで0.8.3からupdateしたら動かないスクリプトが出てきた。
XML::Document#to_s がエラーになる。

CHANGESを見ると
  • 出力オプションをHash指定に変えた
  • エンコード名を文字列指定からLibXML::XML::Encoding下の定数指定に変えた
ということらしい。
前者はともかく後者は面倒だなー。というのもjrubyでも使うスクリプトなのでtransformer.setOutputProperty(javax.xml.transform.OutputKeys::ENCODING, エンコード名な文字列) とI/Fを合わせて文字列指定で作ってたから。

libxml-rubyのマニュアルによればエンコード名文字列から定数を得るI/Fがあるみたいなんだけど、どうも期待した結果にならない。
(マニュアル上はInput.s_to_encoding("UTF_8") なんだけどext/libxml/ruby_xml_encoding.cを見るとfrom_sのようで混乱する

$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'libxml'
=> true
irb(main):003:0> LibXML::XML::Encoding.from_s("UTF_8")
=> -1
irb(main):004:0> LibXML::XML::Encoding.from_s("UTF-8")
=> false
irb(main):005:0> LibXML::XML::Encoding.from_s("utf8")
=> false
irb(main):006:0> LibXML::XML::Encoding.from_s("utf-8")
=> false
irb(main):007:0> LibXML::XML::Encoding.from_s("utf_8")
=> -1
irb(main):008:0>

とりあえず文字列をいじくって定数名とみなしてお茶にごす。
alias名が困るなー

      const_name = encoding_name.gsub(/-/, "_").upcase
encoding = LibXML::XML::Encoding.const_get(const_name)
doc.to_s(:encoding => encoding)

環境
    - CentOS 5.2 i686
    - libxml2: 2.6.26-2.1.2.7
    - ruby: 1.8.5-5.el5_2.6
    - rubygems: 1.3.1
    - libxml-ruby: 0.9.8 (gem)