Не могу получить ruby ​​для анализа моего XML с Nokogiri - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в 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

1 Ответ

0 голосов
/ 07 декабря 2018

Вам необходимо передать информацию о пространстве имен в xpath, например:

block = doc.xpath("//fx:Container/Cube", 'fx' => '???')

Или использовать:

block = doc.xpath("//*[local-name()='Container']/Cube")

Или вообще удалить пространства имен:

doc.remove_namespaces!
block = doc.xpath("//fx:Container/Cube")
...