2010-09-02 152 views
3

與PC /服務器相比,Android設備速度更慢,內存更低,那麼在Android中處理XML的最佳方式是什麼?我有一套非常複雜的xml需要解析。 SAX或DOM都會導致太多的代碼。任何人都有很好的建議?我想讓它變得乾淨和快速Android中處理XML的最佳方式

+0

最快的XML解析LIB是VTD-XML的一個quick intro ..這裏是一個最新論文證明它sdiwc.net/digital-library/web-admin/upload-pdf/00000466.pdf – 2016-03-17 23:31:22

回答

1

不要太在意類文件的大小(「代碼」),關心應用程序的內存消耗。對於android來說,實現SAX解析器並僅提取內部數據模型所需的信息可能是明智的。

DOM構建器將爲內存中的完整XML文檔創建一個文檔,這可能會導致性能問題。

+0

我不得不關心代碼的大小,因爲xml格式可能會改變功能,我不得不擔心維護成本 – 2010-09-02 09:08:25

+0

我理解 - 我以爲你想保持代碼基礎小,因爲應用程序是爲一個機器人手機。 – 2010-09-02 09:36:02

2

您在應用程序中使用的解析器的種類取決於您的要求。你也可以試試XMLPullParser。你可以看到所有三個這裏解析器的性能..

http://www.developer.com/ws/article.php/10927_3824221_2/Android-XML-Parser-Performance.htm

有可用的幾個第三方的XML解析器太...我用這個解析器我以前的應用程序之一,它是相當快速。它有Xpath實現。

http://vtd-xml.sourceforge.net/

+1

第一個鏈接是404 - 移動到http://www.developer.com/ws/android/development-tools/Android-XML-Parser-Performance-3824221.htm – 2013-01-22 13:12:42

1

XMLPullParser看起來像提供最好的選擇。 檢查Quick Introduction to XmlPull v1 API

也看看vtd-xml。 按照他們從home page

  • 世界上最節省內存 (1.3倍〜1.5倍的XML文檔 的大小),隨機存取XML解析器。
  • 世界上最快的XML解析器:在 酷睿2.5Ghz的筆記本電腦,VTD-XML 的5倍〜12倍, 提供的每核 持續吞吐量90〜120 MB /秒,優於DOM解析器。
  • 世界上最快的XPath 1.0 的實現。
  • 世界上最高效的XML 索引器,無縫集成 與您的XML應用程序。
  • 世界上唯一的增量更新 有能力的XML分析器能夠 剪切,粘貼,拆分和 組裝XML文檔,效率最高。
  • 世界上唯一的XML解析器 允許您使用XPath處理 256 GB XML文檔。

下面的鏈接也有您可以使用各種選項:

http://www.ibm.com/developerworks/xml/library/x-android/

1

最好的辦法是SAXXMLPull。 Android爲兩者提供API。這裏的主要區別是:

  • 在SAX,分析器驅動解析並執行回調您的代碼
  • 拉出解析用戶代碼驅動的解析。

下面是XmlPull解析的例子:

try { 
    reader = new InputStreamReader(...from soem input stream); 
    XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); 
    parser.setInput(reader); 
    parser.require(XmlPullParser.START_DOCUMENT, null, null); 

    // get the event type 
    int eventType = parser.getEventType(); 

    // see what type of event it is... 
    while(eventType != XmlPullParser.END_DOCUMENT) { 
     String pName = parser.getName(); 
     switch(eventType) { 
      case XmlPullParser.START_TAG: 
       if(pName.equals("sometag")) { 
       // get the textcontent 
       String msg = parser.nextText(); 
       // get attribute value 
       String strErrCode = parser.getAttributeValue(null, "somattr"); 
       break; 
      case XmlPullParser.END_TAG: 
       if(pName.equals("sometag")) { 
       // do something 
       } 
       break; 
      default: 
       break; 
     } 

     eventType = parser.next(); // parse next and generate event 
    } // while loop 
    }catch(Exception e) { 
    String msg = e.getMessage(); 
    Log.e(TAG, "Error while parsing response: " + msg, e); 
    } 

下面是關於如何做拉解析

+0

拉解析保存了一些代碼,但代碼庫由於XML的結構非常複雜,因此仍然很大 – 2010-09-02 10:05:31