<div>The price is < 5 €</div>
這是一個有效的HTML,但不是有效的XML(因爲€
沒有在DTD中聲明)。一個有效的XML看起來像:
<div>The price is < 5 €</div>
你能推薦一些Java庫,可以幫我取消轉義HTML實體,並將其轉換爲XML實體?
<div>The price is < 5 €</div>
這是一個有效的HTML,但不是有效的XML(因爲€
沒有在DTD中聲明)。一個有效的XML看起來像:
<div>The price is < 5 €</div>
你能推薦一些Java庫,可以幫我取消轉義HTML實體,並將其轉換爲XML實體?
Apache commons StringUtils.unescapeHTML會做。一般而言,XML API自身會轉義XML實體。因此,您使用&
設置了DOM屬性或內容文本,並生成了&
。 您可以將字符保留爲UTF-8;不需要製作它們的數字實體。
當然你也可以處理HTML DTD。這也會填充字符。這可能需要幾十秒。不幸的是,有很多實體,DTD包含和緩慢的服務器,所以最好使用這些DTD創建本地XML目錄或緩存實體處理程序。
import org.apache.commons.lang.StringEscapeUtils;
String html = "<div>The price is < 5 €</div>";
String text = StringEscapeUtils.unescapeHtml(html);
System.out.println("Text: " + text);
輸出以UTF-8的Linux:
Text: <div>The price is < 5 €</div>
這表明屬性值和內部文本應處理片明智的。
您能給出一個實用的Java示例,它可以處理我的文本(參見上文)嗎? – yegor256 2013-05-03 17:30:43
所有HTML命名字符引用的名單可在http://www.whatwg.org/specs/web-apps/current-work/multipage/entities.json
如果你能忍受偶爾的錯誤,你可以只去了該文件,並替換未在獨立的XML允許所有命名字符引用與相應的數字字符引用。
這種簡單的方法可以遇到問題但如果你輸入的是HTML,而不是XHTML:
<script>var y=1, lt = 3, x = y< alert(x);</script>
包含腳本元素,其含量用能單位進行編碼,所以天真地更換<
這裏將打破腳本。還有其他元素,例如<xmp>
和<style>
,它們可能具有與外部XML元素中的CDATA節類似的問題。
如果你需要一個非常忠實的轉換,或者如果你的HTML是凌亂的,最好的辦法可能是使用類似nu.validator到HTML解析爲DOM,然後使用How to pretty print XML from Java?到DOM轉換爲有效的XML。
即使您的輸入是XHTML,您可能也需要擔心看起來像CDATA部分中的實體的字符序列。再次,解析和重新渲染可能是您的最佳選擇。
你想這樣做到一個完整的文件,或只是實體文本?你是否想用XML讀取HTML文件? (如果是這樣,那麼不僅僅是實體需要擔心) – 2013-05-02 21:24:53