使用nokogiri

时间:2017-07-16 13:03:19

标签: ruby nokogiri

我正在尝试使用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)

但也不起作用。

如何删除可忽略的空格?

2 个答案:

答案 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"
相关问题