【问题标题】:How Can I Speed Up Android XML Parsing?如何加快 Android XML 解析速度?
【发布时间】:2012-12-16 08:44:41
【问题描述】:

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

我对 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解析时,人们通常会遇到什么正常的“新手”问题???

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

【问题讨论】:

  • 是静态内容吗?您可以将其转换为 JSON(有在线转换器和一些可以完成这项工作的文本编辑器)。对于常规数据,JSON 更快。
  • 很遗憾,它不是静态的 - 随着更多消息的记录,它每周更改几次。不过,您的建议很有趣。由于它很少更改,因此我可以定期对其进行转换,但这只会在我必须处理的组合中添加其他内容。很好的信息,我会考虑您的建议。
  • 端到端(希望是 json)位。如果您编写了一个搭载服务器应用程序会怎样。当源内容很疯狂时,我已经为我的应用程序这样做了。我的应用程序点击了一个到达实际目的地的服务。在heroku(免费)上加载它,一切都很好。

标签: java android xml xml-parsing


【解决方案1】:

使用vtd-xml

Here are some benchmarks.

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

【讨论】:

  • 最大的问题,正如你所逃避的,是模拟器非常慢。在我的 PC 上,XML 解析代码需要 7-8 分钟。在运行 Android 2.3.3 的旧 LG LS670 上,耗时 6 秒!使用真实设备带来的“巨大改进”是今年的轻描淡写。哈!再次感谢您的帮助。
  • 选择运行 x86 模拟器也可以加快速度 - 显着。拉取和加载数据仅需 17 秒。这是一篇关于安装它的不错的文章:pommepause.com/blog/2012/09/…我没有硬件加速,它仍然更快。
  • 令人惊讶的是模拟器的速度有多慢。考虑到PPC,黑莓甚至掌上都有模拟器,跑起来就像十只熊在追他们。
【解决方案2】:

我同意 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);
                 } 

            }
        }
     }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多