2、JAXB 实现java对象与xml之间互相转换

本文介绍如何使用JAXB实现在Java对象与XML之间的相互转换,包括关键注解的用法,如@XmlRootElement、@XmlAttribute等,以及如何在Maven项目中引入依赖。同时,提供了详细的代码示例,展示如何定义实体类和利用JaxbUtil工具类进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 JAXB实现对象与xml互转时常用的一些注解:

  1. @XmlRootElement,用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称。

  2. @XmlAccessorType,定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解)

    参数:XmlAccessType.FIELD: java对象中的所有成员变量。

    XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量。

    XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。

    XmlAccessType.NONE: java对象的所有属性都不映射为xml的元素。

  3. @XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。

  4. @XmlElement,指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称。

  5. @XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。

2 maven引入 jaxb-api.x.x 的依赖

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

3 例子如下

3.1 user和company实体类

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="user")
public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String password;
	
	@XmlAttribute(name="id")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@XmlElement(name="username")
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	@XmlElement(name="password")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}

}
// ----------------------分割线------------------------------
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="company")
public class Company implements Serializable{
	private static final long serialVersionUID = 1L;
	private List<User> uList = new ArrayList<>();
	private int cid;
	private String companyName;
	
	@XmlAttribute(name="cid")
	public int getCid() {
		return cid;
	}
	public void setCid(int cid) {
		this.cid = cid;
	}
	@XmlElement(name="companyName")
	public String getCompanyName() {
		return companyName;
	}
	public void setCompanyName(String companyName) {
		this.companyName = companyName;
	}
	@XmlElementWrapper(name="uList")
	@XmlElement(name="user")
	public List<User> getuList() {
		return uList;
	}
	public void setuList(List<User> uList) {
		this.uList = uList;
	}
	@Override
	public String toString() {
		return "Company [uList=" + uList + ", cid=" + cid + ", companyName=" + companyName + "]";
	}
}

3.2 jaxbutil 工具类

import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;

import com.sun.xml.internal.ws.util.StringUtils;

public class JaxbUtil {  
    // 多线程安全的Context.  
    private JAXBContext jaxbContext;  
    
    
    /** 
     * @param types 所有需要序列化的Root对象的类型. 
     */  
    public JaxbUtil(Class<?>... types) {  
        try {  
            jaxbContext = JAXBContext.newInstance(types);  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
    
    /**
     * xml文件配置转换为对象
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    java对象
     * @throws JAXBException    
     * @throws IOException
     */
    public Object xmlToBean(String xmlPath,Class<?> clazz) throws JAXBException, IOException{
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
        Object object = unmarshaller.unmarshal(new File(xmlPath));
        return object;
    }
  
    
  
    /** 
     * Java Object->Xml. 
     */  
    public String toXml(Object root, String encoding) {  
        try {  
            StringWriter writer = new StringWriter();  
            createMarshaller(encoding).marshal(root, writer);  
            return writer.toString();  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    /** 
     * Java Object->Xml, 特别支持对Root Element是Collection的情形. 
     */  
    public String toXml(Collection root, String rootName, String encoding) {  
        try {  
            CollectionWrapper wrapper = new CollectionWrapper();  
            wrapper.collection = root;  
  
            JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(  
                    new QName(rootName), CollectionWrapper.class, wrapper);  
  
            StringWriter writer = new StringWriter();  
            createMarshaller(encoding).marshal(wrapperElement, writer);  
  
            return writer.toString();  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    /** 
     * Xml->Java Object. 
     */  
    @SuppressWarnings("unchecked")  
    public <T> T fromXml(String xml) {  
        try {  
            StringReader reader = new StringReader(xml);  
            return (T) createUnmarshaller().unmarshal(reader);  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    /** 
     * Xml->Java Object, 支持大小写敏感或不敏感. 
     */  
    @SuppressWarnings("unchecked")  
    public <T> T fromXml(String xml, boolean caseSensitive) {  
        try {  
            String fromXml = xml;  
            if (!caseSensitive)  
                fromXml = xml.toLowerCase();  
            StringReader reader = new StringReader(fromXml);  
            return (T) createUnmarshaller().unmarshal(reader);  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    /** 
     * 创建Marshaller, 设定encoding(可为Null). 
     */  
    public Marshaller createMarshaller(String encoding) {  
        try {  
            Marshaller marshaller = jaxbContext.createMarshaller();  
  
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);  
  
            if(null != encoding && !"".equals(encoding)){
//            if (StringUtils.(encoding)) {  
                marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);  
            }  
            return marshaller;  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    /** 
     * 创建UnMarshaller. 
     */  
    public Unmarshaller createUnmarshaller() {  
        try {  
            return jaxbContext.createUnmarshaller();  
        } catch (JAXBException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    /** 
     * 封装Root Element 是 Collection的情况. 
     */  
    public static class CollectionWrapper {  
        @XmlAnyElement  
        protected Collection collection;  
    }  
}

测试

public class UserTest {

	
	public static void main(String[] args) throws JAXBException, IOException {
		
	    
	    List<User> userList = new ArrayList<>();
	    for (int i=0;i<5;i++) {
	        User user = new User();
	        user.setId(1);
	        user.setUsername("卡子锅锅"+1);
	        user.setPassword("123"+1);
	        userList.add(user);
	    }
		
		Company cm = new Company();
		cm.setCid(1);
		cm.setCompanyName("还是威");
		cm.setuList(userList);
		
		//将java对象转换为XML字符串  
        JaxbUtil requestBinder = new JaxbUtil(Company.class,  
                CollectionWrapper.class);
		
		
        String retXml = requestBinder.toXml(cm, "utf-8");  
        System.out.println("xml:"+retXml);  
        
        //写入到xml文件中
        String xmlPath = "C:\\Users\\liping\\Desktop\\na\\userlist2.xml";
        BufferedWriter bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
        bfw.write(retXml);
        bfw.close();
        
        
        
        
        System.out.println("+++++++++++++++++++++++++++++");  
        //将xml字符串转换为java对象  
        JaxbUtil resultBinder = new JaxbUtil(Company.class,  
                CollectionWrapper.class);  
        Company hotelObj = resultBinder.fromXml(retXml);
        System.out.println("hotelObj:"+hotelObj);  
        
        Object object = resultBinder.xmlToBean("C:\\Users\\liping\\Desktop\\na\\userlist.xml",Company.class);
        Company company = (Company)object;
        List<User> studentList = company.getuList();

        System.out.println("-------company>:"+company);
        System.out.println("-------studentList>:"+studentList);
        
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值