这是输入:
<div>The price is < 5 €</div>
它是有效的HTML但不是有效的XML(因为在{DTD中未声明€
)。有效的XML看起来像:
<div>The price is < 5 €</div>
你能推荐一些可以帮助我浏览HTML实体并将它们转换为XML实体的Java库吗?
答案 0 :(得分:2)
使用apache commons lang 3,该类仅替换特定于HTML的实体:
nuget pack HtAlarms.Common.csproj
答案 1 :(得分:1)
http://www.whatwg.org/specs/web-apps/current-work/multipage/entities.json
提供了所有HTML命名字符引用的列表如果您可以容忍偶然的错误,您可以查看该文件,并使用相应的数字字符引用替换独立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部分中的实体的字符序列。同样,解析和重新渲染可能是您的最佳选择。
答案 2 :(得分:0)
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>
这表明属性值和内部文本应该分段处理。