Я новичок в Ruby и чертовски долго пытался сделать даже простую прогулку по дереву моего XML, которая выглядит следующим образом:
<fx:Container>
<fx:topic>Exchange rates</fx:topic>
<fx:Provider>
<fx:name>Standard Bank</fx:name>
</fx:Provider>
<Cube>
<Cube time="2018-12-06">
<Cube currency="USD" rate="1.1351"/>
<Cube currency="JPY" rate="128.04"/>
... and more currencies
</Cube>
<Cube time="2018-12-05">
<Cube currency="USD" rate="1.1301"/>
<Cube currency="JPY" rate="129.36"/>
... and more currencies
</Cube>
... and so on for more dates
</Cube>
</fx:Container>
Там нет DTD для XML, инаименование узлов не под моим контролем.
Так что, если вы представите класс (ForEx) с тремя полями даты, валюты и курса, то я просто хочу создать коллекцию экземпляров ForEx в Ruby, уникальным ключом которой являетсядата и валюта (так что я могу поместить их в таблицу SQLite).
Я получаю переменную 'doc' очень хорошо:
doc = Nokogiri::XML(open("http://www.blahblah/forex.xml"))
Затем попробовал это и его варианты:
doc.xpath('//fx:Container//Cube')
, но продолжайте получать пустые коллекции.
Я действительно пробовал всевозможные поиски примеров этого, которые были сделаны ранее, но не могу найти ничего, что помогло бы мне.
Любая помощь приветствуется.
РЕДАКТИРОВАНИЕ:
require 'nokogiri'
require 'open-uri'
class DevDataFeed
def self.xml_parser
doc = Nokogiri::XML(open("http://www.blahblah/ForEx.xml"))
puts "doc class: " + doc.class.to_s
block = doc.xpath("//fx:Container/Cube")
puts "block class: " + block.class.to_s
puts block.count
end
end
datafeed = DevDataFeed.new
DevDataFeed.xml_parser
Вывод:
doc class: Nokogiri::XML::Document
block class: Nokogiri::XML::NodeSet
0