没有回车的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",'') 

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

    Interesting Posts