NokogiriでXMLに子要素を追加すると要素名が小文字になる

環境

問題

  • XMLノードに子要素を追加する際にNokogiri::XML::Node#add_childを使いつつ引数を文字列で渡すと、要素名が小文字になる。要素名はdowncaseしないでほしい。

解決

  • Nokogiri::XML::DocumentFragment#newを使う。長ったらしくてめんどくさいし、もっといい方法がある気がするんだけど見つけられていない。

ソースコード

#!/usr/bin/env ruby
# coding: utf-8

require "nokogiri"

doc = Nokogiri::XML("<RootNode>")

doc.root.add_child "<AddChildByString>"
doc.root.add_child Nokogiri::XML::DocumentFragment.new(doc, '<AddChildByDocumentFragment>')

puts doc.to_xml
# =>
# <?xml version="1.0"?>
# <RootNode>
#   <addchildbystring/>
#   <AddChildByDocumentFragment/>
# </RootNode>

[追記 2013/03/07]Nokogiri::XML::Builderという便利なものがあった

Nokogiriのドキュメントを漁っていたら下記のような書き方で生成できることが分かった。こっちの方が便利そう。

#!/usr/bin/env ruby
# coding: utf-8 
 
require "nokogiri"
 
document = Nokogiri::XML::Builder.new do |doc|
  doc.RootNode {
    doc.AddChildByString
    doc.AddChildByDocumentFragment
  }
end
 
puts document.to_xml