美文网首页
将javaBean转换成XML

将javaBean转换成XML

作者: Seven鑫洋 | 来源:发表于2018-08-28 15:55 被阅读54次

依赖

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.11</version>
</dependency>
</dependency>

注解说明

  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的元素。

  1. @XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。
  2. @XmlElement,指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称。
  3. @XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。

XML格式

<country>
   <province></province>
</country>

Java类

@XmlRootElement
public class Country
   private String province;
   
   public String getProvince(){
       return province; 
   }
   public void setProvince(String province){
       this.province = province;
   }
}

测试类

public  static void main(String[ ] args){

      Country country = new Country();
      country.setProvince("zhejiang");
      
      JAXBContext context = JAXBContext.newInstance(Country.class);
      Marshaller marshaller = context.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
      StringWriter writer = new StringWriter();
      marshaller.marshal(country, writer);
      System.out.println(writer.toString());
}

结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <country>
     <province>zhejiang</province>
  </coutry>
</xml>

格式1

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <country>
     <province>zhejiang</province>
     <province>jiangsu</province>
  </coutry>
</xml>

修改1

@XmlRootElement
public class Country
{
    private List<String> province;

    public String getProvince(){
       return province; 
    }
    public void setProvince(List<String> province){
      this.province = province;
    }
    public static class Province{
       
    }
}

测试1

public  static void main(String[ ] args){

      Country country = new Country();
      List<String> province = new ArrayList<String>();
      province.add("zhejiang");
      province.add("jiangsu");
      JAXBContext context = JAXBContext.newInstance(Country.class);
      Marshaller marshaller = context.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
      StringWriter writer = new StringWriter();
      marshaller.marshal(country, writer);
      System.out.println(writer.toString());
}

格式2

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <country>
     <provinceList>
        <province>zhejiang</province>
        <province>jiangsu</province>
     </proviceList>
  </coutry>
</xml>

修改2

@XmlRootElement
public class Country
{
   @XmlElementWrapper
    private List<String> province;

    public String getProvince(){
       return province; 
    }
    public void setProvince(List<String> province){
      this.province = province;
    }
    public static class Province{
       
    }
}

格式3

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <country>
     <provinceList>
        <province-name>zhejiang</province-name>
        <province-name>jiangsu</province-name>
     </proviceList>
  </coutry>
</xml>

修改3

@XmlRootElement
public class Country
{
   @XmlElementWrapper
    private List<String> province;

    @XmlElement(name="province-name")
    public String getProvince(){
       return province; 
    }
    public void setProvince(List<String> province){
      this.province = province;
    }
    public static class Province{
       
    }
}

++在getProvince上面加了一个@XmlElement注解,搞定!++

@XmlElementWrapper和@XmlElement这两个注解的概念

@XmlElementWrapper注解表示生成一个包装器元素,仅允许出现在集合属性上。

@XmlElement注解指定一个字段或get/set方法映射到XML的节点,并且可以通过name属性改变java对象属性在XML节点中的名字。

package com.noah.project.util;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * @date: 2018/04/13
 * @author: wangcd
 * @version: 1.0.0
 * @description:Jaxb2工具类.
 **/
public class JaxbUtil {

    /**
     * 以UTF-8编码的格式将JavaBean转成XML
     * @param o
     * @return
     */
    public static String convertToXml(Object o){
        return convertToXml(o,"UTF-8");
    }

    /**
     * 将JavaBean转成XML
     * @param obj       JavaBean对象
     * @param encoding  xml编码格式,例,"UTF-8"
     * @return
     */
    public static String convertToXml(Object obj,String encoding){
        String result = "";
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            result = writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 将XML转成JavaBean
     * @param xml       xml字符串
     * @param cls       JavaBean的class名称 例,Object.class
     * @param <T>
     * @return          返回转换后的JavaBean
     */
    public static <T> T convertToJavaBean(String xml,Class<T> cls){
        T t = null;
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(cls);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            t = (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return t;
    }
}

相关文章

网友评论

      本文标题:将javaBean转换成XML

      本文链接:https://www.haomeiwen.com/subject/bdhqwftx.html