2014-05-22 49 views
0

搜索XML文檔使用引入nokogiri特定的路徑,改變它的具體路徑搜索XML文檔使用引入nokogiri和改變它

(在前面用黃瓜)我要搜索一個XML文件,爲特定路徑,然後改變它到別的東西。這是XML的相關部分:

<Root> 
<Application> 
    <Connections> 
    <AutoAccept>true</AutoAccept> 
    <AllowDomains/> 
    </Connections> 
    <Streams> 
    <StreamType>default</StreamType> 
    <StorageDir>/C:/blah/flash/</StorageDir> 

我想將「/ C:/等等/閃光燈/」更改爲另一個值。這是我的代碼明智:

Given(/^Update the Apreso configuration file$/) do 
    xmldoc = Nokogiri::XML(DATA['DATA_WOWZA1']) 
    xmldoc.search("/Root/Application/Streams/StorageDir").each do |node| 
    node.content = "Newpath" 
end 

puts xmldoc.to_xml 
end 

的「DATA_WOWZA1」是我穿過YAML文件的XML文件的路徑。當我運行它通過的代碼時,但XML文件並不反映這些變化,想法?

+1

你在搜索空字符串,還是隻是一個虛擬代碼? –

+0

艾哈邁德,這是一種類型,謝謝兄弟。搜索路徑,請參閱上面的代碼。 – Farooq

+1

那麼這個XPath有什麼問題?它對我的工作很好,節點更改已正確反映。你使用的是什麼版本的nokogiri? –

回答

1

您需要給Nokogiri::XML一個XML字符串,而不是一個文件路徑字符串。嘗試:

xmldoc = Nokogiri::XML(File.read DATA['DATA_WOWZA1']) 

儘管如此,您正在獲取原始的XML輸出並不合理。你確定你的測試正在輸出XML嗎?

如果你想保存到位的文件,你需要做的是這樣:

File.open(DATA['DATA_WOWZA1'], 'w') { |f| f.puts xmldoc.to_xml } 
+0

這可以工作,終端中的輸出顯示更改,但文件不反映更改,是否需要保存該文件? – Farooq

+1

添加了保存文件的例子。 –

+0

我剛剛試過: File.open(DATA ['DATA_WOWZA1'],'w'){| f | xmldoc.write_xml_to f} 並看到您的評論,謝謝kardeiz!有用 :) – Farooq

0

如果只有一個​​節點,那麼你的工作太辛苦:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<Root> 
<Application> 
    <Connections> 
    <AutoAccept>true</AutoAccept> 
    <AllowDomains/> 
    </Connections> 
    <Streams> 
    <StreamType>default</StreamType> 
    <StorageDir>/C:/blah/flash/</StorageDir> 
    </Streams> 
    </Application> 
    </Root> 
EOT 

doc.at('StorageDir').content = 'd:/path/to/foo' 
puts doc.to_xml 
# >> <?xml version="1.0"?> 
# >> <Root> 
# >> <Application> 
# >> <Connections> 
# >> <AutoAccept>true</AutoAccept> 
# >> <AllowDomains/> 
# >> </Connections> 
# >> <Streams> 
# >> <StreamType>default</StreamType> 
# >>  <StorageDir>d:/path/to/foo</StorageDir> 
# >> </Streams> 
# >> </Application> 
# >> </Root> 

覆蓋原始文件也很容易完成。這是未經測試,但看起來「回合右:

XML_FILE = 'path/to/xml' 
doc = Nokogiri::XML(open(XML_FILE, 'r')) 
doc.at('StorageDir').content = 'd:/path/to/foo' 
File.write("#{ XML_FILE }.new", doc.to_xml) 

注意,我不是覆蓋原文件,我正在寫一個新的文件。如果代碼出現問題,例如修改錯誤的節點,這將保留舊文件而不是銷燬它的內容。

在生產系統中,您需要寫入一個新文件,然後將舊文件重命名爲安全文件,將新文件重命名爲舊文件名,然後可選擇刪除舊文件,確保一切工作正常。如果出現問題,通過這樣做你可以。