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