我想使用Nokogiri将节点插入XML文档。 Nokogiri使用Nokogiri::XML::Builder
类来插入或创建新的XML。
如果我使用new
方法创建XML,我可以创建漂亮的格式化XML:
builder = Nokogiri::XML::Builder.new do |xml|
xml.product {
xml.test "hi"
}
end
puts builder
输出以下内容:
<?xml version="1.0"?>
<product>
<test>hi</test>
</product>
那很好,但我想要做的是将上面的XML添加到现有文档中,而不是创建新文档。根据Nokogiri文档,这可以通过使用Builder的with
方法完成,如下所示:
builder = Nokogiri::XML::Builder.with(document.at('products')) do |xml|
xml.product {
xml.test "hi"
}
end
puts builder
然而,当我这样做时,XML全部被放入一行而没有缩进。它看起来像这样:
<products><product><test>hi</test></product></products>
我是否遗漏了一些内容以使其正确格式化?
答案 0 :(得分:11)
在Nokogiri邮件列表中找到答案:
在XML中,可以考虑空格 有意义的。如果您解析文档 包含空白节点, libxml2将假设为空格 节点是有意义的,不会 为你插入它们。
你可以告诉libxml2那个空格 通过这个没有意义 “noblanks”标志到解析器。至 演示,这是一个例子 再现你的错误,然后做什么 你想要的:
require 'nokogiri'
def build_from node
builder = Nokogiri::XML::Builder.with(node) do|xml|
xml.hello do
xml.world
end
end
end
xml = DATA.read
doc = Nokogiri::XML(xml)
puts build_from(doc.at('bar')).to_xml
doc = Nokogiri::XML(xml) { |x| x.noblanks }
puts build_from(doc.at('bar')).to_xml
输出:
<root>
<foo>
<bar>
<baz />
</bar>
</foo>
</root>