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

Java使用Transformer创建XML时如何在声明后添加DOCTYPE自定义行

解决方法

你要添加的是XML的DOCTYPE声明,直接通过Transformer的输出属性配置就可以实现,有两种可选方案:

方案1:标准XML规范实现(推荐)

这种方式生成的DOCTYPE完全符合XML规范,DOCTYPE中的根元素名会和你实际生成的XML根元素保持一致。
找到你代码中Transformer配置的部分,新增一行DOCTYPE相关的输出属性即可:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
// 新增这行配置SYSTEM DOCTYPE
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "L3definitions.dtd");

DOMSource domSource = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File("./data/out/test.xml")); 
transformer.transform(domSource, streamResult);

如果你的DTD中定义的根元素是大写的DEFINITIONS,只需要把你创建根元素的代码里的标签名改为大写即可:

// 把原来的"definition"改成"DEFINITIONS"
Element root = document.createElement("DEFINITIONS");

方案2:强制插入指定DOCTYPE行

如果你确实需要DOCTYPE的根元素名和实际XML根元素名不一致,可以直接操作生成的XML字符串插入指定内容:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

DOMSource domSource = new DOMSource(document);
// 先输出到字符串
StringWriter stringWriter = new StringWriter();
transformer.transform(domSource, new StreamResult(stringWriter));
String xmlContent = stringWriter.toString();
// 插入自定义DOCTYPE行
String finalXml = xmlContent.replaceFirst("(<\\?xml[^>]*\\?>)", "$1\n<!DOCTYPE DEFINITIONS SYSTEM \"L3definitions.dtd\">");
// 写入文件
Files.write(Paths.get("./data/out/test.xml"), finalXml.getBytes(StandardCharsets.UTF_8));

方案2需要自行导入java.nio、java.io相关的依赖包

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:54:04