我正在尝试使用Nokogiri来压缩现有的XML。我有以下演示代码:
#!/usr/bin/env ruby
require 'nokogiri'
doc = Nokogiri.XML <<-XML.strip
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>
<bar>test</bar>
</foo>
</root>
XML
doc.write_xml_to($stdout, indent: 0)
我希望看到
<?xml version="1.0" encoding="UTF-8"?>
<root><foo><bar>test</bar></foo></root>
但我看到
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>
<bar>test</bar>
</foo>
</root>
我试过
doc.write_to($stdout, indent: 0, save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
但也不起作用。
如何删除可忽略的空格?
答案 0 :(得分:1)
好的,我回答了我自己的问题。
Nokogiri不会删除空格,因为Nokogiri不知道空格是否可忽略(没有DTD,没有模式),因此它将所有仅空白文本保留为文本节点。我应该在将XML文档写入IO设备之前手动删除它们。
#!/usr/bin/env ruby
require 'bundler'
Bundler.require :default
doc = Nokogiri.XML <<-XML.strip
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>
<bar>test</bar>
</foo>
</root>
XML
# remove ignorable white spaces
doc.xpath('//text()').each do |node|
node.content = '' if node.text =~ /\A\s+\z/m
end
doc.write_xml_to($stdout, indent: 0)
这对我来说是一个很大的进步,但我还没有达到目标,因为我正在处理的XML文件具有内联自动关闭标记,并且在这些标记之间只有空白文本节点不应该压缩的标签。我现在试图想办法处理这个角落案件。
答案 1 :(得分:1)
你可以告诉Nokogiri忽略空文本节点,然后输出而不缩进:
require 'nokogiri'
xml = <<EOT
<?xml version="1.0" encoding="UTF-8"?>
<root>
<foo>
<bar>test</bar>
</foo>
</root>
EOT
doc = Nokogiri::XML(xml) { |opts|
opts.noblanks
opts.strict.noblanks
}
doc.to_xml(:indent_text => '', :indent => 0)
# => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
# "<root>\n" +
# "<foo>\n" +
# "<bar>test</bar>\n" +
# "</foo>\n" +
# "</root>\n"