9

たぶんこれはつまらないですが、私は尋ねなければなりません。

Nokogiriを使用してXMLを解析し、特定のタグを削除して、元のファイルに結果を上書きしています。を使用.removeすると、XMLに空白行が残ります。私は現在、空白行を取り除くために正規表現を使用しています。使用すべき組み込みのノコギリメソッドはありますか?

これが私が持っているものです:

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

各テキストノードで置換を行うことも私にとってはうまくいきませんでした。問題は、ノードを削除した後、隣接したばかりのテキストノードがマージされないことです。テキストノードをループすると、各ノードには1つの改行しかありませんが、現在は複数の改行が並んでいます。

私が見つけたかなり厄介な解決策の1つは、ドキュメントを再解析することでした。

xml = Nokogiri::XML.parse xml.to_xml

これで、隣接するテキストノードがマージされ、それらに対して正規表現を実行できます。

しかし、これはおそらくより良いオプションのように見えます:

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

于 2014-11-20T16:30:07.437 に答える