Разбор XML с помощью Nokogiri - PullRequest
0 голосов
/ 05 мая 2011

Я не могу понять, как разобрать теги "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

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Вы можете попробовать:

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

Трюк находится в пространстве имен.

1 голос
/ 06 мая 2011

Я не смог добраться ни на один узел глубже, чем //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
...