【问题标题】:Issue with parsing big xml files in Android在 Android 中解析大 xml 文件的问题
【发布时间】:2012-01-29 03:24:28
【问题描述】:

Android 是否有任何高效的 XML 解析器来高效地解析大型 XML 文件。 XML 文档在没有 CDATA 的元素中包含 HTML 文本。

目前我在 Android 中使用 SAX Parser。当字符串在 HTML 字符处中断时,我会附加字符串,但解析整个文件最多需要 4-5 分钟。一旦我开始解析模拟器就会中止。 Log cat o/p 如下图...

我目前的情况:

  1. SD 卡上的 11 MB XML 文件
  2. 文件包含 XML 中某些元素的 HTML 文本,并且未包含在 CDATA 中
  3. 模拟器在 2-3 分钟后中止

我的查询是:

  1. 在 Android 中解析大文件是否有任何实际限制
  2. 我是否应该使用对此类文件更有效的其他解析器

01-20 12:44:22.133:I/dalvikvm(19715):DALVIK 线程:
01-20 12:44:22.143: I/dalvikvm(19715): "main" prio=5 tid=1 TIMED_WAIT
01-20 12:44:22.143:我/dalvikvm(19715):| group="main" sCount=1 dsCount=0 s=N obj=0x4001d8e0 self=0xccb0
01-20 12:44:22.143:我/dalvikvm(19715):| sysTid=19715 nice=0 sched=0/0 cgrp=默认句柄=-1345026008
01-20 12:44:22.143:我/dalvikvm(19715):| schedstat=( 1890827936 745978586 1231 )
01-20 12:44:22.143: I/dalvikvm(19715): at java.lang.Object.wait(Native Method)
01-20 12:44:22.143: I/dalvikvm(19715): - 等待 (一个 android.os.MessageQueue)
01-20 12:44:22.143: I/dalvikvm(19715): 在 java.lang.Object.wait(Object.java:326)
01-20 12:44:22.143: I/dalvikvm(19715): 在 android.os.MessageQueue.next(MessageQueue.java:142)
01-20 12:44:22.143: I/dalvikvm(19715): 在 android.os.Looper.loop(Looper.java:110)
01-20 12:44:22.143: I/dalvikvm(19715): 在 android.app.ActivityThread.main(ActivityThread.java:4627)
01-20 12:44:22.143: I/dalvikvm(19715): 在 java.lang.reflect.Method.invokeNative(Native Method)
01-20 12:44:22.152: I/dalvikvm(19715): 在 java.lang.reflect.Method.invoke(Method.java:521)
01-20 12:44:22.152: I/dalvikvm(19715): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-20 12:44:22.152: I/dalvikvm(19715): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-20 12:44:22.152: I/dalvikvm(19715): at dalvik.system.NativeStart.main(Native Method)
01-20 12:44:22.152: I/dalvikvm(19715): "AsyncTask #1" prio=5 tid=7 RUNNABLE
01-20 12:44:22.152:我/dalvikvm(19715):| group="main" sCount=0 dsCount=0 s=N obj=0x44e98170 self=0x116238
01-20 12:44:22.152:我/dalvikvm(19715):| sysTid=19721 nice=0 sched=0/0 cgrp=默认句柄=1139576
01-20 12:44:22.162:我/dalvikvm(19715):| schedstat=( 30192250334 11754013998 4287 )
01-20 12:44:22.162: I/dalvikvm(19715): 在 java.lang.AbstractStringBuilder.(AbstractStringBuilder.java:~89)
01-20 12:44:22.162: I/dalvikvm(19715): 在 java.lang.StringBuilder.(StringBuilder.java:96)
01-20 12:44:22.162: I/dalvikvm(19715): at com.app.sampleApp.ExampleHandler.characters(ExampleHandler.java:346)
01-20 12:44:22.162: I/dalvikvm(19715): at org.apache.harmony.xml.ExpatParser.text(ExpatParser.java:167)
01-20 12:44:22.162: I/dalvikvm(19715): at org.apache.harmony.xml.ExpatParser.append(Native Method)
01-20 12:44:22.162: I/dalvikvm(19715): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:521)
01-20 12:44:22.162: I/dalvikvm(19715): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:482)
01-20 12:44:22.162: I/dalvikvm(19715): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:320)
01-20 12:44:22.162: I/dalvikvm(19715): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:277)
01-20 12:44:22.162: I/dalvikvm(19715): at com.app.sampleApp.SplashScreen.parsing(SplashScreen.java:95)
01-20 12:44:22.162: I/dalvikvm(19715): at com.app.sampleApp.SplashScreen$FetchDataFromServer.doInBackground(SplashScreen.java:66)
01-20 12:44:22.162: I/dalvikvm(19715): at com.app.sampleApp.SplashScreen$FetchDataFromServer.doInBackground(SplashScreen.java:1)
01-20 12:44:22.173: I/dalvikvm(19715): 在 android.os.AsyncTask$2.call(AsyncTask.java:185)
01-20 12:44:22.173: I/dalvikvm(19715): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-20 12:44:22.173: I/dalvikvm(19715): 在 java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-20 12:44:22.173: I/dalvikvm(19715): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
01-20 12:44:22.173: I/dalvikvm(19715): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
01-20 12:44:22.173: I/dalvikvm(19715): 在 java.lang.Thread.run(Thread.java:1096)
01-20 12:44:22.173: I/dalvikvm(19715): "Binder Thread #2" prio=5 tid=6 NATIVE
01-20 12:44:22.173:我/dalvikvm(19715):| group="main" sCount=1 dsCount=0 s=N obj=0x44e7adc0 self=0x136b18
01-20 12:44:22.173:我/dalvikvm(19715):| sysTid=19720 nice=0 sched=0/0 cgrp=默认句柄=1277072
01-20 12:44:22.173:我/dalvikvm(19715):| schedstat=( 4379710 8487993 4 )
01-20 12:44:22.173: I/dalvikvm(19715): at dalvik.system.NativeStart.run(Native Method)
01-20 12:44:22.183: I/dalvikvm(19715): "Binder Thread #1" prio=5 tid=5 NATIVE
01-20 12:44:22.183:我/dalvikvm(19715):| group="main" sCount=1 dsCount=0 s=N obj=0x44e77130 self=0x132868
01-20 12:44:22.183:我/dalvikvm(19715):| sysTid=19719 nice=0 sched=0/0 cgrp=默认句柄=1271608
01-20 12:44:22.183:我/dalvikvm(19715):| schedstat=( 9087362 4814877 5 )
01-20 12:44:22.183: I/dalvikvm(19715): 在 dalvik.system.NativeStart.run(Native Method)
01-20 12:44:22.183: I/dalvikvm(19715): "JDWP" 守护进程 prio=5 tid=4 VMWAIT
01-20 12:44:22.183:我/dalvikvm(19715):| group="system" sCount=1 dsCount=0 s=N obj=0x44e752a0 self=0x1245a0
01-20 12:44:22.183:我/dalvikvm(19715):| sysTid=19718 nice=0 sched=0/0 cgrp=默认句柄=1178336
01-20 12:44:22.183:我/dalvikvm(19715):| schedstat=( 13148782 23404684 16 )
01-20 12:44:22.183: I/dalvikvm(19715): 在 dalvik.system.NativeStart.run(Native Method)
01-20 12:44:22.183:I/dalvikvm(19715):“信号捕手”守护进程 prio=5 tid=3 VMWAIT
01-20 12:44:22.183:我/dalvikvm(19715):| group="system" sCount=1 dsCount=0 s=N obj=0x44e751e8 self=0x120298
01-20 12:44:22.183:我/dalvikvm(19715):| sysTid=19717 nice=0 sched=0/0 cgrp=默认句柄=1275872
01-20 12:44:22.192:我/dalvikvm(19715):| schedstat=( 650295 9179530 2 )
01-20 12:44:22.192: I/dalvikvm(19715): 在 dalvik.system.NativeStart.run(Native Method)
01-20 12:44:22.192: I/dalvikvm(19715): "HeapWorker" 守护进程 prio=5 tid=2 VMWAIT
01-20 12:44:22.192:我/dalvikvm(19715):| group="system" sCount=1 dsCount=0 s=N obj=0x438b8d00 self=0x12efc0
01-20 12:44:22.192:我/dalvikvm(19715):| sysTid=19716 nice=0 sched=0/0 cgrp=默认句柄=1249312
01-20 12:44:22.192:我/dalvikvm(19715):| schedstat=( 92741950 1647777523 865 )
01-20 12:44:22.192: I/dalvikvm(19715): at com.android.internal.os.BinderInternal$GcWatcher.finalize(BinderInternal.java:~48)
01-20 12:44:22.192: I/dalvikvm(19715): at dalvik.system.NativeStart.run(Native Method)

【问题讨论】:

  • 欢迎来到Stack Overflow。请注意格式化,有一些简单的工具可以提供帮助。还要避免问多个问题。这只是一个问题。

标签: android xml xml-parsing


【解决方案1】:

您可能想尝试XmlPullParser,它是一个非验证解析器。它适用于简单的 XML 结构,并允许更高性能的解析器。

文档中有一些 example code 可用

【讨论】:

    【解决方案2】:

    在常规 Java 领域,XML Pull Parser 通常是最快的。它看起来可以在 Andriod 上使用。

    【讨论】:

      【解决方案3】:

      对于大型 XML,请使用 DOM Parser

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多