2011-04-27 109 views
19

我明白SAX解析器如何工作與XMLPull解析器的區別。 實際上這裏有一個很好的解釋:SAX解析器vs XMLPull解析器

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm 這篇文章是有點.NET爲中心,但這些概念適用。

雖然我同意作者的觀點,Pull解析器更容易處理,但我很困惑哪種類型的解析器在哪種情況下會更好。 如果任何人可以擺脫任何光線,並指出我更多的閱讀,我將不勝感激。

謝謝。

回答

16

我發現他們都吸吮。 (我有更好的解決方案建議)

您應該使用Simple annotation based XML library。我喜歡它,並將其用於我的所有項目。如果你read through the tutorial那麼我認爲你會發現它將能夠做到你想要的一切,並且更快,更少的代碼。 (因此不太容易出錯)在庫的內部,這些庫使用那些你所要求的解析器​​來完成繁重的工作。

如果需要,您可以閱讀我的blog post on including it in an Android project。 (它將工作在每個版本的Android從至少1.5起,這意味着每個人基本上)

+0

感謝Robert!我讀過它,也非常喜歡它。在我玩了一些之後,我會保存我對它的評論 – 2011-04-28 15:59:50

+0

@Robert WTF Robert :-)你的網站似乎沒有了! – dbm 2012-01-13 08:46:59

+1

@dbm:對此我很抱歉。我不得不將我的博客從一個域名轉移到另一個域名,而且這個地方還存在着錯誤的鏈接,這就是其中之一。我編輯了這篇文章,並將其鏈接到博客移動到的位置。 Thankyou提醒我,我希望人們現在享受新的職位。 (我很失望,因爲它應該仍然在舊主機上投擲301重定向)。 – 2012-01-13 12:02:02

1

我發現SAX模型在一個特定的情況下更容易處理:您將在哪裏構建您自己的具有自定義數據結構的整個文檔(或至少其主要部分)的內存中表示。 (如果你對數據結構沒有特別的瞭解,那麼DOM解析器已經這樣做了。)

2

這兩個解析器基本上都是相同的內存/時間明智的。 唯一的事情就是用pull語法分析器,你可以抽出像startelement和endelement這樣的事件,只聽你想要的。

與android sax解析器一樣,您別無選擇,只需將代碼放在您想要的位置,但必須包含所有事件。

here是一個鏈接,你可以參考進一步閱讀。

-1

我建議使用XmlPullParser之一..薩克斯解析器沒有從我的測試中的飼料檢索標記.. xmlpullparser這樣做很容易=) 也取決於你的喜好也

9

它完全取決於情況,例如如果xml文件是真的大於你不能選擇DOM解析器,因爲他們將首先將文件進入內存,然後它將被解析,我發現解析一個大小爲n的文件需要7n內存空間。在這種情況下,您應該選擇SAX語法分析器來減輕內存消耗。

第二種情況是當文件不是很大時,在這種情況下,您可以使用XML pull parser,因爲在這裏您可以完全控制xml,您可以跳過解析週期,在SAX中不可能的地方。所以,如果你正在尋找的標籤是文件中的第一個,那麼你爲什麼要去整個文件。

所以據我所知,如果只考慮小文件的速度,請使用XML pull解析器,如果文件很大,並且想要解析所有文件,請使用SAX。

+2

鏈接被破壞... – thepoosh 2012-04-19 07:29:48

+0

沒有它的工作我高壓檢查了它... – 2012-04-20 04:42:28

+0

好吧,昨天它是表演,也許這是一個服務器端的事情 – thepoosh 2012-04-20 14:09:24

2

拉和SAX是的方式,它們是比DOM更快,更高效存儲兩個低級別的數據流的方法相似,但拉擁有SAX幾個優點:

拉是很容易,落實SAX,因爲您不必維護解析器的狀態(使用附加變量能夠知道解析器當前位於XML樹中的哪個位置)。 Pull解析器代碼中的嵌套循環將或多或少地匹配文檔的XML層次結構,因此我認爲Pull解析器代碼比SAX解析器代碼更具可讀性。

使用拉解析器代碼,您可以跳過不想分析的整個塊,因此它比總是提取所有節點的主要信息的SAX更有效。使用pull解析器,您也可以在任何時候停止解析,如果您提取了您想要的信息,這對於SAX來說是不可能的。

此外,您可以使用拉解析器實現SAX解析器。相反是不可能的。

由於所有這些原因,我認爲在所有情況下,pull語法分析器都優於SAX,但是與SAX一樣,實施正確並不是微不足道的,您必須小心。如果您不需要pull和SAX的低級速度優勢並且您的XML是乾淨的,那麼您總是可以使用更高級別的解析庫(如Simple)來幫助您完成工作。

0

我在使用SAX而不是XMLPullParser的時候發現了更好更高效的輸出......我的場景是解析XML標籤下的屬性,我可以輕鬆地將其插入到數據庫中......我認爲這取決於在需要寫XML文件時,我更喜歡DOM解析器...

public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     currentElement = true; 
     db = new DatabaseHelper(thecontext); 
     if (qName.equals("Asa.Amms.Data.Entity.User")) { 
      int length = attributes.getLength(); 
      for (int i = 0; i < length; i++) { 
       String name = attributes.getQName(i); 
       if (name.equals("Id")) { 
        id = Integer.parseInt(attributes.getValue(i)); 
       } 
       if (name.equals("Login")) { 
        LoginID = attributes.getValue(i).toString(); 
       } 
       if (name.equals("Name")) { 
        Name = attributes.getValue(i).toString(); 
       } 
       if (name.equals("Password")) { 
        Password = attributes.getValue(i).toString(); 
       } 
       if (name.equals("ProgramOfficerId")) { 
        user_ProgramOfficerId = Integer.parseInt(attributes.getValue(i).toString()); 
       } 
      } 
      Log.i("Baal dhukbe", id + LoginID + Name + Password); 

      db.insertUser(id, LoginID, Name, Password, user_ProgramOfficerId); 
     } 
}