我目前正在使用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>
如何做到这一点?提前谢谢!
答案 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",'')
可能比尝试重载方法容易。