Java 如何取消对HTML实体的浏览,但保持XML实体不变?

Java 如何取消对HTML实体的浏览,但保持XML实体不变?,java,html,xml,Java,Html,Xml,这是输入: <div>The price is &lt; 5 &euro;</div> 您能推荐一些Java库来帮助我取消HTML实体的浏览并将它们转换为XML实体吗?所有HTML命名字符引用的列表可在 如果您能够容忍偶尔出现的错误,那么只需检查该文件,并将独立XML中不允许的所有命名字符引用替换为相应的数字字符引用 如果您的输入是HTML而不是XHTML,那么这种简单的方法可能会遇到问题: <script>var y=1, lt = 3,

这是输入:

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

您能推荐一些Java库来帮助我取消HTML实体的浏览并将它们转换为XML实体吗?

所有HTML命名字符引用的列表可在

如果您能够容忍偶尔出现的错误,那么只需检查该文件,并将独立XML中不允许的所有命名字符引用替换为相应的数字字符引用

如果您的输入是HTML而不是XHTML,那么这种简单的方法可能会遇到问题:

<script>var y=1, lt = 3, x = y&lt; alert(x);</script>
var y=1,lt=3,x=y警报(x);
包含一个脚本元素,其内容未使用实体进行编码,因此在此处天真地替换
将破坏脚本。还有其他元素,如
,可能会遇到与外来XML元素中的CDATA部分类似的问题

如果您需要一个真正忠实的转换,或者如果您的HTML很混乱,那么最好的选择可能是使用类似的方法将HTML解析为DOM,然后使用将DOM转换为有效的XML


即使您的输入是XHTML,也可能需要担心看起来像CDATA部分中实体的字符序列。同样,解析和重新呈现可能是您的最佳选择。

使用apache commons lang 3,该类仅替换特定于HTML的实体:

import org.apache.commons.text.translate.AggregateTranslator;
import org.apache.commons.text.translate.CharSequenceTranslator;
import org.apache.commons.text.translate.EntityArrays;
import org.apache.commons.text.translate.LookupTranslator;
import org.apache.commons.text.translate.NumericEntityUnescaper;


public class HtmlEscapeUtils {

  /**
   * @see {@link org.apache.commons.text.StringEscapeUtils#UNESCAPE_HTML4}
   */
  public static final CharSequenceTranslator UNESCAPE_HTML_SPECIFIC =
      new AggregateTranslator(
          new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE),
          new LookupTranslator(EntityArrays.HTML40_EXTENDED_UNESCAPE),
          new NumericEntityUnescaper());


  /**
   * @see {@link org.apache.commons.text.StringEscapeUtils#unescapeHtml4(String)}
   * @param input - HTML String with e.g. &quot; &amp; &auml;
   * @return XML String, HTML4 Entities replaced, but XML Entites remain (e.g. &quot; und &amp;)
   */
  public static final String unescapeHtmlToXml(final String input) {
    return UNESCAPE_HTML_SPECIFIC.translate(input);
  }

}

是要对整个文档执行此操作,还是仅对实体文本执行此操作?您正在尝试以XML格式读取HTML文件吗?(如果是这样,那么需要担心的不仅仅是实体)
import org.apache.commons.text.translate.AggregateTranslator;
import org.apache.commons.text.translate.CharSequenceTranslator;
import org.apache.commons.text.translate.EntityArrays;
import org.apache.commons.text.translate.LookupTranslator;
import org.apache.commons.text.translate.NumericEntityUnescaper;


public class HtmlEscapeUtils {

  /**
   * @see {@link org.apache.commons.text.StringEscapeUtils#UNESCAPE_HTML4}
   */
  public static final CharSequenceTranslator UNESCAPE_HTML_SPECIFIC =
      new AggregateTranslator(
          new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE),
          new LookupTranslator(EntityArrays.HTML40_EXTENDED_UNESCAPE),
          new NumericEntityUnescaper());


  /**
   * @see {@link org.apache.commons.text.StringEscapeUtils#unescapeHtml4(String)}
   * @param input - HTML String with e.g. &quot; &amp; &auml;
   * @return XML String, HTML4 Entities replaced, but XML Entites remain (e.g. &quot; und &amp;)
   */
  public static final String unescapeHtmlToXml(final String input) {
    return UNESCAPE_HTML_SPECIFIC.translate(input);
  }

}