Разбор больших файлов XML в Android - PullRequest
1 голос
/ 12 ноября 2010

Я пытаюсь проанализировать довольно большой XML-файл - 1 МБ +, но у меня возникли некоторые трудности. Сначала я попытался добавить файл xml в res / xml и проанализировать его с помощью XmlResourceParser, но получил исключение, говорящее «Данные превышают UNCOMPRESS_DATA_MAX». После небольшого исследования я обнаружил, что сжатые файлы должны быть распакованы в памяти перед чтением и что это ограничение не распространяется на необработанные файлы. Однако при попытке проанализировать XML-файл из папки res / raw с помощью SAXParser, я получаю 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)

1 Ответ

0 голосов
/ 30 июля 2012

Разделите ваш файл с помощью этой команды 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.

...