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

结果如下:

<?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",'')

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

相关内容

  • 没有找到相关文章

最新更新