2009-08-10 68 views
2

我嘗試使用ActiveResource來解析更像HTML文檔的Web服務,並且一直在收到404錯誤。您如何知道何時使用XML解析器以及何時使用ActiveResource?

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

我的猜測是,ActiveResource僅用於從另一個Rails應用程序中獲取數據並且XML數據可以輕鬆轉換爲Rails模型。例如,如果Web服務是更廣泛的XML(如HTML文檔或RSS源),則需要使用解析器(如hpricot或nokogiri)。它是否正確?

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

回答

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

謝謝,瑞恩!我實際上是按照您在第一個屏幕錄像中給出的使用ActiveSupport定義模型並將數據從一個應用程序傳遞到另一個應用程序的說明。即使資源在瀏覽器中可用,我仍然收到404。這就是爲什麼我認爲它可能與來自外部服務的數據格式不能被ActiveSupport接受有關。 – chimp 2009-08-10 17:21:27

+0

你指的是哪一集?你的意思是ActiveResource? – ryanb 2009-08-10 17:51:32

+0

該死的,我一直在談論ActiveSupport時我一直在談論ActiveResource。我很抱歉。 – chimp 2009-08-10 19:57:07

4

我寫了XmlMini,因爲我想回答同樣的問題。 XmlMini並沒有太多的功能,這讓它保持專注。但是如果您有任何YAML或JSON無法處理的問題,那麼XmlMini也不會去做這件事。

例如,如果您有任何需要驗證所處理XML的結構,XmlMini不是該工具。用手驗證是非常糟糕的。同樣,如果你要處理的是從其他地方重用標準元素和屬性語義的數據,比如包含UBL,OpenDoc或Atom的片段,你真的應該爲命名空間獲得一些更好的工具。

ryanb提到Nokogiri,我想不出有什麼比這些更美妙的東西。它具有libxml的所有功能,比Ruby中的幾乎任何庫更優雅。我不只是指XML解析,而是_why最好的項目。

但有些事情,即使Nokogiri不是爲了設計。如果你真的,絕對肯定需要殺死房間裏的每個角度支架,那麼你就必須破解SAX。但是如果你需要的速度很糟糕,不要在Ruby中做。用純C在expat或libxml中執行它,或者完全不執行它。

相關問題