2011-05-22 14 views
1

我已經到HTML UNESCAPE一個String(HTML轉義XML文件(所以在我所有的字符串Val取代& LT; TAG & GT; VAL & LT;/TAG & GT;等等)大小~1.4MB,以便我可以在解析器中使用非轉義的XML)Android的內存溢出異常,而HTML進行反向轉義的String

我遇到的問題是當我嘗試獲取非轉義的字符串時,我總是遇到內存不足異常當我使用StringEscapeUtils.unescapeHtml(String)(apache-commons-lang-2.6庫)。

我也嘗試了基本的android api的方法來避開字符串,但除了事實上,它是緩慢的地獄內存異常甚至發生與較小的字符串(〜700kb)。

有人可以建議我如何處理這種字符串轉型而不會遇到內存不足異常嗎?

回答

1

Java有一些很好的核心功能來實現這一點非常簡單。 下面的解決方案使用正則表達式來遍歷您的內容,並允許您替換字符。這個解決方案確實需要做一些工作,因爲你需要提供轉義代碼。你可以在這裏找到一個轉義代碼列表[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存儲轉義HTML來處理。
  • 接下來,我們使用正則表達式表達來搜索和使用替換轉義碼:
    • Matcher.find(),
    • Matcher.appendReplacement(),和
    • Matcher.appendTail()方法。

試試看。我對您的大文件的性能沒有深入瞭解。但是,代碼非常簡單,您可以調整它以獲得所需的性能。

+0

感謝您的回答。 基本上,使用正則表達式的想法很好,但在大文件上使用它似乎太慢了。 我現在用一個數據庫解決了我的問題,我使用該應用程序部署了一個數據庫,該數據庫減少了接收到的XML流的大小。 但是,如果有人可以指向我另一個解決方案(更快的庫或其他東西),它仍然將不勝感激:) – Foxtur 2011-05-29 19:37:22