0

0

XML文件转字节数组 Java将Document转换为byte[]

星降

星降

发布时间:2026-02-21 10:57:47

|

204人浏览过

|

来源于php中文网

原创

用jaxp的transformer将document转byte[]最稳妥:先获取transformer实例,再用domsource封装document,最后通过bytearrayoutputstream输出;务必设置transformer.setoutputproperty(outputkeys.encoding, "utf-8")避免中文乱码。

xml文件转字节数组 java将document转换为byte[]

Document对象怎么转成byte[]?用Transformer最稳

Java里把Documentbyte[],别手写序列化,也别碰DOMImplementationLS这种冷门API——直接走JAXP的Transformer,兼容性好、编码可控、还能处理命名空间和DOCTYPE。

核心就三步:拿到Transformer实例 → 把Document塞进DOMSource → 用ByteArrayOutputStream接输出。中间唯一要盯紧的是编码设置,否则中文变乱码。

  • TransformerFactory.newInstance().newTransformer()就行,不用设OutputKeys.ENCODING——那是输出时用的,不是创建时
  • 必须调transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"),否则默认ISO-8859-1,中文全跪
  • DOMSource构造函数只认NodeDocument是它的子类),别传ElementNodeList

为什么不用String.getBytes()?字符编码会吃掉你

有人先transformString再调String.getBytes("UTF-8"),看着省事,实则埋雷:XML声明里的encoding属性(比如<?xml version="1.0" encoding="GBK"?>)和实际字节流编码不一致时,解析器会按声明去读,但你的getBytes()按UTF-8生成,结果就是“明明写了UTF-8却报Invalid byte 1 of 1-byte UTF-8 sequence”。

  • XML声明是元信息,不是装饰;Transformer会把它和实际字节对齐,String中转会切断这个链路
  • 如果原始Document是从GBK文件加载的,但没显式设OutputKeys.ENCODINGTransformer仍按UTF-8输出,此时XML声明却还是GBK——错得更隐蔽
  • 真要调试,打印new String(byteArray, StandardCharsets.UTF_8)看内容,比猜编码靠谱

遇到“Content is not allowed in prolog”错误?多半是BOM或空格

转出来的byte[]喂给InputStream或HTTP body后,下游报Content is not allowed in prolog,八成不是编码问题,而是XML开头多了不可见字符:BOM、UTF-8 BOM(EF BB BF)、或者Transformer前手动拼了换行/空格。

通塔师AI导航
通塔师AI导航

通塔师AI导航:专业的AI人工智能工具软件导航网站

下载

立即学习Java免费学习笔记(深入)”;

  • Transformer默认不加BOM,但如果你用FileOutputStream写文件时用了Writer再转字节,就可能带BOM——这里全程用OutputStream,绕过Writer
  • 检查Document本身:用document.getDocumentElement().getFirstChild()看看是不是TEXT_NODEgetNodeValue().trim().isEmpty(),这种空白文本节点会被序列化出来
  • 加个过滤:调transformer.setOutputProperty(OutputKeys.INDENT, "no"),再设OutputKeys.OMIT_XML_DECLARATION, "no"确保声明在最顶行,不被前置空白干扰

大文件或高频转换?注意Transformer不是线程安全的

Transformer实例不能复用在多线程里,官方文档明确写了“not thread-safe”。如果你在Servlet或Spring Bean里单例持有它,高并发下会出诡异的编码错乱或空指针。

  • 每次转换都新建Transformer——开销极小,TransformerFactory才是重的,它可复用
  • 如果真卡性能,缓存TransformerFactory(静态final),但别缓存Transformer
  • 别为了“省对象”用ThreadLocal<transformer></transformer>,除非你确定所有调用栈都走同一线程模型;Web容器线程复用会让它失效

真正容易被忽略的是:Document对象本身可能跨线程共享,而DocumentNode树不是线程安全的——转之前确认没人在并发修改它。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

143

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

81

2026.01.26

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

386

2023.08.08

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

810

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1929

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2106

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1132

2024.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

421

2023.07.18

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.7万人学习

C# 教程
C# 教程

共94课时 | 9.9万人学习

Java 教程
Java 教程

共578课时 | 69.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号