此代碼與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: —</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字符替換所有的轉義,這當然會工作。 但是我的文本有很多逃避,並且將它們全部替換是一項繁瑣的工作。此外我想 一次又一次地找到解決方案。