概念
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
示例:将xml文件转换为java类。如下图:
说明:
(1): XSD文件是通过另外一套语法规则定义的文件,个人认为可以使用工具生成。这里我用的是Altova XMLSpy(工具多种多样)
(2): 使用xjc命令将XSD文件转换为Java Bean
现在,给出示例一的完整版。
首先,需要一个XML文件描述我们的实体类,它的样子看起来如下:
<?xmlversion="1.0" encoding="UTF-8"?>
<UserInfo id="123" userName="yanan" passWord="123456">
<Role id="1" roleName="管理员"description="超级权限"></Role>
</UserInfo>
然后使用工具生成XSD文件:
(1):选择“DTD模式”
(2):选择“W3C模式”,点击确定。如下图:
生成之后,剩下的工作就是使用xjc命令生成java类了,语法如下:
xjc[-xmlschema|-dtd] [–d 保存java文件的目录] [–pjava文件所在的包] <编译文件>
-xmlschema 指定编译文件的格式为Schema格式,此参数是默认值,可以不用提供。
如果不提供此参数,编译文件必须是Schema文件。
-dtd 指定编译文件的格式为DTD格式,如果编译文件是DTD文件则必须提供此参数。
-d 指定了保存java文件的目录
-p 指定了生成的java文件所在的包
按照上边的命令,即可生成java类了
UserInfo.java
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"role"
})
@XmlRootElement(name = "UserInfo")
public class UserInfo {
@XmlElement(name = "Role", required = true)
protected Role role;
@XmlAttribute(required = true)
protected String userName;
@XmlAttribute(required = true)
protected int passWord;
@XmlAttribute(required = true)
protected byte id;
public Role getRole() {
return role;
}
public void setRole(Role value) {
this.role = value;
}
public String getUserName() {
return userName;
}
public void setUserName(String value) {
this.userName = value;
}
public int getPassWord() {
return passWord;
}
public void setPassWord(int value) {
this.passWord = value;
}
public byte getId() {
return id;
}
public void setId(byte value) {
this.id = value;
}
}
Role,java
import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "Role")
public class Role {
@XmlAttribute(required = true)
protected String roleName;
@XmlAttribute(required = true)
protected byte id;
@XmlAttribute(required = true)
protected String description;
public String getRoleName() {
return roleName;
}
public void setRoleName(String value) {
this.roleName = value;
}
public byte getId() {
return id;
}
public void setId(byte value) {
this.id = value;
}
public String getDescription() {
return description;
}
public void setDescription(String value) {
this.description = value;
}
}
ObjectFactoy.java
import javax.xml.bind.annotation.XmlRegistry;
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public Role createRole() {
return new Role();
}
public UserInfo createUserInfo() {
return new UserInfo();
}
}
JAXB常用操作
涉及到java类与xml操作的接口都在javax.xml.bind包下,频繁的操作无非编组和解组。所谓编组就是将 Java 内容树序列化回 XML 数据的过程;所谓解组就是将 XML 数据反序列化为新创建的Java 内容树的过程。这里面有三个类需要熟悉:一个是JAXBContext,一个是Unmarshaller还有Marshaller
针对上面示例所产生的Java Class,我们可以进行以下操作:
public static void main(String[]args) throws FileNotFoundException{
marshal(new FileOutputStream("out.xml"));
unmarshal(new File("out.xml"));
}
/**
* 解组
* @param file需要解组的文件
*/
private static void unmarshal(File file) {
Class[] classes={UserInfo.class,Role.class};
JAXBContext jc;
try {
jc = JAXBContext.newInstance(classes,null);
Unmarshaller u =jc.createUnmarshaller();
//解组
UserInfo fooObj =(UserInfo)u.unmarshal(file);
System.out.println("用户名:"+fooObj.getUserName()+
"\n"+"密码:"+fooObj.getPassWord()+
"\n"+"角色名称:"+fooObj.getRole().getRoleName());
} catch (JAXBException e) {
e.printStackTrace();
}
}
/**
* 编组:将 Java 内容树序列化回 XML 数据的过程
* @param output
*/
private static void marshal(OutputStream output) {
ObjectFactory obj=new ObjectFactory();
Class[] classes={UserInfo.class,Role.class};
//实例化用户、角色对象;并赋值
UserInfo userInfo =obj.createUserInfo();
Role role=obj.createRole();
role.setId((byte)2);
role.setRoleName("管理员...");
role.setDescription("超级权限...");
userInfo.setId((byte)123321);
userInfo.setUserName("andy");
userInfo.setPassWord((byte)123456);
userInfo.setRole(role);
try {
JAXBContext jc=JAXBContext.newInstance(classes,null);
Marshaller m=jc.createMarshaller();
//编组
m.marshal(userInfo,output);
} catch(Exception e){
e.printStackTrace();
}
finally {
try {
output.close();
} catch (IOException e) {
}
}
}
常见的操作就这些了,对于相关类的用法可以参考API。