2011-04-12 22 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 
相關問題