2013-02-27 2 views
2

Я пытаюсь получить удаленный файл XML с Mechanize, чтобы получить информацию о статусе icecast. Но у меня возникли проблемы с передачей XML-файла с Mechanize::File в строку или какой-либо XML-формат, с которым может работать XMLSimple.Как анализировать XML с помощью Mechanize и XMLSimple в ruby?

Документ 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.

ответ

3

Попробуйте изменить:

xml = agent.current_page 

к:

xml = agent.current_page.body 
Смежные вопросы