Резюме
Вместо этих строк:
id = topic.at_xpath("@topicid")
name = topic.at_xpath("@topicname")
Используйте вместо этого:
id = topic['topicid']
name = topic['topicname']
Объяснение
Давайте рассмотрим простой тестовый пример:
require 'nokogiri'
xml = Nokogiri::XML("<root foo='bar' />")
foo = xml.root.at_xpath('@foo')
puts foo
#=> bar
p foo
#=> #<Nokogiri::XML::Attr:0x15c1d64 name="foo" value="bar">
p foo.text
#=> "bar"
p xml.root['foo']
#=> "bar"
Как видно из вышесказанного, выбор атрибута через XPath фактически дает вам узел Attr
, который не совпадает со строковым значением этого атрибута. (Использование puts
заставляет метод Attr to_s
показывать вам только значение, но это не значит, что это на самом деле строка.)
Как показано выше, вам нужно использовать метод text
(или value
или content
) на узлах Attr, чтобы получить строковое значение, которое вы действительно хотели:
id = topic.at_xpath("@topicid").text
name = topic.at_xpath("@topicname").text
В качестве альтернативы (и более просто) используйте метод Element#[]
для непосредственного извлечения значения атрибута элемента:
id = topic['topicid']
name = topic['topicname']