2013-05-02 47 views
1

這是輸入:如何隱藏HTML實體但保持XML實體不變?

<div>The price is &lt; 5 &euro;</div> 

這是一個有效的HTML,但不是有效的XML(因爲&euro;沒有在DTD中聲明)。一個有效的XML看起來像:

<div>The price is &lt; 5 &#8364;</div> 

你能推薦一些Java庫,可以幫我取消轉義HTML實體,並將其轉換爲XML實體?

+0

你想這樣做到一個完整的文件,或只是實體文本?你是否想用XML讀取HTML文件? (如果是這樣,那麼不僅僅是實體需要擔心) – 2013-05-02 21:24:53

回答

0

Apache commons StringUtils.unescapeHTML會做。一般而言,XML API自身會轉義XML實體。因此,您使用&設置了DOM屬性或內容文本,並生成了&amp;。 您可以將字符保留爲UTF-8;不需要製作它們的數字實體。

當然你也可以處理HTML DTD。這也會填充字符。這可能需要幾十秒。不幸的是,有很多實體,DTD包含和緩慢的服務器,所以最好使用這些DTD創建本地XML目錄或緩存實體處理程序。

import org.apache.commons.lang.StringEscapeUtils; 

    String html = "<div>The price is &lt; 5 &euro;</div>"; 
    String text = StringEscapeUtils.unescapeHtml(html); 
    System.out.println("Text: " + text); 

輸出以UTF-8的Linux:

Text: <div>The price is < 5 €</div> 

這表明屬性值和內部文本應處理片明智的。

+0

您能給出一個實用的Java示例,它可以處理我的文本(參見上文)嗎? – yegor256 2013-05-03 17:30:43

1

所有HTML命名字符引用的名單可在http://www.whatwg.org/specs/web-apps/current-work/multipage/entities.json

如果你能忍受偶爾的錯誤,你可以只去了該文件,並替換未在獨立的XML允許所有命名字符引用與相應的數字字符引用。

這種簡單的方法可以遇到問題但如果你輸入的是HTML,而不是XHTML:

<script>var y=1, lt = 3, x = y&lt; alert(x);</script> 

包含腳本元素,其含量用能單位進行編碼,所以天真地更換&lt;這裏將打破腳本。還有其他元素,例如<xmp><style>,它們可能具有與外部XML元素中的CDATA節類似的問題。

如果你需要一個非常忠實的轉換,或者如果你的HTML是凌亂的,最好的辦法可能是使用類似nu.validator到HTML解析爲DOM,然後使用How to pretty print XML from Java?到DOM轉換爲有效的XML。

即使您的輸入是XHTML,您可能也需要擔心看起來像CDATA部分中的實體的字符序列。再次,解析和重新渲染可能是您的最佳選擇。