JAXB注解形式进行xml与Object类型转换

package com.pers;

import java.io.Serializable;
import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)                                          // 控制默认情况下是否对字段或 Javabean 属性进行系列化
@XmlRootElement(name = "Computer")    										   // xml 文件的根元素
@XmlType(propOrder = { "serialNumber", "brandName", "productDate", "price" })  //将Java类或枚举类型映射到XML模式类型
public class Computer implements Serializable {  
	private static final long serialVersionUID = 1L;  

	// 序列号  
	private String serialNumber;  
	// 品牌名  
	private String brandName;  
	// 生成日期  
	private Date productDate;  
	// 价格  
	private double price;  

	public Computer() {  
		super();  
	}  

	public Computer(String serialNumber, String brandName, Date productDate,  
			double price) {  
		super();  
		this.serialNumber = serialNumber;  
		this.brandName = brandName;  
		this.productDate = productDate;  
		this.price = price;  
	}  

	public String getSerialNumber() {  
		return serialNumber;  
	}  

	public void setSerialNumber(String serialNumber) {  
		this.serialNumber = serialNumber;  
	}  

	public String getBrandName() {  
		return brandName;  
	}  

	public void setBrandName(String brandName) {  
		this.brandName = brandName;  
	}  

	public Date getProductDate() {  
		return productDate;  
	}  

	public void setProductDate(Date productDate) {  
		this.productDate = productDate;  
	}  

	public double getPrice() {  
		return price;  
	}  

	public void setPrice(double price) {  
		this.price = price;  
	}  

}  

  

package com.pers;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)  
//XML文件中的根标识  
@XmlRootElement(name = "User")  
//控制JAXB 绑定类中属性和字段的排序  
@XmlType(propOrder = {   
		"computers"  
})  
public class User implements Serializable {  
	private static final long serialVersionUID = 1L;  

	/*	// 用户Id  
	private int userId;  
	// 用户名  
	private String userName;  
	// 用户密码  
	private String password;  
	// 用户生日  
	private Date birthday;  
	// 用户钱包  
	private double money;  */
	// 拥有的电脑  
	private List<Computer> computers;  

	public User() {  
		super();  
	}  

	public User(List<Computer> computers) {
		super();
		this.computers = computers;
	}

	/*
	public User(int userId, String userName, String password, Date birthday,  
			double money) {  
		super();  
		this.userId = userId;  
		this.userName = userName;  
		this.password = password;  
		this.birthday = birthday;  
		this.money = money;  
	}  

	public int getUserId() {  
		return userId;  
	}  

	public void setUserId(int userId) {  
		this.userId = userId;  
	}  

	public String getUserName() {  
		return userName;  
	}  

	public void setUserName(String userName) {  
		this.userName = userName;  
	}  

	public String getPassword() {  
		return password;  
	}  

	public void setPassword(String password) {  
		this.password = password;  
	}  

	public Date getBirthday() {  
		return birthday;  
	}  

	public void setBirthday(Date birthday) {  
		this.birthday = birthday;  
	}  

	public double getMoney() {  
		return money;  
	}  

	public void setMoney(double money) {  
		this.money = money;  
	}  */


	public void setComputers(List<Computer> computers) {  
		this.computers = computers;  
	}  

	public List<Computer> getComputers() {  
		return computers;  
	}


	@Override
	public String toString() {
		return "User [computers=" + computers + "]";
	}  

	/*@Override  
	public String toString() {  
		return "User [birthday=" + birthday + ", computers=" + computers  
				+ ", money=" + money + ", password=" + password + ", userId="  
				+ userId + ", userName=" + userName + "]";  
	}*/  


}  
//将对象转换成File类型的xml
package com.pers;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class Test {  
	public static void main(String[] args) {  
		User user = new User();  
		List<Computer> list = new ArrayList<Computer>();  
		list.add(new Computer("xxxMMeedd", "asus", new Date(), 4455.5));  
		list.add(new Computer("lenvoXx", "lenvo", new Date(), 4999));  
		user.setComputers(list);  
		String path = "D:\\user.xml";  
		convertToXml(user, path);  
		System.out.println("---将对象转换成File类型的xml End---");  
	} 

	public static void convertToXml(Object obj, String path) {  
		try {  
			// 利用jdk中自带的转换类实现  
			JAXBContext context = JAXBContext.newInstance(obj.getClass());  

			Marshaller marshaller = context.createMarshaller();  
			// 格式化xml输出的格式  
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,  
					Boolean.TRUE);  
			// 将对象转换成输出流形式的xml  
			// 创建输出流  
			FileWriter fw = null;  
			try {  
				fw = new FileWriter(path);  
			} catch (IOException e) {  
				e.printStackTrace();  
			}  
			marshaller.marshal(obj, fw);  
		} catch (JAXBException e) {  
			e.printStackTrace();  
		}  
	}  
}  

把XML转换成对象 :

package com.pers;

import java.io.FileNotFoundException;
import java.io.FileReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class Test1 {
	public static void main(String[] args) {  
		//把XML转换成对象  

		String path = "D:\\user.xml";    
		User user = (User)convertXmlFileToObject(User.class, path);  
		System.out.println(user.toString());    
	}  

	
	/** 
	 * 将file类型的xml转换成对象 
	 */  
	public static Object convertXmlFileToObject(Class clazz, String xmlPath) {  
		Object xmlObject = null;  
		try {  
			JAXBContext context = JAXBContext.newInstance(clazz);  
			Unmarshaller unmarshaller = context.createUnmarshaller();  
			FileReader fr = null;  
			try {  
				fr = new FileReader(xmlPath);  
			} catch (FileNotFoundException e) {  
				e.printStackTrace();  
			}  
			xmlObject = unmarshaller.unmarshal(fr);  
		} catch (JAXBException e) {  
			e.printStackTrace();  
		}  
		return xmlObject;  
	} 
}

  工具类:

package com.pers;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class XMLUtil {  
	/** 
	 * 将对象直接转换成String类型的 XML输出 
	 *  
	 * @param obj 
	 * @return 
	 */  
	public static String convertToXml(Object obj) {  
		// 创建输出流  
		StringWriter sw = new StringWriter();  
		try {  
			// 利用jdk中自带的转换类实现  
			JAXBContext context = JAXBContext.newInstance(obj.getClass());  

			Marshaller marshaller = context.createMarshaller();  
			// 格式化xml输出的格式  
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,  
					Boolean.TRUE);  
			// 将对象转换成输出流形式的xml  
			marshaller.marshal(obj, sw);  
		} catch (JAXBException e) {  
			e.printStackTrace();  
		}  
		return sw.toString();  
	}  

	/** 
	 * 将对象根据路径转换成xml文件 
	 *  
	 * @param obj 
	 * @param path 
	 * @return 
	 */  
	public static void convertToXml(Object obj, String path) {  
		try {  
			// 利用jdk中自带的转换类实现  
			JAXBContext context = JAXBContext.newInstance(obj.getClass());  

			Marshaller marshaller = context.createMarshaller();  
			// 格式化xml输出的格式  
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,  
					Boolean.TRUE);  
			// 将对象转换成输出流形式的xml  
			// 创建输出流  
			FileWriter fw = null;  
			try {  
				fw = new FileWriter(path);  
			} catch (IOException e) {  
				e.printStackTrace();  
			}  
			marshaller.marshal(obj, fw);  
		} catch (JAXBException e) {  
			e.printStackTrace();  
		}  
	}  

	@SuppressWarnings("unchecked")  
	/** 
	 * 将String类型的xml转换成对象 
	 */  
	public static Object convertXmlStrToObject(Class clazz, String xmlStr) {  
		Object xmlObject = null;  
		try {  
			JAXBContext context = JAXBContext.newInstance(clazz);  
			// 进行将Xml转成对象的核心接口  
			Unmarshaller unmarshaller = context.createUnmarshaller();  
			StringReader sr = new StringReader(xmlStr);  
			xmlObject = unmarshaller.unmarshal(sr);  
		} catch (JAXBException e) {  
			e.printStackTrace();  
		}  
		return xmlObject;  
	}  

	@SuppressWarnings("unchecked")  
	/** 
	 * 将file类型的xml转换成对象 
	 */  
	public static Object convertXmlFileToObject(Class clazz, String xmlPath) {  
		Object xmlObject = null;  
		try {  
			JAXBContext context = JAXBContext.newInstance(clazz);  
			Unmarshaller unmarshaller = context.createUnmarshaller();  
			FileReader fr = null;  
			try {  
				fr = new FileReader(xmlPath);  
			} catch (FileNotFoundException e) {  
				e.printStackTrace();  
			}  
			xmlObject = unmarshaller.unmarshal(fr);  
		} catch (JAXBException e) {  
			e.printStackTrace();  
		}  
		return xmlObject;  
	}  
}  

  

JDK中JAXB相关的重要Class和Interface:(来源于百度百科JAXB)

  • JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
  • Marshaller接口,将Java对象序列化为XML数据。
  • Unmarshaller接口,将XML数据反序列化为Java对象。

 

   JDK中JAXB相关的重要Annotation:(来源于百度百科JAXB)

  • @XmlType,将Java类或枚举类型映射到XML模式类型
  • @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
  • @XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
  • @XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
  • @XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
  • @XmlRootElement,将Java类或枚举类型映射到XML元素。
  • @XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
  • @XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
    在以上的注解中,用的最多的是@XMLType,@XmlAccessorType,@XmlRootElement。
 
出现错误及其解决办法:
对xml字段进行隐藏:
 

问题:当@XmlType(propOrder = { "name", "age", "tel"})和@XmlTransient同时存在的时候,就会报异常

解决办法:让冲突的两个注解不同时存在。

posted on 2017-05-18 16:24  北城故事  阅读(313)  评论(0编辑  收藏  举报