我尝试使用ActiveResource来解析更像HTML文档的Web服务,并且我一直收到404错误。
我是否需要为此任务使用XML解析器而不是ActiveResource?
我的猜测是ActiveResource仅在您使用来自其他Rails应用程序的数据时才有用,并且XML数据可以轻松转换为Rails模型。例如,如果Web服务是更广泛的XML(如HTML文档或RSS源),则需要使用像hpricot或nokogiri这样的解析器。这是对的吗?
您如何知道何时使用XML解析器以及何时使用ActiveResource?
答案 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中做。或者根本不做。