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

如何使用Transformer避免XML写入文件时字符串被转义?

解决XML写入文件时的双重转义问题

看起来你遇到的是XML内容双重转义的问题——你的原始DOM文档里已经包含了转义后的实体(比如&),但默认的Transformer在输出时又对这些特殊字符做了一次转义,导致最终文件里出现&、<这类重复转义的内容。

问题根源

Java的Transformer类默认会自动转义XML中的特殊字符(<、>、&、"、'),确保生成的XML符合语法规范。但如果你的DOM节点文本已经是预转义的内容(比如原本就有&amp;表示&),这种默认行为就会造成二次转义。

解决方案:禁用自动转义

你只需要给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文档中的所有特殊字符都已经正确转义的情况。如果文档里存在未转义的特殊字符(比如直接写&而不是&amp;),禁用转义后生成的XML会不符合规范,可能无法被正常解析。
  • 如果你的XML需要保留声明(比如<?xml version="1.0" encoding="UTF-8"?>),不需要额外设置omit-xml-declaration,默认会保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:35:07