Я не могу понять, как разобрать теги "author" и "fact" из следующего XML.Если форматирование выглядит странно , вот ссылка на документ XML.
<response stat="ok"> −<ltml version="1.1"> −<item id="5403381" type="work"> <author id="21" authorcode="rowlingjk">J. K. Rowling</author> <url>http://www.librarything.com/work/5403381</url> −<commonknowledge> −<fieldList> −<field type="42" name="alternativetitles" displayName="Alternate titles"> −<versionList> −<version id="3413291" archived="0" lang="eng"> <date timestamp="1298398701">Tue, 22 Feb 2011 13:18:21 -0500</date> −<person id="18138"> <name>ablachly</name> <url>http://www.librarything.com/profile/ablachly</url> </person> −<factList> <fact>Harry Potter and the Sorcerer's Stone </fact> </factList> </version> </versionList> </field>
Пока я пробовал этот код, чтобы получить автора, но он не работает:
@xml_doc = Nokogiri::XML(open("http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=0590353403&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4")) @xml_doc.xpath('//response').each do |n| @author = n end
Вы можете попробовать:
nodes = @xml_doc.xpath("//xmlns:author", "xmlns" => "http://www.librarything.com/") puts nodes[0].inner_text nodes = @xml_doc.xpath("//xmlns:fact", "xmlns" => "http://www.librarything.com/") nodes.each do |n| puts n.inner_text end
Трюк находится в пространстве имен.
Я не смог добраться ни на один узел глубже, чем //response, используя предоставленную вами ссылку. В итоге я использовал Nokogiri::XML::Reader и поместил элементы в хеш, так как может быть несколько авторов и определенно много фактов. Вы можете использовать любую структуру данных, которая вам нравится, но она получает содержимое тегов fact и author:
//response
Nokogiri::XML::Reader
fact
author
require 'nokogiri' require 'open-uri' url = "http://www.librarything.com/services/rest/1.1/?method=librarything.ck.getwork&isbn=0590353403&apikey=d231aa37c9b4f5d304a60a3d0ad1dad4" reader = Nokogiri::XML::Reader(open(url)) book = { author: [] fact: [] } reader.each do |node| book.each do |k,v| if node.name == k.to_s && !node.inner_xml.empty? book[k] << node.inner_xml end end end