没有回车的Nokogiri to_xml

时间:2011-12-06 20:18:09

标签: ruby xml newline nokogiri

我目前正在使用Nokogiri :: XML :: Builder类来构造XML文档,然后在其上调用.to_xml。结果字符串总是在节点之间包含一堆空格,换行符和回车符,我不能为我的生活弄清楚如何摆脱它们。这是一个例子:

b = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    xml.text("Value")
  end
end

b.to_xml

这导致以下结果:

<?xml version="1.0"?>
<root>Value</root>

我想要的是这个(注意缺少的换行符):

<?xml version="1.0"?><root>Value</root>

如何做到这一点?提前谢谢!

3 个答案:

答案 0 :(得分:30)

Builder#to_xml默认输出格式化(即缩进)XML。您可以使用Nokogiri::XML::Node::SaveOptions获得几乎未格式化的结果。

b = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    xml.foo do
      xml.text("Value")
    end
  end
end

b.to_xml
#=> "<?xml version=\"1.0\"?>\n<root>\n  <foo>Value</foo>\n</root>\n"

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML)
#=> "<?xml version=\"1.0\"?>\n<root><foo>Value</foo></root>\n"

现在您可以删除XML标头(无论如何都是可选的)并删除最后一个换行符

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip
#=> "<root><foo>Value</foo></root>"

只是删除XML中的任何换行符可能是一个坏主意,因为新行实际上可能很重要(例如在<pre>块的XHTML中)。如果你不是这种情况(你确实很有信心),你可以这样做。

答案 1 :(得分:3)

这不是Nokogiri的目的。你可以得到的最接近的是序列化文档的根,没有换行符或缩进,然后自己添加PI(如果你真的需要它):

require 'nokogiri'

b = Nokogiri::XML::Builder.new{ |xml| xml.root{ xml.foo "Value" } }
p b.to_xml
#=> "<?xml version=\"1.0\"?>\n<root>\n  <foo>Value</foo>\n</root>\n"

p b.doc.serialize(save_with:0)
#=> "<?xml version=\"1.0\"?>\n<root><foo>Value</foo></root>\n"

flat_root = b.doc.root.serialize(save_with:0)
p flat_root
#=> "<root><foo>Value</foo></root>"

puts %Q{<?xml version="1.0"?>#{flat_root}}
#=> <?xml version="1.0"?><root><foo>Value</foo></root>

或者,您可以简单地作弊并做:

puts b.doc.serialize(save_with:0).sub("\n","")
#=> <?xml version="1.0"?><root><foo>Value</foo></root>

请注意sub而非gsub的使用仅替换第一个已知的现有换行符。

答案 2 :(得分:-1)

b.to_xml返回一个字符串。您只需要替换字符串中的第一个\n实例。

require 'nokogiri'

b = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    xml.text("Value")
  end
end

b.to_xml.sub("\n",'')

可能比尝试重载方法容易。