Java创建XML并使用XSL创建HTML转义字符

时间:2016-02-29 18:52:00

标签: java html xml xslt

我有点问题

  1. 使用java获取用户数据
  2. 使用JAXB生成XML
  3. 创建我的XSL模板
  4. 使用Java生成HTML
  5. 现在我遇到了\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&amp;#044; 29 Feb 2016 03&amp;#058;40&amp;#058;43 EST&amp;#040;&amp;#045;0500&amp;#041;</Date>

    解析HTML输出   - Mon&#044; 29 Feb 2016 03&#058;40&#058;43 EST&#040;&#045;0500&#041;

    特殊字符的编码和解码明显出错。 但当这被解析为html

    编辑:我也有这个我甚至不认识的垃圾:&#xD;

    编辑:我修正了日期问题,但部分内容仍未正确编码。

    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>
    

    它出现在新行上。

1 个答案:

答案 0 :(得分:0)

问题是当您编码到xml本身时。 HTML正在正确地解析值。对于html&amp;是&amp ;.请检查您对xml的编码方式。 XML不应该包含所有ascii字符。

基本上你的字符串有'/'字符。编码时,它会被转换为  对于xml。这个  不知道html。在使用/创建xml替换'/'时,解码的html会自动转换为'/'