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


相关推荐: Firefox Developer Edition开发者版本入口  如何解决hover在ie6中的兼容性问题  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何做网站制作流程,*游戏网站怎么搭建?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  php json中文编码为null的解决办法  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Angular 表单中正确绑定输入值以确保提交与验证正常工作  北京的网站制作公司有哪些,哪个视频网站最好?  Android自定义listview布局实现上拉加载下拉刷新功能  如何实现建站之星域名转发设置?  如何自定义建站之星网站的导航菜单样式?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Python3.6正式版新特性预览  Linux网络带宽限制_tc配置实践解析【教程】  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  详解Huffman编码算法之Java实现  Bootstrap整体框架之JavaScript插件架构  如何为不同团队 ID 动态生成多个“认领值班”按钮  在Oracle关闭情况下如何修改spfile的参数  Internet Explorer官网直接进入 IE浏览器在线体验版网址  用yum安装MySQLdb模块的步骤方法  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在企业微信快速生成手机电脑官网?  如何在建站主机中优化服务器配置?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  linux top下的 minerd 木马清除方法  Laravel怎么在Blade中安全地输出原始HTML内容  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何在服务器上三步完成建站并提升流量?  浅谈redis在项目中的应用  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  三星、SK海力士获美批准:可向中国出口芯片制造设备  怎样使用JSON进行数据交换_它有什么限制  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Python函数文档自动校验_规范解析【教程】  如何在宝塔面板中修改默认建站目录?