仅使用 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,其设计目的是为了方便,具有有限的功能集。如果您不想以“Builder-way”的方式进行操作,您可以使用“old-school”并采用现有的 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>
上述两种方式中的任何一种都在语法上呈现相同的事物,它们只是在外观上有所不同。
您甚至可以通过以下方式变得复杂和时髦:
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>