9

也许这很挑剔,但我不得不问。

我正在使用 Nokogiri 解析 XML,删除某些标签,并用结果覆盖原始文件。使用.remove会在 XML 中留下空白行。我目前正在使用正则表达式来摆脱空白行。我应该使用一些内置的 Nokogiri 方法吗?

这是我所拥有的:

require 'Nokogiri'
io_path = "/path/to/metadata.xml"
io = File.read(io_path)
document = Nokogiri::XML(io)
document.xpath('//artwork_files', '//tracks', '//previews').remove

# write to file and remove blank lines with a regular expression
File.open(io_path, 'w') do |x|
  x << document.to_s.gsub(/\n\s+\n/, "\n")
end
4

3 回答 3

7

没有内置方法,但我们可以添加一个

class Nokogiri::XML::Document
  def remove_empty_lines!
    self.xpath("//text()").each { |text| text.content = text.content.gsub(/\n(\s*\n)+/,"\n") }; self
  end
end
于 2009-12-06T19:26:32.707 回答
3

这为我删除了空白行;

doc.xpath('//text()').find_all {|t| t.to_s.strip == ''}.map(&:remove)
于 2017-01-19T11:12:14.253 回答
1

在每个文本节点上进行替换对我也不起作用。问题是在删除节点后,刚刚变得相邻的文本节点不会被合并。当您遍历文本节点时,每个节点只有一个换行符,但现在有几个连续的。

我发现的一个相当混乱的解决方案是重新解析文档:

xml = Nokogiri::XML.parse xml.to_xml

现在相邻的文本节点将被合并,您可以对它们执行正则表达式。

但这看起来可能是一个更好的选择:

https://github.com/tobym/nokogiri-pretty

于 2014-11-20T16:30:07.437 回答