Ruby 无回车的Nokogiri to_xml

Ruby 无回车的Nokogiri to_xml,ruby,xml,newline,nokogiri,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 其结果如下: <?xml version="1.0"?> <root>Va

我目前正在使用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>

价值
我想要的是(注意缺少的换行符):


如何做到这一点?提前谢谢

这不是Nokogiri的初衷。最接近的方法是序列化文档的根,不使用换行符或缩进,然后自己添加PI(如果确实需要):

需要“nokogiri”
b=Nokogiri::XML::Builder.new{| XML | XML.root{XML.foo“Value”}
p.b.to_xml
#=>“\n\n值\n\n”
p b.doc.序列化(使用0保存)
#=>“\n值\n”
flat_root=b.doc.root.serialize(使用0保存_)
扁豆根
#=>“值”
放置%Q{{{flat_root}
#=>值
或者,您可以简单地作弊并执行以下操作:

puts b.doc.serialize(save_with:0).sub("\n","")
#=> <?xml version="1.0"?><root><foo>Value</foo></root>
将b.doc.serialize(保存为:0).sub(“\n”,”)
#=>值

注意使用
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",'')
可能比尝试重载该方法更容易。

Builder\to#u xml
默认输出格式化(即缩进)的xml。您可以使用获得几乎未格式化的结果

b=Nokogiri::XML::Builder.new do | XML|
xml.root.do
xml.foo-do
xml.text(“值”)
结束
结束
结束
b、 到xml
#=>“\n\n值\n\n”
b、 to_xml(:save_with=>Nokogiri::xml::Node::SaveOptions::AS_xml)
#=>“\n值\n”
现在,您可以去掉XML头(这是可选的)并删除最后一个换行符

b.to_xml(:save_with=>Nokogiri::xml::Node::SaveOptions::AS_xml | Nokogiri::xml::Node::SaveOptions::NO_声明)
#=>“值”

仅仅删除XML中的所有换行可能是个坏主意,因为换行实际上可能很重要(例如在XHTML的
块中)。如果你不是这样的话(你真的很确定),你可以这么做。

不幸的是,我一直在使用Nokogiri v1.3.3,它不允许将任何参数传递到xml。否则,这将是一个伟大的解决方案。啊,好的,明白了。看起来您可以使用此方法,方法是将保存选项传递给序列化,而不是传递给_xml:
b.doc.serialize(:save_with=>Nokogiri::xml::Node::SaveOptions::AS_xml)
我的最终解决方案如下所示:
builder.doc.serialize(:save_with=>Nokogiri::xml::Node::SaveOptions::AS_xml).sub(“\n”,“”).strip
仅替换第一个\n将不起作用-我实际创建的文档有很多层次,每个节点后面都有一个\n。节点中的某些文本也包含\n字符,我必须保留这些字符(这是针对Android的,需要Java样式的字符串)。此解决方案与公认的解决方案几乎相同-谢谢!谢谢这段代码真的很有帮助,但是你能解释一下save_的作用吗?
puts b.doc.serialize(save_with:0).sub("\n","")
#=> <?xml version="1.0"?><root><foo>Value</foo></root>
require 'nokogiri'

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

b.to_xml.sub("\n",'')