我想使用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>
你能提出一些问题的解决方案吗?
答案 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
对评论的回应:
Rails
有Hash#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)
...