2012-07-03 30 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