我是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>
XML没有DTD,节点的命名不受我的控制。
因此,如果您想象一个包含日期,货币和汇率三个字段的类(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
答案 0 :(得分:2)
您需要将名称空间信息传递给xpath
,例如:
block = doc.xpath("//fx:Container/Cube", 'fx' => '???')
或使用:
block = doc.xpath("//*[local-name()='Container']/Cube")
或完全删除名称空间:
doc.remove_namespaces!
block = doc.xpath("//fx:Container/Cube")