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.StringEscapeUtilsunescapeHtml4unescapeXML,但没有unescapeXhtml

编辑:我确实想处理无效的 XML,例如我想要 "&&xyzzy;" 解码为“&&xyzzy;”

编辑:我认为 HTML5 具有与 XHTML 几乎相同的字符实体,所以我认为 HTML 5解码器也可以。

4

2 回答 2

1

这可能不直接相关,但您可能希望采用JSoup来处理类似的事情,尽管来自更高级别。包括网页清理程序。

于 2014-02-19T14:34:06.790 回答
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 lib 的模块化设计,创建自定义转义工具很容易。

你可以在这里找到一个带有测试的完整项目xhtml-string-escape-utils

于 2021-06-25T01:36:48.003 回答