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
相关产品推荐
相关产品推荐

