【发布时间】:2016-02-29 18:51:59
【问题描述】:
我有一点问题
- 用java获取用户数据
- 使用 JAXB 生成 XML
- 创建我的 XSL 模板
- 使用 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&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: 
google.ca.ca
blah blah blah
</Info>
它出现在新行上。
【问题讨论】: