为了构建大型且相当繁琐的AIXM ( XML )文件,我目前正在从" builder“gem切换到Nokogiri的内置XML构建器。DocumentFragment非常方便地构建用于组装最终文档的块。
大多数DocumentFragment都有一个容器,所有的东西都能像魅力一样工作:
require 'nokogiri'
Nokogiri::XML::DocumentFragment.parse('').tap do |document|
Nokogiri::XML::Builder.with(document) do |builder|
builder.root do |root|
root.foo('bar')
root.fii('bir')
end
end
end.to_xml<root>
<foo>bar</foo>
<fii>bir</fii>
</root>不幸的是,一些DocumentFragment仅仅包含了一些元素。由于某些原因,结果不再格式化,一切都在一行上结束:
require 'nokogiri'
Nokogiri::XML::DocumentFragment.parse('').tap do |document|
Nokogiri::XML::Builder.with(document) do |builder|
builder.foo('bar')
builder.fii('bir')
end
end.to_xml<foo>bar</foo><fii>bir</fii>是否有像容器版本中那样在每个元素之后有新闻行的方法?
(我一直在寻找方法将文档的一部分提取到一个新的DocumentFragment中,例如,使用第一个示例来构建,然后提取一个只包含root子程序的DocumentFragment。)
谢谢你的帮忙!
发布于 2022-04-30 16:49:43
让我自己回答这个问题:
从我所读到的关于使用libxml2的其他实现的文章来看,这似乎是libxml2的一个“特性”,而不是发生在Nokogiri的末端。
无论如何,我正在解决这个可读性问题,就像现在这样:
def build_fragment
Nokogiri::XML::DocumentFragment.parse('').tap do |document|
Nokogiri::XML::Builder.with(document) do |builder|
yield builder
end
document.elements.each { _1.add_next_sibling("\n") } # add newline between tags on top level
end
end然后使用它:
build_fragment do |builder|
builder.foo('bar')
builder.fii('bir')
end得到:
<foo>bar</foo>
<fii>bir</fii>https://stackoverflow.com/questions/72069646
复制相似问题