2011-05-22 9 views
1

をアンエスケープしながら、HTMLをXMLファイルを免れた(だから私の文字列内のすべてのvalは& LTです(文字列をエスケープ解除;タグ& GT; valの& LT; /タグ& GT。など)サイズが〜1.4MBなので、エスケープされていないXMLをパーサーで使用できます)Androidのうち、私はHTMLにきたHTMLを文字列

問題は、エスケープされていないStringを取得しようとするとメモリ不足例外が発生することです私はStringEscapeUtils.unescapeHtml(String)(apache-commons-lang-2.6ライブラリ)を使用しています。

私はまた、文字列をエスケープするための基本的なアンドロイド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()); 
    } 
} 

:ここ

は、以下のコードである

  • まず、ハッシュ店アンエスケープするコード。
  • 第2に、変数htmlストアは処理するHTMLをエスケープします。
  • 次に、私たちが使用してエスケープコードを検索および置換する正規表現の式を使用します。
    • Matcher.findを()、
    • Matcher.appendReplacement()、および
    • Matcher.appendTail()メソッド。

これを試してください。私はあなたのような大きなファイルのパフォーマンスについての洞察を持っていません。しかし、コードは、あなたがそれを微調整して所望の性能を得るのに十分なほど単純です。

+0

ご回答ありがとうございます。 基本的な表現は普通ですが、大きなファイルで使用すると実装が遅すぎるようです。 私は受け取ったXMLストリームのサイズを縮小する、アプリケーションと一緒にデプロイするデータベースを使って問題を解決しました。 しかし、誰かが私に別の解決策(より速い図書館か他の何か)を教えてもらえれば、それでも感謝するでしょう:) – Foxtur

関連する問題