所以我正在尝试构建一个 XML 文件,而必须构建它的方式的性质意味着我必须在自然嵌套结构之外添加元素。例如:
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
xml.Data {
xml.Groups do |inner|
inner.send(:"GroupType", "test")
end
# Insert child element into Groups element.
}
end
我希望 XML 看起来像:
<Data>
<Groups>
<GroupType>test</GroupType>
<AnotherNode>13</AnotherNode>
</Groups>
</Data>
在哪里<AnotherNode>
添加第一个代码示例中我的评论所在的位置。
应该相对简单,但我一辈子都弄不明白。大概我需要能够搜索该 block ,或者在我形成它然后使用它时引用它?
顺便说一句,我接手了一个项目,里面已经有很多 Nokogiri 的东西,它有这样的选择器:
xml_file = Nokogiri::XML(xml)
(xml_file/:RootNode).each do |root|
(root/:SomeItem).each do |si|
...
end
end
.. 但我在文档中找不到类似的内容?这是怎么回事?
最佳答案
事后两年才发现这个问题,并认为公认的答案比需要的要复杂得多。
问题是,您正在此处构建一个 XML 片段,而默认情况下 Nokogiri 的构建器假定您正在构建一个完整的文档。 XML 文档只有一个根节点。
一种选择是按如下方式构建完整的文档,然后获取根的子项:
<DISPOSABLE_OUTER_NODE>
<Data>
<Groups>
<GroupType>test</GroupType>
</Groups>
</Data>
<AnotherNode>13</AnotherNode>
</DISPOSABLE_OUTER_NODE>
但还有一种更好的“碎片化”方式。您构建一个空片段,然后让构建器处理它而不是一个新文档:
frag = Nokogiri::XML::DocumentFragment.parse("")
Nokogiri::XML::Builder.with( frag ){ |b|
b.Data do
b.Groups do
b.GroupType "test"
end
end
b.AnotherNode "13"
}
puts frag.to_xml
然后将它粘贴到您正在修改的任何文档中。
也许 with
是 Nokogiri 的后来者。但它是我遇到的问题的优雅解决方案,所以我认为它属于这里。
关于ruby - 在嵌套之外向 Nokogiri XML Builder 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13682009/