You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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("&lt;");
                    break;
                case '>':
                    write("&gt;");
                    break;
                case '&':
                    write("&amp;");
                    break;
                case '"':
                    write("&quot;");
                    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:55:16