我目前正在使用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>
如何做到这一点?提前感谢!
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中的所有换行符可能是一个坏主意,因为换行符实际上可能很重要(例如在XHTML的<pre>
块中)。如果这不是你的情况(你真的很确定),你可以这样做。
这不是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
只替换第一个已知存在的换行符
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",'')
可能比尝试重载方法更容易。