1

您好,我正在通过以下代码解析 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)
4

2 回答 2

2

Java 中的 SAX XML 解析器

SAX 代表用于 XML 解析的简单 API。这是一个基于事件的 XML 解析,它逐步解析 XML 文件,非常适合大型 XML 文件。SAX XML Parser 在遇到开始标记、元素或属性时触发事件,并相应地进行解析。推荐使用 SAX XML 解析器来解析 Java 中的大型 xml 文件,因为它不需要在 Java 中加载整个 XML 文件,它可以读取小部分的大型 XML 文件。Java 提供对 SAX 解析器的支持,您可以使用 SAX 解析器解析 Java 中的任何 xml 文件,我在这里介绍了使用 SAX 解析器读取 xml 文件的示例。在 Java 中使用 SAX Parser 的一个缺点是,与 DOM Parser 相比,使用 SAX Parser 在 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 解析器。

于 2013-01-11T10:41:21.943 回答
1

基于这个答案,我XmlPullParser在我的项目中使用过。它比 SAX 和 DOM 更容易使用。您可以在 Vogella.com上找到有关Android 开发者网站和教程的更多信息

于 2013-01-11T10:47:07.983 回答