未定义的方法`dig&#39;对于#<string:0x007f91d8579308>

时间:2018-01-30 14:30:20

标签: ruby rspec

我想使用dig来获取XML标记值。我试过这个:

new_xml_body = Nokogiri::XML(new_xml)
new_trx_id = new_xml_body.search('transaction_id').first.text

使用dig:

require 'nokogiri'
require 'nori'
require 'pry'
require 'active_model'
require 'ruby_dig'
new_xml_body = Nokogiri::XML(new_xml)
new_trx_id = new_xml_body.dig('transaction_id')

但我明白了:

NoMethodError:
       undefined method `dig' for #<String:0x007f91d8579308>

你能提出一些问题的解决方案吗?

1 个答案:

答案 0 :(得分:2)

Nokogiri搜索示例:

require 'nokogiri'

xml_doc  = Nokogiri::XML %q{
<root>
  <aliens>
    <alien>
      <name>Alf</name>
    </alien>
    <human>
      <name>Peter</name>
    </human>
    <alien>
      <name>Bob</name>
    </alien>
  </aliens>
</root>
}

alien_names = xml_doc.xpath('//alien/name/text()')

alien_names.each do |name|
  puts name
end

--output:--
Alf
Bob

xml_doc  = Nokogiri::XML %q{
<root>
  <aliens>
    <alien planet="Mars">
      <name>Alf</name>
    </alien>
    <human>
      <name>Peter</name>
    </human>
    <alien planet="Alpha Centauri">
      <name>Bob</name>
    </alien>
  </aliens>
</root>
}

alien_names = xml_doc.xpath('//alien[@planet="Alpha Centauri"]/name/text()')

alien_names.each do |name|
  puts name
end

--output:--
Bob

如果您了解css,还可以使用css selectors

name_tags = xml_doc.css('alien > name')

name_tags.each do |name_tag|
  puts name_tag.text
end

--output:--
Alf
Bob

对评论的回应

RailsHash#from_xml()方法。以下是使用dig()

的示例
require 'active_support/core_ext/hash/conversions'
require 'pp'

xml = %q{
<aliens>
  <alien planet="Mars">
    <name>Alf</name>
  </alien>
  <human>
    <name>Peter</name>
  </human>
  <alien planet="Alpha Centauri">
    <name>Bob</name>
  </alien>
</aliens>
}

hash = Hash.from_xml(xml)   #rails method
pp hash
p hash.dig 'aliens', 'human', 'name'
p hash['aliens']['human']['name']

--output:--
{"aliens"=>
  {"alien"=>
    [{"planet"=>"Mars", "name"=>"Alf"},
     {"planet"=>"Alpha Centauri", "name"=>"Bob"}],
   "human"=>{"name"=>"Peter"}}}

"Peter"
"Peter"

如果您需要先通过nokogiri运行xml字符串,那么只需执行

doc = Nokogiri:XML(xml)
string = doc.to_s
hash = Hash.from_xml(string)
...