首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Rails)无法机械化以正确读取web xml文件

(Rails)无法机械化以正确读取web xml文件
EN

Stack Overflow用户
提问于 2012-02-19 00:12:01
回答 2查看 1.9K关注 0票数 0

我必须读取可通过带身份验证的http访问的xml文件。这就是我使用机械化的原因。

我的问题是我不能机械地识别这些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),并尝试加载仍被视为::文件的csv文件。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-22 04:21:36

好了,我刚才自己解决了这个问题。解决方案分为两部分:

首先,您匹配的内容类型不正确。如果运行此行,在执行get之后,它将告诉您正在获取的文档的内容类型:

代码语言:javascript
复制
page.response['content-type'] # => 'application/xml', not 'text/xml'

当我使用mechanize获取你的页面(‘http://dl.dropbox.com/u/344349/xml.xml'’)时,我看到'application/xml‘作为内容类型。

其次,您没有正确使用PluggableParser。按照这里的方式使用XMLParser将生成NoMethodError: undefined method 'parse' for nil:NilClass。更改类定义,改为使用Nokogiri::XML:

代码语言:javascript
复制
class XmlParser < Mechanize::File
  attr_reader :xml
  def initialize(uri = nil, response = nil, body = nil, code = nil)
    @xml = Nokogiri::XML(body)
    super uri, response, body, code
  end
end

然后,将其设置为正确内容类型的解析器:

代码语言:javascript
复制
mech.pluggable_parser['application/xml'] = XmlParser

要使用此方法,您将获得与以前相同的页面,然后将页面对象的xml属性作为Nokogiri::XML::Document实例引用,该实例是Nokogiri::XML::Node的子类。幸运的是,Mechanize::Page.search只是Nokogiri::XML::Node.search的一个包装器,所以您可以使用与预期相同的方式进行搜索。如下所示:

代码语言:javascript
复制
page.xml.search 'catalog'

进一步的改进是将XmlParser.search映射到Nokogiri .search方法:

代码语言:javascript
复制
# This is the same as what Mechanize::Page does
class XmlParser < Mechanize::File
  extend Forwardable
  def_delegators  :@xml, :search, :/, :at
end

这使您可以直接在页面实例上执行搜索:

代码语言:javascript
复制
page.search 'catalog'
票数 3
EN

Stack Overflow用户

发布于 2012-11-22 11:43:54

您可以更改解析器以使用Page类,如下所示:

代码语言:javascript
复制
agent = Mechanize.new
agent.pluggable_parser.default = Mechanize::Page
agent.get("http://dl.dropbox.com/u/344349/xml.xml").class # Mechanize::Page

请参阅http://mechanize.rubyforge.org/Mechanize/PluggableParser.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9342749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档