您如何知道何时使用XML解析器以及何时使用ActiveResource?

chi*_*imp 2 web-services hpricot ruby-on-rails activesupport nokogiri

我尝试使用ActiveResource来解析更像HTML文档的Web服务,并且我一直收到404错误.

我是否需要为此任务使用XML解析器而不是ActiveResource?

我的猜测是,ActiveResource仅在您使用其他Rails应用程序中的数据时才有用,并且XML数据可以轻松转换为Rails模型.例如,如果Web服务是更广泛的XML(如HTML文档或RSS源),则需要使用像hpricot或nokogiri这样的解析器.它是否正确?

您如何知道何时使用XML解析器以及何时使用ActiveResource?

rya*_*anb 7

更新: ActiveResource也不是XML解析器.它是一个REST使用者,允许您与远程资源进行交互,类似于ActiveRecord模型的方式.它确实使用了一个XML解析器(我假设通过下面显示的ActiveSupport的XmlMini).

ActiveResource对XML内容的结构有一些严格的要求,并且在与另一个Rails应用程序的REST API交互时效果最佳.它不打算对HTML页面进行通用屏幕抓取.为此直接使用Nokogiri.


ActiveSupport不是XML解析器,它是有用的Ruby方法和类的各种集合.但是,它确实为许多不同的XML解析器提供了一个包装器,为您提供了一致的接口.

您可以查看正在使用的XML解析器并切换到其他XML解析器.试试吧script/console.

ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_REXML
ActiveSupport::XmlMini.backend = 'Nokogiri'
ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_Nokogiri
# it will now use Nokogiri
Run Code Online (Sandbox Code Playgroud)

但是,它仍将使用Nokogiri中的XML解析器,它假设严格有效的标记.大多数HTML页面都不符合这一严格要求,因此最好直接使用Nokogiri的HTML解析器,而不是通过ActiveSupport.

doc = Nokogiri::HTML(...)
Run Code Online (Sandbox Code Playgroud)