【问题标题】:converting nokogiri xml node into ruby hashconverting nokogiri xml node into ruby hash
【发布时间】:2018-01-15 00:30:37
【问题描述】:

我有一个这样的xml

 <parentNode>

    <amount>12.0</amount><authIdCode>999999</ authIdCode><currency>USD</currency>

 </parentNode>

我怎样才能将 ParentNode 内的所有节点都设为如下所示的哈希?

{amount: "12", authIdCode: "999999", currency: "USD"}

是的,我可以使用 nokogiri 搜索单个键。但是有没有可能把ParentNodedynamically里面的所有key和value都变成hash呢?

谢谢。

注意:Hash.from_xml 不会像我不使用 rails 那样工作

【问题讨论】:

    标签: ruby xml hash nokogiri


    【解决方案1】:

    这是一个工作示例:

    require 'nokogiri'
    
    xml = <<-EOS
    <parentNode>
      <amount>12.0</amount>
      <authIdCode>999999</authIdCode>
      <currency>USD</currency>
    </ parentNode>
    EOS
    document = Nokogiri::XML(xml)
    
    hash = document.xpath("//parentNode/*").each_with_object({}) do |node, hash|
      hash[node.name] = node.text
    end
    
    p hash # => {"amount"=>"12.0", "authIdCode"=>"999999", "currency"=>"USD"}
    

    它找到parentNode的所有孩子,使用孩子的名字作为key,它的文本内容作为value。

    【讨论】:

    • 我知道这很好地回答了我的问题。但如果有任何方法可以得到这样的哈希值。 {"parentNode"=&gt;{"amount"=&gt;"12.0", "authIdCode"=&gt;"999999", "currency"=&gt;"USD"} } ...所以无论 parentNode 名称如何,它都会获取节点??..但总会有一个父节点。所以不需要数组。但在某些情况下,父节点名称可能会发生变化。
    • 总是只有一个父节点有子节点?你确定吗?这意味着您的根元素是父节点。如果是这样,您可以使用 /*/* 作为您的 XPath。
    【解决方案2】:

    使用Hash[]

    Hash[doc.search('parentNode/*').map{|n| [n.name, n.text]}]
    #=> {"amount"=>"12.0", "authIdCode"=>"999999", "currency"=>"USD"}
    

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2012-12-27
      • 1970-01-01
      • 2022-12-01
      • 2018-05-22
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多