2012-07-03 31 views
1

我有一個XML文件,它包含有關特定城市中零售商店及其位置的信息,但我在從中檢索數據時遇到了一些問題。問題是我可以通過名稱元素循環查找商店名稱,但是一旦找到所需的商店,我不知道如何獲得相應的地址。有誰知道如何做到這一點?我使用REXML作爲我的主要XML模塊。下面是我的XML文件,我的代碼看起來像Ruby - 使用REXML查找元素

XML:

<stores> 
    <store> 
    <name>Supermarket</name> 
    <address>2136 56th Avenue</address> 
    </store> 
    <store> 
    <name>Convenience Store</name> 
    <address>503 East Avenue</address> 
    </store> 
    <store> 
    <name>Pharmacy</name> 
    <address>212 Main Street</address> 
    </store> 
</stores> 

紅寶石:

xml_file.elements.each('stores/store/name') do |name| 
    if input == name 
    print name + "\n" 
    #code to retrieve the address 
    print address + "\n\n" 
    end 
end 

回答

3
xml_file = Document.new File.new("myxml.xml") 

xml_file.elements.each("stores/store") do |element| 
    if element.attributes["name"] == input 
    puts element.attributes["address"] 
    end 
end 

屬性是

<store store_name="mystore" 

得到

element.attributes["store_name"] 

編輯,不好意思試試這個

xml_file.elements.each("stores/store") do |element| 
    if element.name.text == input 
    puts element.address.text 
    end 
end 

基於評論,正確的語法是dialog.elements['name'].text

+0

當我第一次拍了一下我想這可能只是工作的代碼,但每當我打電話element.attributes [「名」 ]它返回一個空值。 – Walker

+0

它並不完全適用於「element.name.text」,但我使用「dialog.elements ['name']。text」感謝您的幫助! – Walker

1

這是我服用。 '// name/..'選擇所有'name'節點的父節點。 if語句根據輸入檢查名稱節點的文本(在本例中爲matched_names)。顯示或名稱和地址數據存儲爲您將在塊的其餘部分:

matched_names = ['Convenience Store', 'Pharmacy'] 

doc.elements.each('//name/..') do |parent| 
    if (matched_names.include? parent.elements['name/text()'].to_s) 
    puts parent.elements['name'] 
    puts parent.elements['address'] 
    end 
end