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



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

可能不是很ruby:ish,但它工作。这里的问题是我需要解析出

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

从文件中的文本中删除,以便我可以使用Nokogiri更新该文本,然后用我的更改替换它。

所以基本上我想我需要找到我的项目标签的起始索引在哪里的id匹配,然后削减一切从<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?

受@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

相关内容

  • 没有找到相关文章

最新更新