Ruby - 使用REXML查找元素

时间:2012-07-03 16:32:40

标签: ruby xml rexml

我有一个XML文件,其中包含有关特定城市及其位置的零售商店的信息,但我在从中检索数据时遇到一些问题。问题是我可以通过循环遍历名称元素找到商店的名称,但是一旦找到我正在寻找的商店,我就不知道如何获得相应的地址。有谁知道如何做到这一点?我正在使用REXML作为我的主要XML模块。这是我的XML文件和我的代码的样子

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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