【问题标题】:Java to create XML and using XSL to create HTML escaped charactersJava 创建 XML 并使用 XSL 创建 HTML 转义字符
【发布时间】:2016-02-29 18:51:59
【问题描述】:

我有一点问题

  1. 用java获取用户数据
  2. 使用 JAXB 生成 XML
  3. 创建我的 XSL 模板
  4. 使用 Java 生成 HTML

现在我遇到了\r\n 以及其他一些时髦符号的问题。我应该使用 xml 转义还是 html 转义来解析我的 xml 内容。默认的 Java 转义实用程序类做得很差,我在网上找到的自定义类也不起作用。

\n\r 替换为<p> </p> 或者html tag 会是一个不错的选择,这是一个好的解决方案吗?谢谢!

一个简单的例子是我的 xml 中的日期值,它作为字符串传入并使用了所有转义符。

原文:(同一时间,我不记得是哪个) - Mon, 29 Feb 2016 13:40:58 EST (-0500)

转义的 XML 条目: - <Date>Mon, 29 Feb 2016 03:40:43 EST(-0500)</Date>

解析的 HTML 输出: - Mon, 29 Feb 2016 03:40:43 EST(-0500)

特殊字符的编码和解码显然出了问题。 但是当它被解析成html时

编辑:我也有这个我什至不认识的垃圾是:

编辑:我修复了日期问题,但部分编码仍然不正确。

public static String entityEncode(String text) {
    String result = text;
    if (result == null)
        return result;
    return StringEscapeUtils.escapeXml(XMLStringUtil.escapeControlChrs(result));
}

另一个类是:

public class XMLStringUtil {

    private static HashSet<Character> illegalChrSet = new HashSet<>();

    static {
        final String illegalChrs = "\u0000\u0001\u0002\u0003\u0004\u0005" +
                "\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012" +
                "\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C" +
                "\u001D\u001E\u001F\uFFFE\uFFFF";

        for (int i=0; i < illegalChrs.length(); i++) {
            illegalChrSet.add(illegalChrs.charAt(i));
        }
    }

    public static String escapeControlChrs(String str) {
        if (str == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder(str.length());
        for (int i=0; i < str.length(); i++) {
            char chr = str.charAt(i);
            if (illegalChrSet.contains(chr)) {
                sb.append("\\x");
                sb.append(String.format("%04x", (int) chr));
            } else {
                sb.append(chr);
            }
        }

        return sb.toString();
    }

    public static String removeControlChrs(String str) {
        if (str == null) {
            return null;
        }
        StringBuilder sb = new StringBuilder(str.length());
        for (int i=0; i < str.length(); i++) {
            char chr = str.charAt(i);
            if (! illegalChrSet.contains(chr)) {
                sb.append(chr);
            }
        }

        return sb.toString();
    }

但我仍然在 xml 中得到这个垃圾:

<Info>The origin domain used for comparison was: &#xD;
google.ca.ca&#xD;
blah blah blah&#xD;
</Info>

它出现在新行上。

【问题讨论】:

    标签: java html xml xslt


    【解决方案1】:

    问题是当您编码为 xml 本身时。 HTML 正在正确解析这些值。对于 html & 是 &。请检查您如何编码为 xml。 XML 不应该包含所有这些 ascii 字符。

    基本上你的字符串有字符'/'。编码时,它被转换为 对于 xml。这 不知道html。在创建 xml 时,将“/”替换为 &sol;并且解码后的html会自动转换为'/'

    【讨论】:

    • 我更新了问题,向您展示我现在是如何编码的,但仍然存在一些问题:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多