ruby-on-rails - 如何使用 Ruby 和 REXML 获取 XML 页面的子节点

标签 ruby-on-rails ruby xml xpath rexml

我使用的是 Ruby 版本 1.9.3。这是我想从中获取信息的实际 XML 页面的简单版本。我需要从需要登录凭据的安全网站访问它。我无法使用 Nokogiri,因为我无法使用它登录网站。

<root>
  <person>
    <name>Jack</name>
    <age>10</age>
  </person>
  <person>
    <name>Jones</name>
  </person>
  <person>
    <name>Jon</name>
    <age>16</age>
  </person>
</root>

如您所见,有时标签 age 不会出现。将 REXML 与 Ruby 结合使用,我使用以下代码:

agent = Mechanize.new
xml = agent.get("https://securewebsite.com/page.xml")
document = REXML::Document.new(xml.body)

name = XPath.match(document, "//person/name").map {|x| x.text} 
# => ["Jack", "Jones", "Jon"]

age =  XPath.match(document, "//person/age").map {|x| x.text} 
# => ["10", "16"]

问题是我无法将 age 与正确的 name 相关联,因为索引现在乱序了。例如在索引 1 处,name[1] 是 Jones 但 age[1] 是 16。但这不是真的,因为 Jones 的 person 标签没有 age 标签。

有什么方法可以让 age 数组输出:# => ["10", nil,"16"] 这样我就可以关联正确的名字和相应的年龄?

或者有更好的方法吗?如果需要进一步解释,请告诉我。

最佳答案

问题在于我们将年龄和姓名视为完全独立的信息集合。我们需要做的是从人那里获取信息作为集合。

xml = "<your xml here />"
doc = Nokogiri::XML(xml)
persons = doc.xpath("//person")
persons_data = persons.map {|person| 
  {
    name: person.xpath("./name").text,
    age: person.xpath("./age").text
  }
}

这会获取人员节点,然后从中获取相关信息并给出结果:

puts persons_data.inspect #=> [
                                {:name=>"Jack", :age=>"10"}, 
                                {:name=>"Jones", :age=>""}, 
                                {:name=>"Jon", :age=>"16"}
                              ]

所以为了得到你要调用的第一个人的姓名和年龄

persons_data[0]["name"] #=> "Jack"
persons_data[0]["age"]  #=> "10"

关于ruby-on-rails - 如何使用 Ruby 和 REXML 获取 XML 页面的子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28303231/

相关文章:

ruby-on-rails - Rails 关联方法如何工作?

ios - NSOperation 中的 AFNetworking 操作

ruby-on-rails - 检查关系是否存在 has_one mongoid

.net - Web 开发期间自动刷新浏览器

ruby - 为什么扩展模块中的常量在用 self. 声明的类方法中不可用?

ruby-on-rails - 如何在错误 rails "warning: 299 Elasticsearch built-in security features are not enabled. Without authentication, your cluster could..."中修复此问题

ruby - 最矮的 ruby 蒯因

XML 模式唯一约束是类型而不是元素

javascript - addParameter javascript(用于xslt)函数不起作用

mysql - Rails Arel,从同一列中选择但有多个值