您如何知道何时使用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中做它。或者根本不做它。
- 如何在Ruby中将JSON转换为XML?
- 有没有办法覆盖`{}`对象?
- 无法使用cache_classes = true为Concern(ActiveSupport :: Concern :: MultipleIncludedBlocks)定义多个“包含”块
- 无法加载require_dependency
- Bundler找不到gem“activesupport”的兼容版本
- 测试使用ActiveRecord的问题/模块
- ActiveSupport :: JSON.decode无法正确处理文字换行符
- 3.days.ago,2.hours.from_now等没有Rails?
- 访问ActiveSupport :: LogSubscriber子类中的Rails请求