如何使用Transformer避免XML写入文件时字符串被转义?
解决XML写入文件时的双重转义问题
看起来你遇到的是XML内容双重转义的问题——你的原始DOM文档里已经包含了转义后的实体(比如&),但默认的Transformer在输出时又对这些特殊字符做了一次转义,导致最终文件里出现&、<这类重复转义的内容。
问题根源
Java的Transformer类默认会自动转义XML中的特殊字符(<、>、&、"、'),确保生成的XML符合语法规范。但如果你的DOM节点文本已经是预转义的内容(比如原本就有&表示&),这种默认行为就会造成二次转义。
解决方案:禁用自动转义
你只需要给Transformer设置ESCAPE_CHARACTERS输出属性为"no",就能让它原样输出文本内容,不再执行转义操作。修改后的代码如下:
public static void function(Document doc, String fileUri, String randomId) { DOMSource source = new DOMSource(doc); try { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); // 关键:禁用自动字符转义 transformer.setOutputProperty(OutputKeys.ESCAPE_CHARACTERS, "no"); // 可选:如果需要格式化输出XML,可以添加以下属性 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); StreamResult result = new StreamResult(new File(fileUri)); transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } }
注意事项
- 这个方法仅适用于你确定DOM文档中的所有特殊字符都已经正确转义的情况。如果文档里存在未转义的特殊字符(比如直接写
&而不是&),禁用转义后生成的XML会不符合规范,可能无法被正常解析。 - 如果你的XML需要保留声明(比如
<?xml version="1.0" encoding="UTF-8"?>),不需要额外设置omit-xml-declaration,默认会保留。
内容的提问来源于stack exchange,提问作者Rajeev
相关产品推荐
相关产品推荐

