2014-10-09 36 views
0

此代碼與Android進行了測試:失去HTML逃到串

public static void test() { 
     String text="<html>" + 
     "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />" + 
     "<title>Testing Escapes with DOM</title>" + 
     "</head>" + 
     "<body lang=\"en\"><p>This is an escape: &mdash;</p></body>" + 
     "</html>"; 

     try { 
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      Document inputDoc = builder.parse(new ByteArrayInputStream(text.getBytes())); 

      Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      transformer.transform(new DOMSource(inputDoc), new StreamResult(baos)); 

      System.out.println("Result: " + baos.toString()); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

這裏是輸出:

Result: <html> 
<head> 
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>Testing Escapes with DOM</title> 
</head> 
<body lang="en"> 
<p>This is an escape: </p> 
</body> 
</html> 

(實際的代碼不只是複製輸入到輸出,但有一些過濾)

問題是關於& mdash;這是在原來的文字,但沒有出現在輸出中。

當我查看解析後創建的文檔時,它實際上有一個EntityReference節點,用於& mdash; 但它看起來像DOMSource希望解決任何實體,否則跳過它。

與XML不同,HTML不接受ENTITY,因此預定義的實體是唯一被識別的實體。 因爲這個原因,我只是希望所有的實體出現在「原樣」的輸出中而不被解析。有沒有辦法做到這一點? (也許替代DOMSource +變壓器?)

當然,我可以用實際的UTF字符替換所有的轉義,這當然會工作。 但是我的文本有很多逃避,並且將它們全部替換是一項繁瑣的工作。此外我想 一次又一次地找到解決方案。

回答

0

這是一個可能的解決方法:在解析之前,將所有& -s替換爲「啞序」(例如「###」), 以及全部完成後以相反方式替換。 (順便說一句,這將包含「真」&符號的HTML工作, 表示爲&安培;

使用該方法上述示例變成以下

public static void test() { 
    String text="<html>" + 
    "<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=us-ascii\" />" + 
    "<title>Testing Escapes with DOM</title>" + 
    "</head>" + 
    "<body lang=\"en\"><p>This is an escape: &mdash;</p></body>" + 
    "</html>"; 

    try { 
     DocumentBuilder builder = 
       DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document inputDoc = builder.parse(new ByteArrayInputStream(
       text.replace("&", "###").getBytes())); 

     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     transformer.transform(new DOMSource(inputDoc), new StreamResult(baos)); 

     System.out.println("Result: " + baos.toString().replace("###", "&")); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
} 

一個非常彆扭溶液和的巨大浪費記憶(對於如此糟糕實施的Dalvik垃圾收集引擎來說,這是一個挑戰!),而且我肯定會更喜歡一些沒有斑點的東西......