1. 什么是JAXB?
Java Architecture for XML Binding (JAXB)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAX或DOM。JAXB隐藏了细节并且取消了SAX和DOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。
2. JAXB的体系结构
JAXB的体系结构和应用过程如图所示,一般来说包含以下几个步骤:
1) 根据你的应用程序所要操作的XML数据格式,撰写相应的XML Schema,有关XML Schema的知识,请参阅“参考资料”
2) 使用JAXB所带的编译工具(Binding Compiler),将这个XML Schema文件作为输入,产生一系列相关的Java Class和Interface
3) 在使用JAXB编译工具的时候,可以有选择性的提供一个配置文件(图的虚线部分),来控制JAXB编译工具的一些高级属性。
4) 这些Java Class和Interface是你的应用程序操纵XML数据的主要接口和方法。
5) 通过JAXB对XML文档进行的操作主要包括:将符合XML Schema规定的XML文档解析生成一组相应的Java对象;对这些对象进行操作(修改、增加和删除对象的属性等等);然后将这些对象的内容保存到这个XML文档中。
package com.test;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
public class User {
private int id;
private String name;
@XmlAttribute (name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return id + ":" + name;
}
}
package com.test;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "users")
public class UserList {
List<User> users = new ArrayList<User>();
@XmlElement(name = "user")
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
package com.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class UserGenerateClient {
public static void main(String[] args) {
try {
JAXBContext jc = JAXBContext.newInstance(UserList.class);
Marshaller m = jc.createMarshaller();
OutputStream os = new FileOutputStream(new File("user2.xml"));
UserList list = new UserList();
User user = new User();
user.setId(100);
user.setName("Shawn");
list.getUsers().add(user);
user = new User();
user.setId(200);
user.setName("Jason");
list.getUsers().add(user);
m.marshal(list, os);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.test;
import java.net.URL;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class UserReadClient {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(UserList.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
URL xmlFileUrl = UserReadClient.class.getResource("user2.xml");
UserList userList = (UserList) unmarshaller.unmarshal(xmlFileUrl);
for (User m: userList.getUsers()){
System.out.println(m.getName());
System.out.println(m.getId());
}
}
}