Как да анализирате XML с Mechanize и XMLSimple в ruby?

Опитвам се да извлека отдалечен XML файл с Mechanize, за да получа информация за състоянието на icecast. Но имам проблеми с предаването на XML файла от Mechanize::File формат към низ или някакъв XML формат, който XMLSimple може да работи с.

XML документът изглежда така:

<icestats>
  <admin>[email protected]</admin>
  <!-- ... -->
</icestats>

Моят код изглежда така в момента:

require 'mechanize'
require 'xmlsimple'

server = 'example.net'
port = 8000
user = 'stackoverflow'
password = 'hackme'
agent = Mechanize.new
agent.user_agent_alias = 'Linux Firefox'
agent.add_auth("http://#{server}:#{port}/admin/status.xml", user, password)
agent.get("http://#{server}:#{port}/admin/status.xml")
xml = agent.current_page
status = XmlSimple.xml_in(xml)
puts status['admin']

Това трябва да изведе: [email protected]

Но хвърля:

/home/user/.gem/ruby/1.9.1/gems/xml-simple-1.1.2/lib/xmlsimple.rb:191:in 'xml_in': Could not parse object of type: <Mechanize::File>. (ArgumentError)

Сега разбирам, че XMLSimple се нуждае от низ и затова се опитах да преобразувам формата Mechanize::File в низ, заменяйки последния последен ред с:

status = XmlSimple.xml_in(xml.to_s)

Но това хвърля още по-странно изключение:

/usr/lib64/ruby/1.9.1/rexml/parsers/baseparser.rb:406:in `block in pull_event': Undefined prefix Mechanize: found (REXML::UndefinedNamespaceException)
  from /usr/lib64/ruby/1.9.1/set.rb:222:in `block in each'
  from /usr/lib64/ruby/1.9.1/set.rb:222:in `each_key'
  from /usr/lib64/ruby/1.9.1/set.rb:222:in `each'
  from /usr/lib64/ruby/1.9.1/rexml/parsers/baseparser.rb:404:in `pull_event'
  from /usr/lib64/ruby/1.9.1/rexml/parsers/baseparser.rb:183:in `pull'
  from /usr/lib64/ruby/1.9.1/rexml/parsers/treeparser.rb:22:in `parse'
  from /usr/lib64/ruby/1.9.1/rexml/document.rb:231:in `build'
  from /usr/lib64/ruby/1.9.1/rexml/document.rb:43:in `initialize'
  from /home/user/.gem/ruby/1.9.1/gems/xml-simple-1.1.2/lib/xmlsimple.rb:965:in `new'
  from /home/user/.gem/ruby/1.9.1/gems/xml-simple-1.1.2/lib/xmlsimple.rb:965:in `parse'
  from /home/user/.gem/ruby/1.9.1/gems/xml-simple-1.1.2/lib/xmlsimple.rb:164:in `xml_in'
  from /home/user/.gem/ruby/1.9.1/gems/xml-simple-1.1.2/lib/xmlsimple.rb:203:in `xml_in'
  from debugging.rb:16:in `<main>'

Какво не е наред с моя подход? Когато изтегля XML файла и използвам локалния XML файл, кодът по-горе работи по желание.

Особено търся решения с Mechanize, а не с Nokogiri.


person Afr    schedule 27.02.2013    source източник


Отговори (1)


Опитайте да промените:

xml = agent.current_page

to:

xml = agent.current_page.body
person pguardiario    schedule 28.02.2013