在ruby中的字符串中的两个索引之间进行替换的正确方法是什么?

时间:2011-04-12 09:42:47

标签: ruby nokogiri

我使用nokogiri和ruby来编写一些部署脚本,我需要从许多信息源更新文件。我循环的第一个文件我只是用gsub

做一个简单的替换

File.open(@sql_file, 'w') { |file| file.puts text.gsub(/#{find}/, replace.to_s) }

这适用于第一个文件,但是第二次我需要解析我最初替换的文本并可能更新它。使用Nokogiri,我想出了以下内容:

def write_changes(find, replace)
  text = ''
  text = File.read(@sql_file)
  if text =~ /#{find}/
    File.open(@sql_file, 'w') do |file| 
      file.puts text.gsub(/#{find}/, replace.to_s)
    end
  else
    xml = Nokogiri::XML.parse(replace)
    element xml.at_xpath('//items')
  end
end

也许不是很红宝石:是的,但它确实有效。这里的问题是我需要解析

<items id="">
  <item />
</items>

从文件中的文本,以便我可以使用Nokogiri更新该文本,然后将其替换为我的更改。

所以基本上我想我需要找到id匹配的item标签的startindex,然后剪切从<items id=""></items>的所有内容。

有意义吗?我应该进一步澄清吗?

编辑1。我有点工作,但我无法弄清楚最后一部分。

    original = text[begin_index, end_index]
    xml2 = Nokogiri::XML.parse(original)
    update_element_values(xml, xml2)
    add_missing_elements(xml, xml2)
    # text[begin_index, end_index] = xml2.root.to_s
    text.insert(begin_index, xml2.root.to_s)
    File.open(@sql_file, 'w') { |file| file.puts text }

如果我取消注释在索引之间进行替换的行,我会得到一些损坏的切碎结果,大部分都丢失了。

如果我使用插入版本,我会尝试合并的每个文件都有重复项。在ruby中用字符串中的两个索引替换的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我的解决方案受@ Andrew的评论启发,使用打开文本作为html文档,以便能够导航到xpath并对其进行替换。完成之后,我只需清理生成的html标头。希望有更好的方法。

def replace_provider(xml)
  element = xml.at_xpath('//provider')
  return if element.nil?

  doc = Nokogiri::HTML(open(@sql_file))
  original_xml = doc.at_xpath("//provider[@name=\"#{element['name']}\"]")
  return if original_xml.nil?

  update_element_values(xml, original_xml)
  add_missing_elements(xml, original_xml)

  doc.xpath("//provider[@name=\"#{element['name']}\"]") do |item|
    item.replace original_xml
  end
  text = remove_all_html_tags(doc)
  File.open(@sql_file, 'w') { |file| file.puts text }
end