Исключение нехватки памяти в Android, когда HTML освобождает строку

1

У меня есть HTML unescape String (HTML-экранированный XML файл (так что все val в моей String и lt; TAG & lt;/TAG & gt; и т.д.) Размер ~ 1,4 МБ что я могу использовать необработанный XML в парсере)

Проблема, с которой я сталкиваюсь, заключается в том, что я всегда получаю исключение из памяти, когда пытаюсь получить невыбранную строку, когда я использую StringEscapeUtils.unescapeHtml(String) (библиотека apache-commons-lang-2.6).

Я также попробовал метод базового андроида api для unescape строки, но помимо того факта, что это было медленным, как черное исключение из памяти даже произошло с меньшими строками (~ 700kb).

Может кто-нибудь подскажет мне, как я могу обрабатывать такую ​​трансформацию String без использования исключения из памяти?

Теги:
memory-management
out-of-memory

1 ответ

1
Лучший ответ

В Java есть хорошие базовые возможности, чтобы сделать это очень просто. Нижеприведенное решение использует регулярное выражение для прохождения вашего контента и позволяет вам заменять символы. Это решение требует выполнения небольшой работы, поскольку вам необходимо предоставить коды эвакуации. Здесь вы можете найти список escape-кодов [http://www.w3.org/TR/html4/sgml/entities.html][1] или Google в Интернете для других.

Вот код ниже:

import java.util.regex.*;
import java.util.*;

public class HtmlUnescape {
    public static void main(String[] args){
        HashMap<String,String> codes = new HashMap<String,String>();
        codes.put("&lt;", "<");
        codes.put("&gt;", ">");
        codes.put("&#34;", "\"");

        String html = "&lt;html&gt;&lt;head&gt;&lt;title&gt;Hello&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;The great escape &#34;example&#34;&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;";

        Matcher matcher = Pattern.compile("&#*\\w\\w\\w?\\w?;").matcher(html);
        StringBuffer matchBuffer = new StringBuffer();
        while(matcher.find()){
            matcher.appendReplacement(matchBuffer, codes.get(matcher.group()));
        }
        matcher.appendTail(matchBuffer);
        System.out.println (matchBuffer.toString());
    }
}

Что происходит в коде:

  • Сначала хэш хранит коды для unescape.
  • Во-вторых, переменная html хранит escape-код для обработки.
  • Далее мы используем выражение regex для поиска и замены экранированных кодов с использованием:
    • Matcher.find(),
    • Matcher.appendReplacement() и
    • Методы Matcher.appendTail().

Попробуй. У меня нет понимания производительности больших файлов, таких как ваши. Но код достаточно прост, чтобы вы могли настроить его, чтобы получить желаемую производительность.

  • 0
    Спасибо за Ваш ответ. В целом идея с регулярными выражениями хороша, но кажется, что реализация слишком медленная при использовании ее на больших файлах. Теперь я решил свою проблему с базой данных, которую я развернул с приложением, которое уменьшает размер моих полученных потоков XML. Но если кто-то может указать мне другое решение (более быструю библиотеку или что-то еще), оно все равно будет оценено :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню