使用XStream的PrettyPrintWriter时如何原样输出转义字符?
解决XStream PrettyPrintWriter单引号转义为&apos的问题
要让PrettyPrintWriter输出XML时保留单引号(')而不转义为&apos,核心是重写它的XML转义逻辑,跳过单引号的转义处理:
1. 自定义PrettyPrintWriter子类
继承PrettyPrintWriter并重写escapeXml方法,仅保留XML规范要求的必要转义(<、>、&、"),排除单引号的转义:
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import java.io.Writer; public class CustomPrettyPrintWriter extends PrettyPrintWriter { public CustomPrettyPrintWriter(Writer writer) { super(writer); } @Override protected void escapeXml(String text) { int length = text.length(); for (int i = 0; i < length; i++) { char c = text.charAt(i); switch (c) { case '<': write("<"); break; case '>': write(">"); break; case '&': write("&"); break; case '"': write("""); break; // 单引号直接输出,不转义 case '\'': write('\''); break; default: write(c); } } } }
2. 使用自定义Writer替换默认实现
将原来的PrettyPrintWriter替换为自定义的CustomPrettyPrintWriter即可:
// 替换原有marshal调用中的Writer实现 xstream.marshal(obj, new CustomPrettyPrintWriter(writer));
注意事项
- 保留<、>、&、"的转义是为了保证生成的XML符合规范,避免解析错误;
- XML规范允许单引号不转义(仅在属性值用双引号包裹时更安全),此改动不会破坏XML的合法性。
内容的提问来源于stack exchange,提问作者noob99
相关产品推荐
相关产品推荐

