【发布时间】:2012-03-09 17:00:28
【问题描述】:
我必须通过身份验证读取可通过 http 访问的 xml 文件。这就是我使用机械化的原因。
我的问题是我无法通过 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 文档说:这是可插入解析器的默认(和基)类。如果 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) 并尝试加载仍被视为 ::File 的 csv 文件。
我做错了什么?
【问题讨论】:
标签: ruby-on-rails xml ruby-on-rails-3 parsing mechanize