也许这是挑剔,但我不得不问。
我正在使用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
答案 0 :(得分: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
答案 1 :(得分:2)
这为我删除了空白行;
doc.xpath('//text()').find_all {|t| t.to_s.strip == ''}.map(&:remove)
答案 2 :(得分:1)
在每个文本节点上执行替换对我来说也不起作用。问题是在删除节点后,刚刚相邻的文本节点不会合并。循环文本节点时,每个文本节点只有一个换行符,但现在连续几行。
我发现一个相当混乱的解决方案是重新整理文档:
xml = Nokogiri::XML.parse xml.to_xml
现在将合并相邻的文本节点,您可以对它们执行正则表达式。
但这看起来似乎是一个更好的选择: