【问题标题】:Parsing large XML files in Android在 Android 中解析大型 XML 文件
【发布时间】:2010-11-11 22:29:49
【问题描述】:

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

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

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

这是来自 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)

【问题讨论】:

标签: android xml sax


【解决方案1】:

使用这个linux命令分割你的文件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 解析中用作字符串。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 2015-09-15
    • 1970-01-01
    • 2019-02-18
    • 2020-10-16
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多