没有回车的Nokogiri to_xml
我目前正在使用Nokogiri :: XML :: Builder类来构造XML文档,然后在其上调用.to_xml。 结果字符串总是在节点之间包含一堆空格,换行符和回车符,我不能为我的生活弄清楚如何摆脱它们。 这是一个例子:
b = Nokogiri::XML::Builder.new do |xml| xml.root do xml.text("Value") end end b.to_xml
这导致以下结果:
Value
我想要的是这个(注意缺少的换行符):
Value
如何才能做到这一点? 提前致谢!
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 #=> "\n\n Value \n \n" b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML) #=> "\nValue \n"
现在你可以只删除XML标题(无论如何都是可选的)并删除最后一个换行符
b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip #=> "Value "
只删除XML中的任何换行符可能是一个坏主意,因为换行符实际上可能很重要(例如在
XHTML块中)。 如果你不是这种情况(而且你确实如此),你就可以做到。
这不是Nokogiri的目的。 您可以获得的最接近的是序列化文档的根,没有换行符或缩进,然后自己添加PI(如果您确实需要它):
require 'nokogiri' b = Nokogiri::XML::Builder.new{ |xml| xml.root{ xml.foo "Value" } } p b.to_xml #=> "\n\n Value \n \n" p b.doc.serialize(save_with:0) #=> "\nValue \n" flat_root = b.doc.root.serialize(save_with:0) p flat_root #=> "Value " puts %Q{#{flat_root}} #=> Value
或者,您可以简单地作弊并做:
puts b.doc.serialize(save_with:0).sub("\n","") #=> Value
注意使用sub
而不是gsub
来替换第一个已知存在的换行符。
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",'')
可能比尝试重载方法更容易。