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

发布于 2024-07-30 13:31:40 字数 334 浏览 7 评论 0原文

我尝试使用 ActiveResource 解析更像 HTML 文档的 Web 服务,但不断收到 404 错误。

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

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

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

I tried using ActiveResource to parse a web service that was more like a HTML document and I kept getting a 404 error.

Do I need to use an XML parser for this task instead of ActiveResource?

My guess is that ActiveResource is only useful if you are consuming data from another Rails app and the XML data is easily translatable to a Rails model. For example, if the web service is more wide-ranging XML like a HTML document or an RSS feed, you want to use a parser like hpricot or nokogiri. Is this correct?

How do you know when to use an XML parser and when to use ActiveResource?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美人骨 2024-08-06 13:31:40

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

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


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

您可以查看正在使用哪个 XML 解析器并切换到不同的 XML 解析器。 在脚本/控制台中尝试一下。

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(...)

Update: ActiveResource is also not an XML parser. It is a REST consumer allowing you to interact with a remote resource similar to how you would an ActiveRecord model. It does use an XML parser under the hood (I'm assuming through ActiveSupport's XmlMini I show below).

ActiveResource has some strict requirements about the structure of the XML content and works best when interacting with the REST API of another Rails application. It is not intended to do generic screen scraping of an HTML page. For that use Nokogiri directly.


ActiveSupport isn't an XML parser, it is a miscellaneous collection of useful Ruby methods and classes. However, it does offer a wrapper around many different XML parsers giving you a consistent interface.

You can see which XML parser is being used and switch to a different XML parser. Try this in script/console.

ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_REXML
ActiveSupport::XmlMini.backend = 'Nokogiri'
ActiveSupport::XmlMini.backend # => ActiveSupport::XmlMini_Nokogiri
# it will now use Nokogiri

However, that will still use the XML parser in Nokogiri which assumes strict, valid markup. Most HTML pages do not fit this strict requirement and therefore it is better to use Nokogiri's HTML parser directly instead of going through ActiveSupport.

doc = Nokogiri::HTML(...)
行至春深 2024-08-06 13:31:40

我编写 XmlMini 是因为我想回答同样的问题。 XmlMini 实际上并没有做太多事情,但这让它能够保持专注。 但是,如果您遇到 YAML 或 JSON 无法处理的任何问题,XmlMini 也无法完成这项工作。

例如,如果您需要验证正在处理的 XML 的结构,那么 XmlMini 就不是合适的工具。 手动验证是很糟糕的。

同样,如果您正在处理从其他地方重用标准元素和属性语义的数据,例如包含 UBL、OpenDoc 或 Atom 的片段,那么您确实应该获得一些更好的命名空间工具。

ryanb 提到了 Nokogiri,我想不出还有比这些更美妙的事情了。 它具有 libxml 的所有功能,并且比 Ruby 中的几乎任何库都更加优雅。 我指的不仅仅是 XML 解析,它与 _why 的最佳项目不相上下。

但有些事情甚至连 Nokogiri 也不是为之设计的。 如果你真的、绝对、确实需要以极快的速度消灭房间里的每个尖括号,那么你就必须淘汰 SAX。 但如果您非常需要速度,请不要使用 Ruby。 使用纯 C 在 expat 或 libxml 中执行此操作。或者根本不执行此操作。

I wrote XmlMini because I wanted to answer that same question. XmlMini doesn't really do much, and that lets it stay focused. But if you have any problem that YAML or JSON isn't qualified to handle, XmlMini isn't going to do the job either.

For example, if you've got any need to validate the structure of the XML you're dealing with, XmlMini isn't the tool. Validating by hand is awful.

Similarly, if you're dealing with data that reuses standard element and attribute semantics from somewhere else, like including snippets of UBL, OpenDoc or Atom, you really should get some better tools for namespaces.

ryanb mentions Nokogiri, and I can't think of anything more wonderful for these things. It's got all the power of libxml, with more elegance than almost any library in Ruby. I don't just mean for XML parsing, it's up there with _why's best projects.

But there are some things that even Nokogiri isn't designed for. If you really, absolutely, positively need to kill every angle bracket in the room at break neck speed, you've got to bust out SAX. But if you need speed that badly, don't do it in Ruby. Do it in expat or libxml with pure C. Or don't do it at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文