在 Android 中解析大型 XML 文件 [英] Parsing large XML files in Android

查看:54
本文介绍了在 Android 中解析大型 XML 文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试解析一个相当大的 XML 文件 - 1MB+,但我遇到了一些困难.我首先尝试将 xml 文件添加到 res/xml 并使用 XmlResourceParser 对其进行解析,但是我收到一个异常,提示数据超过 UNCOMPRESS_DATA_MAX".经过一番研究,我发现压缩文件在读取之前必须在内存中解压缩,并且此限制不适用于原始文件.但是,当尝试使用 SAXParser 从 res/raw 文件夹解析 xml 文件时,我得到一个 IOException,没有任何消息和堆栈跟踪:

I am trying to parse a rather large XML file - 1MB+, but I am having some difficulties. I first tried to add the xml file to the res/xml and parse it with the XmlResourceParser, but I got an exception saying "Data exceeds UNCOMPRESS_DATA_MAX". After a bit of research I found out that the compressed files have to be uncompressed in memory before reading and that this restriction doesnt apply for raw files. However when trying to parse the xml file from the res/raw folder with the SAXParser, I get an IOException, without any message and stacktrace:

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();
xr.setContentHandler(myXMLHandler);
InputSource src = new InputSource(stream);
xr.parse(src); // IOException

据我所知,这些内存限制不适用于原始资源,但导致此异常的原因是什么?

From what I understand those memory restrictions do not apply to raw resources, but what is causing this exception then?

这是来自 logcat 的堆栈跟踪:

Here is the stacktrace from logcat:

11-11 23:47:50.729: WARN/System.err(4886): java.io.IOException
11-11 23:47:50.739: WARN/System.err(4886):     at android.content.res.AssetManager.readAsset(Native Method)
11-11 23:47:50.749: WARN/System.err(4886):     at android.content.res.AssetManager.access$800(AssetManager.java:36)
11-11 23:47:50.759: WARN/System.err(4886):     at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:542)
11-11 23:47:50.759: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:504)
11-11 23:47:50.769: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467)
11-11 23:47:50.779: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)
11-11 23:47:50.790: WARN/System.err(4886):     at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)

推荐答案

使用这个 linux 命令拆分你的文件 split -l 1 main.xml

Split your file using this linux command split -l 1 main.xml

private String readTxt()
{
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    for(int J=1;J<15;J++)
    {
        int i;
        try
        {
            InputStream raw = this.getAssets().open("xa"+J);    
            i = raw.read();
            while (i != -1)
            {
                byteArrayOutputStream.write(i);
                i = raw.read();
            }
            raw.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

在 SAX 解析中用作字符串.

Use as string into your SAX parsing.

这篇关于在 Android 中解析大型 XML 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆