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

Java中如何在XML属性中写入转义的回车符?

XMLStreamWriter写入含回车符的XML属性时的转义问题

我需要将包含回车符(0x0D)的字符串序列化为XML属性,但遇到了转义问题:

  • 直接传入带\r的字符串调用writeAttribute,无法得到
的转义结果
  • 手动写入foo
作为属性值时,输出会被错误处理为foo

测试代码

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.io.OutputStreamWriter;

public class MyClass {
    public static void main(String args[]) throws IOException, XMLStreamException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        XMLOutputFactory xmlFactory = XMLOutputFactory.newInstance();
        OutputStreamWriter osw = new OutputStreamWriter(outputStream, "utf-8");
        XMLStreamWriter writer = xmlFactory.createXMLStreamWriter(osw);
        writer.writeStartDocument();
        writer.writeStartElement("root");
        writer.writeAttribute("attr-with-cr", "foo\r");
        writer.writeAttribute("attr-escaped-cr", "foo
");
        writer.writeEndElement();
        writer.writeEndDocument();
        writer.flush();
        writer.close();
        String s = outputStream.toString("UTF-8");
        System.out.println(s);
    }
}

已尝试的方案

  • 使用XML 1.1声明:调用xmlWriter.writeStartDocument("1.1"),序列化器可正常反序列化,但不确定该方案会带来什么潜在影响
  • 手动字符串替换:生成XML字符串后执行s = s.replaceAll("\r", "
"),表面可行,但对可靠性存疑

问题非重复说明

  • 《XMLStreamWriter - Java 8 - writeCharacters - 》:该问题针对节点文本字符写入,而非属性场景,不适用
  • 《XML Carriage return encoding》:仅提及需插入转义回车符,未给出Java环境下的具体实现方法

内容的提问来源于stack exchange,提问作者ShortFuse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:12:13