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

时间:2009-08-10 13:05:43

标签: ruby-on-rails web-services nokogiri hpricot activesupport

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

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

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

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

2 个答案:

答案 0 :(得分: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

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

doc = Nokogiri::HTML(...)

答案 1 :(得分:4)

我写了XmlMini因为我想回答同样的问题。 XmlMini并没有做太多的事情,这让它保持专注。但是如果你有任何问题,YAML或JSON没有资格处理,XmlMini也不会做这个工作。

例如,如果您需要验证正在处理的XML的结构,则XmlMini不是该工具。手工验证很糟糕。

同样,如果你正在处理从其他地方重用标准元素和属性语义的数据,比如包括UBL,OpenDoc或Atom的片段,你真的应该得到一些更好的命名空间工具。

ryanb提到了Nokogiri,我想不出更适合这些事情的事情。它具有libxml的所有功能,比Ruby中的几乎任何库都更优雅。我不仅仅意味着XML解析,而且还有_why最好的项目。

但是有些事情甚至Nokogiri都不是为此设计的。如果你真的,绝对,肯定需要以突破颈部速度杀死房间里的每个角度支架,你必须淘汰SAX。但如果您需要速度很快,请不要在Ruby中执行此操作。用纯粹的C在expat或libxml中做。或者根本不做。