Java 如何取消对HTML实体的浏览,但保持XML实体不变?
这是输入:Java 如何取消对HTML实体的浏览,但保持XML实体不变?,java,html,xml,Java,Html,Xml,这是输入: <div>The price is < 5 €</div> 您能推荐一些Java库来帮助我取消HTML实体的浏览并将它们转换为XML实体吗?所有HTML命名字符引用的列表可在 如果您能够容忍偶尔出现的错误,那么只需检查该文件,并将独立XML中不允许的所有命名字符引用替换为相应的数字字符引用 如果您的输入是HTML而不是XHTML,那么这种简单的方法可能会遇到问题: <script>var y=1, lt = 3,
<div>The price is < 5 €</div>
您能推荐一些Java库来帮助我取消HTML实体的浏览并将它们转换为XML实体吗?所有HTML命名字符引用的列表可在 如果您能够容忍偶尔出现的错误,那么只需检查该文件,并将独立XML中不允许的所有命名字符引用替换为相应的数字字符引用 如果您的输入是HTML而不是XHTML,那么这种简单的方法可能会遇到问题:
<script>var y=1, lt = 3, x = y< 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. " & ä
* @return XML String, HTML4 Entities replaced, but XML Entites remain (e.g. " und &)
*/
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. " & ä
* @return XML String, HTML4 Entities replaced, but XML Entites remain (e.g. " und &)
*/
public static final String unescapeHtmlToXml(final String input) {
return UNESCAPE_HTML_SPECIFIC.translate(input);
}
}