Java的Transformer怎么设置输出属性(indent, encoding)

发布时间 - 2026-01-29 00:00:00    点击率:
Java Transformer需通过setOutputProperties设置indent和encoding:启用缩进需设OutputKeys.INDENT为"yes"并可选配Xalan扩展indent-amount;编码由OutputKeys.ENCODING控制,须与输出目标匹配,如StreamResult+OutputStream生效,StringWriter则忽略。

Java 中的 Transformer(来自 javax.xml.transform)本身不直接提供 indentencoding 属性的 setter 方法,这些设置需通过 OutputKeys 写入 transformer.setOutputProperties() 来控制。

设置缩进(indent)

启用缩进需要两步:开启缩进功能 + 指定缩进数量(可选)。注意:仅对支持格式化输出的 Result 类型(如 StreamResult 配合 OutputStreamWriter)生效,且底层 XSLT 处理器(如 Xalan)需支持。

  • 设置 OutputKeys.INDENT"yes"
  • 可选:用 "{http://xml.apache.org/xslt}indent-amount" 设置缩进空格数(Xalan 扩展,非标准但常用)

示例:

transformer.setOutputProperties(Map.of(
    OutputKeys.INDENT, "yes",
    "{http://xml.apache.org/xslt}indent-amount", "2"
));

设置编码(encoding)

编码由 OutputKeys.ENCODING 控制,它影响输出字节流的字符编码和 XML 声明中的 encoding 属性值。

  • 必须与实际写入目标匹配:若用 StreamResult 包装 FileOutputStream,编码会用于字节转换;若包装 StringWriter,该设置会被忽略(Writer 已确定编码)
  • 常见值:"UTF-8""GBK""ISO-8859-1"

示例:

Properties props = new Properties();
props.setProperty(OutputKeys.ENCODING, "UTF-8");
props.setProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperties(props);

注意事项和常见问题

这些设置不是万能的,实际效果受多个因素影响:

  • 缩进在默认 TransformerFactory(JDK 自带 Xalan)下通常有效;换成其他实现(如 Saxon)需查其文档,语法可能不同
  • 若输入是 DOMSource 且节点已含空白文本,缩进可能被保留或干扰,建议先调用 document.normalizeDocument() 或预处理
  • 编码设置不会自动改变 OutputStream 的行为——你仍需确保用对应编码打开文件(如 Files.newOutputStream(path, StandardOpenOption.CREATE) 不指定编码,应配合 OutputStreamWriter 显式指定)

完整小例子(带缩进和 UTF-8)

生成格式化、UTF-8 编码的 XML 字符串:

TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperties(Map.of(
    OutputKeys.METHOD, "xml",
    OutputKeys.ENCODING, "UTF-8",
    OutputKeys.INDENT, "yes",
    "{http://xml.apache.org/xslt}indent-amount", "4"
));

StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
String xml = writer.toString(); // 此时含缩进和 UTF-8 声明

基本上就这些。关键记住:属性靠 setOutputProperties 设,不

是调方法;缩进和编码都依赖底层实现和输出目标类型,实测比理论更可靠。


# java  # apache  # 处理器  # 编码  # 字节  # win  # stream  # 常见问题  # 格式化输出  # xml  # 字符串  # transform  # transformer  # http  # 可选  # 多个  # 并可  # 自带  # 两步  # 仍需  # 不直接  # 非标准  # 仅对  # 不是万能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android使用GridView实现日历的简单功能  如何彻底卸载建站之星软件?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何在景安云服务器上绑定域名并配置虚拟主机?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何快速配置高效服务器建站软件?  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  利用vue写todolist单页应用  在Oracle关闭情况下如何修改spfile的参数  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何用VPS主机快速搭建个人网站?  如何快速搭建高效WAP手机网站吸引移动用户?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  详解阿里云nginx服务器多站点的配置  Android okhttputils现在进度显示实例代码  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  javascript读取文本节点方法小结  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  高防服务器租用首荐平台,企业级优惠套餐快速部署  ,南京靠谱的征婚网站?  linux写shell需要注意的问题(必看)  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  制作企业网站建设方案,怎样建设一个公司网站?  javascript中闭包概念与用法深入理解  青岛网站建设如何选择本地服务器?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  再谈Python中的字符串与字符编码(推荐)  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Android自定义控件实现温度旋转按钮效果  Swift中循环语句中的转移语句 break 和 continue  网站建设保证美观性,需要考虑的几点问题!  JavaScript Ajax实现异步通信  高性价比服务器租赁——企业级配置与24小时运维服务  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  新三国志曹操传主线渭水交兵攻略  如何快速生成凡客建站的专业级图册?  无锡营销型网站制作公司,无锡网选车牌流程?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  黑客入侵网站服务器的常见手法有哪些?  简历在线制作网站免费版,如何创建个人简历?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  如何挑选最适合建站的高性能VPS主机?  中国移动官方网站首页入口 中国移动官网网页登录  详解CentOS6.5 安装 MySQL5.1.71的方法