Java 如何加快Android XML解析速度?

Java 如何加快Android XML解析速度?,java,android,xml,xml-parsing,Java,Android,Xml,Xml Parsing,下午好(取决于你住在哪里) 我对安卓系统的开发相当陌生,目前正致力于将现有的iOS应用程序的功能转移到安卓系统。此功能的一部分是解析一个“大”(~13000行)RSS XML文件,该文件包含大约500个条目。我花了10到15个小时在Android上研究XML解析,并尝试了主要的XML解析器:DOM、SAX和Pull解析。以下是我的结果,运行在“我的机器上的模拟器”(32位Windows Vista,2.2 GHz双CPU,3 GB RAM): 萨克斯:~6:00分钟 拉动解析:~4:00分钟 D

下午好(取决于你住在哪里)

我对安卓系统的开发相当陌生,目前正致力于将现有的iOS应用程序的功能转移到安卓系统。此功能的一部分是解析一个“大”(~13000行)RSS XML文件,该文件包含大约500个条目。我花了10到15个小时在Android上研究XML解析,并尝试了主要的XML解析器:DOM、SAX和Pull解析。以下是我的结果,运行在“我的机器上的模拟器”(32位Windows Vista,2.2 GHz双CPU,3 GB RAM):

萨克斯:~6:00分钟

拉动解析:~4:00分钟

DOM:超过4:00分钟,但在我编写实现代码时没有计时

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

SAX、PP和DOM的实现都是从stackoverflow.com线程中获取的,因此我很有信心我没有在它们中做任何非标准的事情(尽管我不排除这一点)。我决定吸引更多、更有经验的人群,让他们了解我还可以尝试什么

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

我能做些什么?这似乎是一个相当常见的问题,但大多数回答只是说尝试不同的主XML解析器之一。就我而言,我已经尝试了所有三种方法,即使是最快的也似乎太慢了

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

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

使用


另外,模拟器的速度非常慢,所以在真正的设备上试用,您可能会看到很大的改进。

我同意贾维的回答。最好的选择是 此示例演示如何使用此库

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>

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

是静态内容吗?您可以将其转换为JSON(有在线转换器和许多文本编辑器可以完成这项工作)。对于常规数据,JSON要快得多。不幸的是,它不是静态的——随着记录更多消息,它每周会更改几次。不过,你的建议很有趣。因为它很少改变,所以我可以周期性地转换它,但这只是给我必须处理的混合添加了一些其他东西。很好的信息,我会考虑你的建议。端到端(希望是json)位。如果你写了一个背驮式服务器应用程序呢。我在源内容不正常的时候为我的应用程序做了这些。我的应用程序点击了一个点击实际目的地的服务。将它加载到heroku(免费)上,一切都很好。最大的问题,正如你所逃避的,是模拟器非常慢。在我的电脑上,XML解析代码需要7-8分钟。在运行安卓2.3.3的老LG LS670上,花了6秒!使用真实设备带来的“巨大改进”是今年的轻描淡写。哈再次感谢您的帮助。选择运行x86模拟器也会大大加快速度。拉取和加载数据只需17秒。这里有一篇关于安装它的不错的文章:我没有硬件加速,它仍然快得多。考虑到PPC,黑莓甚至palm都有模拟器,就像十只熊在追逐它们一样。
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);
                 } 

            }
        }
     }
}