JAXB 的全名是Java Architecture for XML Binding。JAXB的特点就是将你用DTD定义好的XML文档映射为Java对象,提供简单、快速的数据操作方式。要访问XML中的元素、属性只要通过相应对象上的一系列getter和 setter方法。你还可以通过marshal方法将对象的数据写进XML文件,通过unmarshal方法将XML文件的数据读入对象,通过validate方法验证XML文件是否符合DTD的约束。JAXB的缺点就在于只能访问特定的(也就是你用DTD定义的)XML文档。
先看例子吧:
Customer.java
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
String name;
int age;
int id;
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString()
{
return "Customer[" + getName() + "," + getId() + "," + getAge() + "]";
}
}
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
public class JAXBExample {
public static void main(String[] args) {
Customer customer = new Customer();
customer.setId(100);
customer.setName("mkyong");
customer.setAge(29);
try {
File file = new File("C:\\file.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
//JAVA to XML
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
//按标签划分行
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out); //打印输出
//XML TO JAVA
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer mycustomer = (Customer) jaxbUnmarshaller.unmarshal(file);
System.out.println(mycustomer);
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
控制台打印输出如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100">
<age>29</age>
<name>mkyong</name>
</customer>
Customer[mkyong,100,29]
关于注解:
@XmlRootElement 将一个Java类映射为一段XML的根节点
参数:name 定义这个根节点的名称
namespace 定义这个根节点命名空间
@XmlAccessorType 定义映射这个类中的何种类型需要映射到XML。可接收四个参数,分别是:
XmlAccessType.FIELD:映射这个类中的所有字段到XML
XmlAccessType.PROPERTY:映射这个类中的属性(get/set方法)到XML
XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field或property同时映射到XML(默认)
XmlAccessType.NONE:不映射
@XmlElement 指定一个字段或get/set方法映射到XML的节点。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。
参数:defaultValue 指定节点默认值
name 指定节点名称
namespace 指定节点命名空间
required 是否必须(默认为false)
nillable 该字段是否包含 nillable="true" 属性(默认为false)
type 定义该字段或属性的关联类型
@XmlAttribute 指定一个字段或get/set方法映射到XML的属性。
参数:name 指定属性名称
namespace 指定属性命名空间
required 是否必须(默认为false)
@XmlTransient 定义某一字段或属性不需要被映射为XML。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。
@XmlType 定义映射的一些相关规则
参数:propOrder 指定映射XML时的节点顺序
factoryClass 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
factoryMethod 指定工厂类的工厂方法
name 定义XML Schema中type的名称
namespace 指定Schema中的命名空间
@XmlElementWrapper 为数组元素或集合元素定义一个父节点。如,类中有一元素为List items,若不加此注解,该元素将被映射为
<items>...</items>
<items>...</items>
这种形式,此注解可将这个元素进行包装,如:
@XmlElementWrapper(name="items")
@XmlElement(name="item")
public List items;
将会生成这样的XML样式:
<items>
<item>...</item>
<item>...</item>
</items>
@XmlJavaTypeAdapter 自定义某一字段或属性映射到XML的适配器。如,类中包含一个接口,我们可以定义一个适配器(继承自 javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接口如何映射到XML。
@XmlSchema 配置整个包的namespace,这个注解需放在package-info.java文件中。
测试:
将上面的代码做少许更改,如下:
@XmlElement(name = "myname")
public String getName() {
return name;
}
@XmlAttribute(name = "theID")
public int getId() {
return id;
}
结果打印输出为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer theID="100">
<age>29</age>
<myname>mkyong</myname>
</customer>
Customer[mkyong,100,29]
发现改变了属性及节点的标签名称。
总结:
注解可以放在成员变量声明上面,也可以放在set/get函数上面。若是要指定别名的时候,不能放在变量声明上面,会报错。
参考:jaxb注解
分享到:
相关推荐
通过以上知识的学习,配合提供的安装和使用教程,你将能够熟练地掌握XML这一重要的数据描述语言,从基本的语法到高级的转换和查询技巧,实现从初步了解XML到精通的飞跃。在实际工作中,XML是许多企业级应用和互联网...
4. **IO流**:掌握InputStream、OutputStream、Reader、Writer等流的使用,以及文件操作,缓冲流(BufferedReader、BufferedWriter)的使用,还有NIO(New IO)的初步了解。 5. **多线程**:线程的创建(Thread类和...
【XML学生信息查询系统源码】是一个基于Java编程语言并结合XML(Extensible Markup Language)技术实现的简单信息管理系统,主要...对于课程设计来说,这是一个很好的练习,可以帮助学生建立起实际项目开发的初步概念。
标题 "CXF入门例子" 暗示了我们要探讨的是Apache CXF框架的初步使用,这是一个流行的开源服务框架,用于构建和开发Web服务。Apache CXF允许开发者通过Java API来创建SOAP和RESTful Web服务,提供了强大的功能和易用...
5. **JAXB(Java Architecture for XML Binding)**:JAXB提供了一种将XML数据绑定到Java对象的机制,方便XML数据的处理。 6. **Web Services**:1.5版加强了对SOAP和WSDL的支持,使得J2EE应用能够更好地集成Web...
6. **XML处理改进**:Java 6对XML处理API进行了优化,如`javax.xml.bind`包的JAXB(Java Architecture for XML Binding)允许对象与XML之间的自动转换,而`javax.xml.stream`则提供了基于事件的流处理。 7. **改进...
通过以上内容,你可以了解Java集合框架中Set接口的使用,包括HashSet和TreeSet的区别以及如何自定义排序。同时,也对XML编程有了初步的认识。在实际编程中,根据需求选择合适的集合类型和XML处理方法是非常关键的。
6. **Web服务支持**:JDK 6加强了对Java EE和Web服务的支持,如Java API for RESTful Web Services (JAX-RS)的初步实现,使得开发RESTful服务更加便捷。 7. **脚本语言支持**:通过Java Scripting API,JDK 6可以...
【标题】:“chat工程代码”是一个Java编程语言实现的简单聊天工具项目,它代表了开发者在构建一个实时通信应用的初步尝试。这个工程的核心目标是创建一个基础的聊天平台,允许用户之间进行文本交流。虽然描述中提到...
8. **JSON或XML解析**:数据交换格式如JSON或XML可能被用来存储和传输地理位置信息,因此需要了解如何使用如Jackson或JAXB等库来解析这些格式。 9. **单元测试**:为了确保代码的质量,项目可能包含了JUnit测试用例...
【描述】"你好,世界 我的第一个github应用"表明这个项目是作者接触GitHub和编程的初步尝试。"你好,世界"是编程界非常经典的例子,常用于教学起始,因为它展示了如何在各种编程语言中写出第一条能运行并打印出...