Я должен прочитать XML-файлы, доступные через http с аутентификацией.Вот почему я использую Mechanize.
Моя проблема в том, что я не могу заставить Mechanize распознавать эти XML-файлы, поэтому я могу использовать .find или .search для них.
Вот что я пыталсяпервое - на мой взгляд (html-файл)
<% agent = Mechanize.new %>
<% page = agent.get("http://dl.dropbox.com/u/344349/xml.xml") %>
<%= page %>
Что возвращает #<Mechanize::File:0x007f9dd602de30>
.Это ::File
, а не ::Page
Я не могу использовать .find или .search для этого, так как это приведет к ошибке с undefined method find for #<Mechanize::File:0x007f9dd624cbd0>
Mechanize doc говорит: Это класс по умолчанию (и базовый)для сменных парсеров.Если Mechanize не может найти подходящий класс для использования в качестве типа контента, этот класс будет использоваться.Например, если вы загрузите JPG, Mechanize не будет знать, как его анализировать, поэтому будет создан экземпляр этого класса.
Итак, я создал класс, как описано здесь: http://rdoc.info/github/tenderlove/mechanize/master/Mechanize/PluggableParser
My class
class XMLParser < Mechanize::File
attr_reader :xml
def initialize(uri=nil, response=nil, body=nil, code=nil)
super(uri, response, body, code)
@xml = xml.parse(body)
end
end
и обновленный код на мой взгляд (html-файл)
<% agent = Mechanize.new %>
<% agent.pluggable_parser['text/xml'] = XMLParser %>
<% agent.user_agent_alias = 'Windows Mozilla' %>
<% page = agent.get("http://dl.dropbox.com/u/344349/xml.xml") %>
<%= page %>
или даже
<% agent = Mechanize.new %>
<% agent.pluggable_parser.xml = XMLParser %>
<% page1 = agent.get('http://dl.dropbox.com/u/344349/xml.xml') # => CSVParser %>
<%= page1 %>
Все еще возвращает #<Mechanize::File:0x007f9dd5253b48>
Я даже проверял точный код (CSVParser - http://rdoc.info/github/tenderlove/mechanize/master/Mechanize/PluggableParser) и попытался загрузить CSV-файл, который все еще рассматривается как :: File.
Что я делаю не так?