Ошибка нехватки памяти при обрезке XML - PullRequest
0 голосов
/ 21 апреля 2011

Я делаю программу для анализа XML-файла с http.И у XML есть место перед корневым тегом.

Итак, мне нужно обрезать XML, прежде чем анализировать его.

Вот метод, который я написал,

     private String trimXML(InputStream inputStream){
        Writer writer = null;
        try{
            writer = new StringWriter();
            char[] buffer = new char[Constants.BUFFER_SIZE];
            try {
                Reader reader = null;
                try {
                    reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
                    int n = 0;                
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return writer.toString().trim();
        }catch(NullPointerException e){
            return null;
        }
    }

Теперь я сталкиваюсь с большой проблемой: после того, как я несколько раз запрашиваю XML, возникает ошибка нехватки памяти ...

Может кто-нибудь дать мне какое-нибудь предложение по ее решению?

Ответы [ 4 ]

1 голос
/ 21 апреля 2011

Почему? Синтаксический анализатор XML не заботится о пустом пространстве. И если вы получаете XML-документ, который не анализируется, решение состоит в том, чтобы исправить отправителя, а не запутать что-либо в получателе. Таким образом, все не правы.

1 голос
/ 21 апреля 2011

Могу ли я предположить, что, возможно, вы пытаетесь решить проблему, которая уже была решена?Вам нужно написать синтаксический анализатор самостоятельно?

Я бы посоветовал вам не пытаться анализировать XML самостоятельно, а использовать такую ​​библиотеку, как Simple XML , которая работает на Android.Я только что написал сообщение в блоге, объясняющее, как включить его в один из ваших проектов: вы можете найти это здесь .

1 голос
/ 21 апреля 2011

Вы используете StringWriter, что означает, что вы продолжаете записывать содержимое файла XML в буфер в памяти. Таким образом, очевидно, что если последний буфер остается в памяти и еще не собран мусором, вы нажмете OutOfMemory.

Кстати, я не понимаю, как ваша программа решает вашу проблему. Это просто обрезка всего документа. Это означает, что он очистит пробелы в начале и конце документа.

Я предлагаю вам сказать, что вам не нужно беспокоиться о пустом месте и анализировать документ с помощью StAX или чего-либо подходящего вам. И, при необходимости, обрезать вещь при разборе.

Однако, очистка может помочь. Таким образом, можно быстро исправить это,

..
..
String str = writer.toString().trim();
writer.flush();
return str;
..
..

NB: пробелы вокруг элементов XML будут игнорироваться парсером, тем не менее. Если вам нужно обрезать значения некоторых атрибутов / элементов, это другая история.

0 голосов
/ 22 апреля 2011

Вы можете переместить InputStream к первому вхождению '<', используя что-то вроде: </p>

    InputStream inputStream = new BufferedInputStream(YOUR_INPUT_STREAM);
    byte[] start = "<".getBytes("UTF-8");
    byte[] potentialStart = new byte[1];

    inputStream.read(potentialStart);
    while(start[0] != potentialStart[0]) {
        inputStream.mark(1);
        inputStream.read(potentialStart);
    }
    inputStream.reset();
...