2011-09-26 92 views
65

我在這個主題上搜索了一段時間,發現了一些結果,我在帖子末尾提到了這些結果。有人可以幫我準確地回答下面列出的三個問題嗎?Groovy XmlSlurper vs XmlParser

  1. 對於該使用情況使用XmlSluper更有意義比XmlParser的,反之亦然(視圖中易於使用API​​ /語法中的點)?

  2. 哪一個更有記憶效率? (看起來像Slurper)

  3. 哪一個更快地處理xml?案例a。

案例a。當我必須讀取xml中的幾乎所有節點?案例b。當我必須只讀幾個節點(如使用gpath表達式)?

案例c。當我必須更新/轉換XML?

提供的xml文檔不是微不足道的(具有深度和尺寸的xml級別)。

資源

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.html狀態:

用於 簡單的閱讀時,有XMLParser的和的XmlSlurper之間的相似性,但是當我們把它們用於:XMLParser的和的XmlSlurper之間

差異高級閱讀和 處理其他格式的XML文檔有差異 兩者之間。

XMLParser在解析文檔後存儲中間結果。但在 另一方面,

XMLSlurper處理XML 文檔後不存儲內部結果。

處理解析後的信息時,真正的根本區別將變得明顯。這是在流式場景中使用直接就地數據處理和處理時處理的情況。

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

Groovy的文檔(XmlParserXmlSlurper)和常規的網站解釋說得好(herehere),但在解釋上述問題並沒有做大量的工作。

回答

90

XmlSlurper和XmlParser最大的區別在於Parser會創建類似於DOM的東西,而Slurper只是在真正需要的時候纔會嘗試創建結構,並因此使用延遲評估的路徑。對於用戶來說,兩者看起來可以非常平等不同之處在於解析器結構僅評估一次,可以根據需要評估更新器路徑。在需求可以被認爲是「更高的內存效率,但更慢」在這裏。最終取決於你做了多少路徑/請求。例如,如果您只想知道XML特定部分中某個屬性的值,然後完成它,則XmlParser仍會處理所有內容並在準DOM上執行您的查詢。因爲會創建很多對象,內存和CPU花費。 XmlSlurper不會創建對象,從而節省內存和CPU。如果您仍然需要文檔的所有部分,則slurper將失去優勢,因爲它將創建至少與解析器一樣多的對象。

兩者都可以對文檔進行轉換,但是slurper認爲它是一個常量,因此您必須首先編寫更改並創建新的slurper來讀取新的xml。解析器支持查看更改遠。

因此,問題(1)的答案是用例,如果必須處理整個XML,則使用解析器。 API和語法在這方面並沒有真正起到很大的作用。 Groovy人試圖讓這兩個用戶體驗非常相似。如果您想對XML進行增量更改,您也會更喜歡解析器而不是XML。

上面的介紹也解釋了什麼是更高的內存效率,問題(2)。無論如何,除非你讀完所有的解析器,否則解析器可能,但是我沒有實際的數字來說明那時差異有多大。

也可以通過介紹回答問題(3)。如果您有多個延遲評估路徑,則必須再次進行評估,然後這可能會比您在解析器中導航現有圖形時慢。所以解析器可以更快,這取決於您的使用情況。所以我會說(3a)讀取幾乎所有的節點本身並沒有太大區別,因爲這樣的請求才是更重要的決定因素。但是在(3b)的情況下,如果你只需要讀取幾個節點,我會說slurper速度更快,因爲它不需要在內存中創建一個完整的結構,這本身已經花費了時間和內存。 (3c)...現在,這兩天都可以更新/轉換XML,而更快的XML實際上更多地與您必須更改的xml的多少部分相關聯。如果很多部分我會說解析器,如果不是的話,那麼也許就是slurper。但是,如果您想要使用slurper將屬性值從「Fred」更改爲「John」,則稍後使用相同的slurper查詢此「John」時,它將不起作用。

+0

關於slurper更新的真棒解釋,謝謝。這解決了我的問題,當試圖刪除節點遞歸時,當在一個slurper「空」,這當然是行不通的。 – sandos