我使用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中用字符串中的两个索引替换的正确方法是什么?
答案 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