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

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

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

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

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

更新: 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(...) 

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

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

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

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

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