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

