2010-09-02 112 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