0

0

详细介绍通过JAXB实现XML和对象之间的映射

黄舟

黄舟

发布时间:2017-03-31 14:32:05

|

2406人浏览过

|

来源于php中文网

原创

    jaxb的全称是java architecture for xml binding,是一项可以通过xml产生java对象,也可以通过java对象产生xml的技术。jdk中关于jaxb部分有几个比较重要的接口或类,如:

Ø  JAXBContext:它是程序的入口类,提供了XML/Java绑定的操作,包括marshal、unmarshal等。

Ø  Marshaller:它负责把Java对象序列化为对应的XML。

Ø  Unmarshaller:它负责把XML反序列化为对应的Java对象。

序列化

         进行序列化的基本操作步骤如下:

  //1、获取一个基于某个class的JAXBContext,即JAXB上下文
   JAXBContext jaxbContext = JAXBContext.newInstance(obj.getClass());
   //2、利用JAXBContext对象创建对象的Marshaller实例。
   Marshaller marshaller = jaxbContext.createMarshaller();
   //3、设置一些序列化时需要的指定的配置
   marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    StringWriter writer = new StringWriter();
    //4、将对象进行序列化
    marshaller.marshal(obj, writer);

1、  创建一个JAXB上下文对象。

2、  利用JAXB上下文对象创建对应的Marshaller对象。

3、  指定序列化时的配置参数,具体可以设置的参数和对应的参数的含义可以参考API文档。

4、  最后一步是将对应的对象序列化到一个Writer、OutputStream、File等输出对象中,具体可以参考Marshaller接口的API文档。

         使用JAXB进行对象的序列化时对应的对象类型必须是javax.xml.bind.JAXBElement类型,或者是使用了javax.xml.bind.annotation.XmlRootElement注解标注的类型。XmlRootElement用于标注在class上面,表示把一个class映射为一个XML Element对象。与之相配合使用的注解通常还有XmlElement和XmlAttribute。XmlElement注解用于标注在class的属性上,用于把一个class的属性映射为一个XML Element对象。XmlAttribute注解用于标注在class的属性上,用于把一个class的属性映射为其class对应的XML Element上的一个属性。默认情况下,当我们的一个属性没有使用XmlElement标注时也会被序列化为Xml元素的一个子元素,如果我们不希望Java对象中的某个属性被序列化则可以在对应的属性或对应的get方法上采用XMLTransient进行标注。

A1.art
A1.art

一个创新的AI艺术应用平台,旨在简化和普及艺术创作

下载

示例

Person类

@XmlRootElement
public class Person {
 
   private Integer id;
   private String name;
   private Integer age;
   private Address address;
 
   @XmlAttribute(name = "id")
   public Integer getId() {
      returnid;
   }
 
   public void setId(Integer id) {
      this.id = id;
   }
 
   @XmlAttribute
   public String getName() {
      returnname;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   @XmlElement
   public Integer getAge() {
      returnage;
   }
 
   public void setAge(Integer age) {
      this.age = age;
   }
 
   @XmlElement
   public Address getAddress() {
      returnaddress;
   }
 
   public void setAddress(Address address) {
      this.address = address;
   }
 
}

Address类

@XmlRootElement
public class Address {
 
   private Integer id;
   private String province;
   private String city;
   private String area;
   private String other;
 
   @XmlAttribute(name="id")
   public Integer getId() {
      returnid;
   }
 
   public void setId(Integer id) {
      this.id = id;
   }
 
   @XmlElement
   public String getProvince() {
      returnprovince;
   }
 
   public void setProvince(String province) {
      this.province = province;
   }
 
   @XmlElement
   public String getCity() {
      returncity;
   }
 
   public void setCity(String city) {
      this.city = city;
   }
 
   @XmlElement
   public String getArea() {
      returnarea;
   }
 
   public void setArea(String area) {
      this.area = area;
   }
 
   @XmlElement
   public String getOther() {
      returnother;
   }
 
   public void setOther(String other) {
      this.other = other;
   }
 
}

测试方法

 @Test
   public void testMarshal() throws JAXBException {
      JAXBContext context = JAXBContext.newInstance(Person.class);
      Marshaller marshaller = context.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
      StringWriter writer = new StringWriter();
      Person person = new Person();
      person.setId(1);
      person.setName("张三");
      person.setAge(30);
      Address address = new Address();
      address.setId(1);
      address.setProvince("广东省");
      address.setCity("深圳市");
      address.setArea("南山区");
      address.setOther("其它");
      person.setAddress(address);
     
      marshaller.marshal(person, writer);
      System.out.println(writer.toString());
   }

输出结果



    
南山区 深圳市 其它 广东省
30

反序列化

         进行反序列化的基本步骤如下:

//1、创建一个指定class的JAXB上下文对象
   JAXBContext context = JAXBContext.newInstance(Person.class);
   //2、通过JAXBContext对象创建对应的Unmarshaller对象。
   Unmarshaller unmarshaller = context.createUnmarshaller();
   File file = new File("D:\\person.xml");
   //3、调用Unmarshaller对象的unmarshal方法进行反序列化,接收的参数可以是一个InputStream、Reader、File等
   Person person = (Person) unmarshaller.unmarshal(file);

    Unmarshaller对象在提供了一系列的unmarshal重载方法,对应的参数类型可以是File、InputStream、Reader等,具体的可以查看对应的API文档。

JAXB工具类

         除了使用JAXBContext来创建Marshaller和Unmarshaller对象来实现Java对象和XML之间的互转外,Java还为我们提供了一个工具类JAXB。JAXB工具类提供了一系列的静态方法来简化了Java对象和XML之间的互转,只需要简单的一行代码即可搞定。

 @Test
   public void testMarshal1() {
      Person person = new Person();
      person.setId(1);
      person.setName("张三");
      person.setAge(30);
      Address address = new Address();
      address.setId(1);
      address.setProvince("广东省");
      address.setCity("深圳市");
      address.setArea("南山区");
      address.setOther("其它");
      person.setAddress(address);
      JAXB.marshal(person, System.out);
   }
 
   @Test
   public void testUnmarshal1() {
      File xml = new File("D:\\person.xml");
      Person person = JAXB.unmarshal(xml, Person.class);
      System.out.println(person);
   }

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

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

精品课程

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

共142课时 | 6.1万人学习

XQuery 教程
XQuery 教程

共12课时 | 3.8万人学习

XLink  教程
XLink 教程

共7课时 | 1.1万人学习

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

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