Nokogiri to_xml without carriage returns
Builder#to_xml
by default outputs formatted (i.e. indented) XML. You can use the Nokogiri::XML::Node::SaveOptions
to get an almost unformatted result.
b = Nokogiri::XML::Builder.new do |xml| xml.root do xml.foo do xml.text("Value") end endendb.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"
Now you could either just get rid of the XML header (which is optional anyway) and remove the last newline
b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip# => "<root><foo>Value</foo></root>"
Just removing all newlines in the XML is probably a bad idea as newlines can actually be significant (e.g. in <pre>
blocks of XHTML). If that is not the case for you (and you are really sure of that) you could just do it.
This is not something that Nokogiri is designed to do. The closest you can get is to serialize the root of the document with no newlines or indentation, and then add the PI yourself (if you really need it):
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>
Alternatively, you could simply cheat and do:
puts b.doc.serialize(save_with:0).sub("\n","")#=> <?xml version="1.0"?><root><foo>Value</foo></root>
Note the usage of sub
instead of gsub
to only replace the first known-present newline.