2011-04-12 21 views
0

我正在使用nokogiri和ruby来编写一些部署脚本,我需要从许多信息来源更新文件。通过我只是做了一个简单的第一个文件我循环替换GSUB在Ruby中的字符串中的两个索引之间进行替换的正确方法是什么?

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 

也许不是很红宝石: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中的字符串中的两个索引之间进行替换的正确方法是什么?

+2

你不需要'/#{}找到/' - 你可以做'text.include(查找)'和'text.gsub(发现,replace.to_s)' – 2011-04-12 23:30:28

+0

你必须编辑在它到达nokogiri之前的文本,或者你可以解析文本,然后使用nokogiri来查找/替换适当的? – YenTheFirst 2011-04-13 00:20:40

+0

@Andrew,欢呼的伙伴总是想方设法改进我的代码! @YenTheFirst,我只编辑文本的部分,当它到达Nokogiri,所以我想我可以使用Nokogiri。不知道如何 – mhenrixon 2011-04-13 05:10:58

回答

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 
相关问题