你好,我正在通过下面的代码解析 xml
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InputStream is = getResources().openRawResource(R.raw.bd);
try {
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = docBuilder.parse(is, null);
doc.getDocumentElement().normalize();
NodeList my_words = doc.getElementsByTagName("word");
for (int i = 0; i < 100; i++) {
System.out.println(((Element) my_words.item(i)).getAttribute("eng"));
System.out.println(((Element) my_words.item(i)).getAttribute("guj"));
}
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
但我收到如下错误...
01-11 16:00:48.709: E/dalvikvm-heap(18535): Out of memory on a 176-byte allocation.
01-11 16:00:48.709: I/dalvikvm(18535): "main" prio=5 tid=1 RUNNABLE
01-11 16:00:48.709: I/dalvikvm(18535): | group="main" sCount=0 dsCount=0 obj=0x40022190 self=0xd018
01-11 16:00:48.709: I/dalvikvm(18535): | sysTid=18535 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1345002400
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.Throwable.nativeFillInStackTrace(Native Method)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.Throwable.fillInStackTrace(Throwable.java:135)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.Throwable.<init>(Throwable.java:74)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.Error.<init>(Error.java:38)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.VirtualMachineError.<init>(VirtualMachineError.java:36)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.OutOfMemoryError.<init>(OutOfMemoryError.java:34)
01-11 16:00:48.709: I/dalvikvm(18535): at java.util.ArrayList.add(ArrayList.java:-1)
01-11 16:00:48.709: I/dalvikvm(18535): at org.apache.harmony.xml.dom.ElementImpl.setAttributeNode(ElementImpl.java:329)
01-11 16:00:48.709: I/dalvikvm(18535): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:355)
01-11 16:00:48.709: I/dalvikvm(18535): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:360)
01-11 16:00:48.709: I/dalvikvm(18535): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:133)
01-11 16:00:48.709: I/dalvikvm(18535): at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:132)
01-11 16:00:48.709: I/dalvikvm(18535): at com.example.simplexmlpullapp.MainActivity.onCreate(MainActivity.java:32)
01-11 16:00:48.709: I/dalvikvm(18535): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-11 16:00:48.709: I/dalvikvm(18535): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
01-11 16:00:48.709: I/dalvikvm(18535): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
01-11 16:00:48.709: I/dalvikvm(18535): at android.app.ActivityThread.access$1500(ActivityThread.java:123)
01-11 16:00:48.709: I/dalvikvm(18535): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
01-11 16:00:48.709: I/dalvikvm(18535): at android.os.Handler.dispatchMessage(Handler.java:99)
01-11 16:00:48.709: I/dalvikvm(18535): at android.os.Looper.loop(Looper.java:130)
01-11 16:00:48.709: I/dalvikvm(18535): at android.app.ActivityThread.main(ActivityThread.java:3835)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.reflect.Method.invokeNative(Native Method)
01-11 16:00:48.709: I/dalvikvm(18535): at java.lang.reflect.Method.invoke(Method.java:507)
01-11 16:00:48.709: I/dalvikvm(18535): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
01-11 16:00:48.709: I/dalvikvm(18535): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
01-11 16:00:48.709: I/dalvikvm(18535): at dalvik.system.NativeStart.main(Native Method)
01-11 16:00:48.729: W/dalvikvm(18535): Exception thrown (Ljava/lang/OutOfMemoryError;) while throwing internal exception (Ljava/lang/OutOfMemoryError;)
01-11 16:00:48.729: W/dalvikvm(18535): Could not resolve class ref'ed in exception catch list (class index 349, exception Ljava/lang/OutOfMemoryError;)
01-11 16:00:49.209: I/dalvikvm-heap(18535): Clamp target GC heap from 25.906MB to 24.000MB
01-11 16:00:49.209: D/dalvikvm(18535): GC_CONCURRENT freed <1K, 11% free 22006K/24519K, external 3K/514K, paused 5ms+6ms
01-11 16:00:49.509: D/dalvikvm(18535): GC_FOR_MALLOC freed 19308K, 89% free 2698K/24519K, external 3K/514K, paused 294ms
01-11 16:00:49.509: D/AndroidRuntime(18535): Shutting down VM
01-11 16:00:49.509: W/dalvikvm(18535): threadid=1: thread exiting with uncaught exception (group=0x40018560)
01-11 16:00:49.509: E/AndroidRuntime(18535): FATAL EXCEPTION: main
01-11 16:00:49.509: E/AndroidRuntime(18535): java.lang.OutOfMemoryError: [memory exhausted]
01-11 16:00:49.509: E/AndroidRuntime(18535): at dalvik.system.NativeStart.main(Native Method)
最佳答案
Java 中的 SAX XML 解析器
SAX 代表用于 XML 解析的简单 API。这是一个基于事件的 XML 解析,它一步一步地解析 XML 文件,非常适合大型 XML 文件。 SAX XML 解析器在遇到开始标记、元素或属性时会触发事件,并且解析会相应地进行。建议使用 SAX XML 解析器来解析 Java 中的大型 xml 文件,因为它不需要在 Java 中加载整个 XML 文件,并且它可以读取小部分的大 XML 文件。 Java 提供对 SAX 解析器的支持,您可以使用 SAX 解析器解析 Java 中的任何 xml 文件,我在这里介绍了使用 SAX 解析器读取 xml 文件的示例。在 Java 中使用 SAX 解析器的一个缺点是,与 DOM 解析器相比,使用 SAX 解析器在 Java 中读取 XML 文件需要更多代码。
DOM 和 SAX XML 解析器的区别 以下是 Java 中的 DOM 解析器和 SAX 解析器之间的一些高级差异:
1) DOM 解析器在内存中加载整个 xml 文档,而 SAX 只在内存中加载一小部分 XML 文件。
2) DOM 解析器比 SAX 更快,因为它访问内存中的整个 XML 文档。
3) Java 中的 SAX 解析器比 DOM 解析器更适合大型 XML 文件,因为它不需要太多内存。
4) DOM 解析器在文档对象模型上工作,而 SAX 是基于事件的 xml 解析器。
这就是 Java 中 SAX 和 DOM 解析器之间的区别,现在由您决定选择哪种 XML 解析器。如果 XML 文件足够小,我建议使用 DOM 解析器而不是 SAX 解析器;如果您不知道要处理的 xml 文件的大小或它们很大,我建议使用 SAX 解析器。
关于android - XML解析java.lang.OutOfMemoryError : [memory exhausted],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276265/