Nokogiri :: XML :: Builderのみを使用する場合は、次のようにする必要があります。
require 'nokogiri'
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
xml.Data {
xml.Groups {
xml.GroupType "test"
xml.AnotherNode "13"
}
}
end
puts builder.to_xml
Which outputs:
=> <?xml version="1.0" encoding="UTF-8"?>
<Data>
<Groups>
<GroupType>test</GroupType>
<AnotherNode>13</AnotherNode>
</Groups>
</Data>
BuilderはDSLであり、機能のセットが限られている便利なものとして設計されています。「ビルダーウェイ」で実行したくない場合は、「旧式」で既存のXMLノードを取得し、その上に構築することができます。
require 'nokogiri'
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
xml.Data {
xml.Groups {
xml.GroupType "test"
}
}
end
これにより、Builderオブジェクト内に必要なベースXMLが作成されました。それをXMLとしてレンダリングし、それをNokogiri :: XML :: Documentに再解析してから、次のように処理します。
doc = Nokogiri::XML(builder.to_xml)
doc.at('GroupType').add_next_sibling("<AnotherNode>13</AnotherNode>")
puts doc.to_xml
=> <?xml version="1.0" encoding="UTF-8"?>
<Data>
<Groups>
<GroupType>test</GroupType><AnotherNode>13</AnotherNode>
</Groups>
</Data>
doc = Nokogiri::XML(builder.to_xml)
doc.at('Groups').add_child("<AnotherNode>13</AnotherNode>")
puts doc.to_xml
=> <?xml version="1.0" encoding="UTF-8"?>
<Data>
<Groups>
<GroupType>test</GroupType>
<AnotherNode>13</AnotherNode></Groups>
</Data>
上記の2つの方法のいずれも、構文的に同じものをレンダリングしますが、見た目が異なるだけです。
複雑でファンキーになり、次のようにすることもできます。
builder = Nokogiri::XML::Builder.with(
Nokogiri::XML(
builder.to_xml
).at('Groups') << "<AnotherNode>13</AnotherNode>"
)
puts builder.to_xml
=> <?xml version="1.0" encoding="UTF-8"?>
<Data>
<Groups>
<GroupType>test</GroupType>
<AnotherNode>13</AnotherNode></Groups>
</Data>