没有回车的Nokogiri to_xml

Cam*_*ron 19 ruby xml newline nokogiri

我目前正在使用Nokogiri :: XML :: Builder类来构造XML文档,然后在其上调用.to_xml.结果字符串总是在节点之间包含一堆空格,换行符和回车符,我不能为我的生活弄清楚如何摆脱它们.这是一个例子:

b = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    xml.text("Value")
  end
end

b.to_xml
Run Code Online (Sandbox Code Playgroud)

这导致以下结果:

<?xml version="1.0"?>
<root>Value</root>
Run Code Online (Sandbox Code Playgroud)

我想要的是这个(注意缺少的换行符):

<?xml version="1.0"?><root>Value</root>
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?提前致谢!

Hol*_*ust 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"
Run Code Online (Sandbox Code Playgroud)

现在你可以删除XML标题(无论如何都是可选的)并删除最后一个换行符

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip
#=> "<root><foo>Value</foo></root>"
Run Code Online (Sandbox Code Playgroud)

只删除XML中的任何换行可能是一个坏主意,因为换行实际上可能很重要(例如,在<pre>XHTML块中).如果你不是这种情况(而且你确实如此),你就可以做到.

  • 我的最终解决方案如下所示:`builder.doc.serialize(:save_with => Nokogiri :: XML :: Node :: SaveOptions :: AS_XML).sub("\n","").strip` (2认同)