如何浏览HTML实体但保持XML实体不变?

时间:2013-05-02 20:47:05

标签: java html xml

这是输入:

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

它是有效的HTML但不是有效的XML(因为在{DTD中未声明&euro;)。有效的XML看起来像:

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

你能推荐一些可以帮助我浏览HTML实体并将它们转换为XML实体的Java库吗?

3 个答案:

答案 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&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部分中的实体的字符序列。同样,解析和重新渲染可能是您的最佳选择。

答案 2 :(得分: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>

这表明属性值和内部文本应该分段处理。