У меня есть 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 без использования исключения из памяти?
В 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("<", "<");
codes.put(">", ">");
codes.put(""", "\"");
String html = "<html><head><title>Hello</title></head><body><h1>The great escape "example"</h1></body></html>";
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());
}
}
Что происходит в коде:
Попробуй. У меня нет понимания производительности больших файлов, таких как ваши. Но код достаточно прост, чтобы вы могли настроить его, чтобы получить желаемую производительность.