Java如何将ResultSet转换为XML格式

Java中将ResultSet转XML有三种主流方式:手动拼接(适合简单场景,需转义特殊字符)、DOM构建(推荐,结构规范可控)、JAXB序列化(需POJO映射,JDK9+需额外引入依赖),均需注意空值、LOB、日期格式和编码处理。

Java中将ResultSet转换为XML,核心思路是遍历结果集,逐行逐列提取数据,按XML结构拼接或使用DOM/SAX/JAXB生成标准XML文档。关键在于处理字段名、空值、特殊字符和编码问题。

手动拼接XML字符串(适合简单场景)

适用于小数据量、结构固定、对XML格式要求不高的情况。注意转义、&、"、'等字符,避免XML解析失败。

  • ResultSetMetaData获取列名和列数
  • 每行用包裹,每列用值列名>表示
  • 对字段值调用StringEscapeUtils.escapeXml11()(Apache Commons Text)或手动替换
  • 开头加上,结尾加

使用DOM构建标准XML文档(推荐,可控性强)

适合需要规范命名空间、属性、缩进或后续修改的场景。内存占用略高,但结构清晰、可校验。

  • 创建DocumentBuilder,新建Document
  • 添加根元素(如result),循环ResultSet,为每行创建row元素
  • 对每一列,创建子元素(或设为属性),用Text节点设置内容并自动处理转义
  • Transformer输出时设置OutputKeys.INDENTENCODING

借助JAXB(适合映射到Java对象后再转XML)

当已有对应实体类且结构稳定时最简洁。ResultSet先转List,再用JAXBContext序列化。

  • 定义POJO类,标注@XmlRootElement@XmlElement
  • 遍历ResultSet,反射赋值或手动封装为对象列表
  • 调用JAXBContext.newInstance(...).createMarshaller().marshal()
  • 注意:JAXB在JDK9+默认移除,需引入jaxb-apijaxb-runtime

注意事项与避坑点

无论哪种方式,都需关注:

  • 空值处理:ResultSet.getObject(i)返回null时,XML中建议输出(需声明xsi命名空间)
  • LOB字段(BLOB/CLOB):避免直接toString(),应读取为String或Base64编码后写入
  • 日期时间格式:用SimpleDateFormat统一转为ISO 8601格式(如yyyy-MM-dd HH:mm:ss)
  • 字符编码:确保数据库连接URL含useUnicode=true&characterEncoding=UTF-8,XML声明也设为UTF-8