如何加速Android XML解析?

时间:2013-01-01 21:19:37

标签: java android xml xml-parsing

下午好(取决于你住的地方)!

我是Android开发的新手,我目前正致力于将功能从现有的iOS应用程序迁移到Android。此功能的一部分是解析包含大约500个条目的“大”(~13,000行)RSS XML文件。我花了10-15个小时在Android上研究XML解析并尝试使用主要的XML解析器:DOM,SAX和Pull-parsing。以下是我的结果,在我的盒子上的模拟器(32位Windows Vista,2.2 GHz双CPU,3 GB RAM)中运行:

SAX:~6:00分钟

拉 - 解析:~4:00分钟

DOM:大于4:00分钟,但是当我编写实现代码时没有计时。

我也从github尝试过这个RSS阅读器,但是花了> 10:00分钟:

https://github.com/matshofman/Android-RSS-Reader-Library

SAX,PP和DOM的实现都是从stackoverflow.com线程中获取的,所以我非常有信心我没有做任何非标准的事情(尽管如此,我并没有把它排除在外) 。我决定呼吁更大,更有经验的人群来了解我还能尝试的其他方法。

我无法控制文件的格式。如果我实现这种端到端的方式,我只会编写一个Web服务,在服务器上完成所有繁重工作,然后发送一个小型,紧凑的JSON序列化列表。相反,我有13K行文件。 :)

对我能做什么的任何见解?这似乎是一个相当普遍的问题,但大多数响应只是说尝试不同的主要XML解析器之一。在我的情况下,我已经尝试了所有三个,甚至最快似乎太慢了。

我做错了什么?在Android上通过网络进行XML解析时,人们通常会遇到任何正常的“新手”问题

提前感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:3)

使用vtd-xml

Here are some benchmarks.

此外,模拟器速度非常慢,因此请在真实设备上进行尝试,您可能会看到很大的改进。

答案 1 :(得分:1)

我同意 Jave的回答。最好的选择是VDT-XML library 此示例演示了如何使用此库。

XML文件:

 <database name="products">
        <table name="category">
            <column name="catId">20</column>
            <column name="catName">Fruit</column>
        </table>
        <table name="category">
            <column name="catId">31</column>
            <column name="catName">Vegetables</column>
        </table>
        <table name="category">
            <column name="catId">45</column>
            <column name="catName">Rice</column>
        </table>
        <table name="category">
            <column name="catId">50</column>
            <column name="catName">Potatoes</column>
        </table>
</database>

源代码示例:

import com.ximpleware.AutoPilot;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;


String fileName = "products.xml";

VTDGen vg = new VTDGen();

if (vg.parseFile(fileName, true)) {

     VTDNav vn = vg.getNav();
     AutoPilot table = new AutoPilot(vn);
     table.selectXPath("database/table");

     while (table.iterate()) {
        String tableName = vn.toString(vn.getAttrVal("name"));

        if (tableName.equals("category")) {
            AutoPilot column = new AutoPilot(vn);
            column.selectElement("column");

            while (column.iterate()) {
                 String text = vn.toNormalizedString(vn.getText());
                 String name = vn.toString(vn.getAttrVal("name"));

                 if (name.equals("catId")) {
                    Log.d("Category ID = " + text);
                 } else if (name.equals("catName")) {
                    Log.d("Category Name = " + text);
                 } 

            }
        }
     }
}

它对我有用,希望对你有所帮助。