17370845950

如何将XML文件转换为Java对象 JAXB Unmarshalling教程
JAXB反序列化需配置带注解的Java类(@XmlRootElement等)、创建JAXBContext并调用unmarshal;JDK9+需引入jakarta.xml.bind依赖并更新包名。

使用JAXB进行XML到Java对象的转换(即Unmarshalling)非常直接,关键在于正确配置实体类、确保XML结构匹配,并调用Unmarshaller解析。JDK 8及以前版本自带JAXB,JDK 9+需额外引入依赖。

准备带JAXB注解的Java类

Java类必须能被JAXB识别——通常通过@XmlRootElement标注根元素,并用@XmlElement@XmlAttribute等声明字段与XML节点的映射关系。

  • 根类必须加@XmlRootElement(name = "person"),name值应与XML根标签一致
  • 普通字段用@XmlElement(name = "name")对应子元素名;如字段名与XML标签名相同,name属性可省略
  • 需要映射属性时,用@XmlAttribute(name = "id")
  • 集合类型建议用@XmlElement(name = "item")并配合List,避免用ArrayList等具体实现类

加载XML并执行Unmarshalling

核心步骤是创建JAXBContext,获取Unmarshaller,再调用unmarshal()方法传入XML源(FileInputStreamStringReader均可)。

  • 代码示例:
      JAXBContext context = JAXBContext.newInstance(Person.class);
      Unmarshaller unmarshaller = context.createUnmarshaller();
      Person person = (Person) unmarshaller.unmarshal(new File("person.xml"));
  • 若XML含命名空间,需在@XmlRootElement中指定namespace,且unmarshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", ...)可选
  • 遇到格式错误会抛JAXBException,建议用try-catch捕获并打印e.getMessage()快速定位问题

处理常见问题

实际转换中容易卡在几个典型环节:类未识别、字段不赋值、集合为空、日期/枚举解析失败。

  • 报错“class not known to this context”:确认JAXBContext.newInstance()参数包含所有相关类(如有嵌套对象,一并传入)
  • 字段为null但XML中有值:检查getter/setter是否完整、访问权限是否为public、字段是否被@XmlAccessorType(XmlAccessType.FIELD)正确覆盖
  • 集合为空:确认XML中对应子元素存在且拼写准确;若用@XmlElementWrapper(name="items"),则XML中必须有...
  • 日期类型转换失败:用@XmlSchemaType(name="date")或自定义XmlAdapter处理格式(如LocalDateTime需适配器)

JDK 9+ 使用注意事项

从JDK 9开始,JAXB被移出默认模块,需手动添加Maven依赖:

  • Maven坐标(推荐Jakarta EE版本):

      jakarta.xml.bind
      jakarta.xml.bind-api
      4.0.0


      org.glassfish.jaxb
      jaxb-runtime
      4.0.3
  • 包名已从javax.xml.bind升级为jakarta.xml.bind,导入语句和注解类名需同步更新