插入标签时的Nokogiri和XML格式

时间:2010-10-07 21:35:29

标签: ruby xml nokogiri

我想使用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>

我是否遗漏了一些内容以使其正确格式化?

1 个答案:

答案 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>