如何在Java中解码XHTML和/或HTML5实体?

6

我有一些包含 XHTML 字符实体的字符串:

"They're quite varied"
"Sometimes the string ∈ XML standard, sometimes ∈ HTML4 standard"
"Therefore -> I need an XHTML entity decoder."
"Sadly, some strings are not valid XML & are not-quite-so-valid HTML <- but I want them to work, too."

有没有简便的方法来解码实体?(我使用Java)
我现在正在使用StringEscapeUtils.unescapeHtml4(myString.replace("&apos;", "\'"))作为临时解决办法。不幸的是,org.apache.commons.lang3.StringEscapeUtils只有unescapeHtml4和unescapeXML,没有unescapeXhtml。
编辑:我想要处理无效的XML,例如我希望"&&xyzzy"解码为"&&xyzzy"
编辑:我认为HTML5几乎有与XHTML相同的字符实体,所以我认为HTML 5 解码器也可以。

1
XHTML和HTML实体不是等价的吗? - Sotirios Delimanolis
1
提示:XHTML 是有效的 XML。 - John Dvorak
1
@JanDvorak:如果输入保证是有效的XHTML,那我会很高兴。此外,XML本身并没有所有的HTML引用。 - Karol S
@SotiriosDelimanolis:&apos; 在 HTML4 中不是一个字符实体引用。 - Karol S
@KarolS XHTML只是在HTML4的基础上增加了apos,所以你的“临时解决方案”应该可以工作。除非它不能处理你提到的错误? - Mr Lister
显示剩余3条评论
2个回答

1

你尝试过基于org.apache.commons.text.StringEscapeUtils提供的功能实现一个XHTMLStringEscapeUtils吗?

import org.apache.commons.text.StringEscapeUtils;
import org.apache.commons.text.translate.*;

public class XHTMLStringEscapeUtils {
    public static final CharSequenceTranslator ESCAPE_XHTML =
            new AggregateTranslator(
                    new LookupTranslator(EntityArrays.BASIC_ESCAPE),
                    new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE),
                    new LookupTranslator(EntityArrays.HTML40_EXTENDED_ESCAPE)
            ).with(StringEscapeUtils.ESCAPE_XML11);

    public static final CharSequenceTranslator UNESCAPE_XHTML =
            new AggregateTranslator(
                    new LookupTranslator(EntityArrays.BASIC_UNESCAPE),
                    new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE),
                    new LookupTranslator(EntityArrays.HTML40_EXTENDED_UNESCAPE),
                    new NumericEntityUnescaper(),
                    new LookupTranslator(EntityArrays.APOS_UNESCAPE)
            );

    public static final String escape(final String input) {
        return ESCAPE_XHTML.translate(input);
    }

    public static final String unescape(final String input) {
        return UNESCAPE_XHTML.translate(input);
    }
}

由于Apache commons-text库的模块化设计,可以轻松创建自定义转义工具。
您可以在此处找到包含测试的完整项目 xhtml-string-escape-utils

1

这可能与此直接相关,但您可能希望采用JSoup,它可以从更高的层面处理这样的事情。包括网页清理例程。


谢谢,看起来很不错,但在我的使用情况下可能会过度设计。 - Karol S
没有所谓的过度杀伤 - 只有问题和解决方案。JSoup是一种解决方案,比手动搜索和替换要好得多。 - Gimby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接