使用JAXB实现xml2javaBean、javaBean2xml

xml2javaBean

1.基础demo

使用@XmlRootElement:将类映射为xml全局元素,也就是根元素。
使用@XmlElement: 注解对应的字段映射成本类对应XML的元素,子元素。

1.javaBean

package com.JAXB;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

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


@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person  {

    @XmlElement(name="id")
    private String id;
    @XmlElement(name="name")
    private String name;
    @XmlElement(name="gender")
    private String gender;
    @XmlElement(name="addr")
    private String addr;
    
}

2.Test

public class DemoTest {

    public static <T> void generateXML(File file, Class<T> beanClazz,Object o) {
        try {
            //根据Person类生成上下文对象
            JAXBContext jc = JAXBContext.newInstance(beanClazz);
            //从上下文中获取Marshaller对象,用作将bean编组(转换)为xml
            Marshaller ma = jc.createMarshaller();
            //以下是为生成xml做的一些配置
            //格式化输出,即按标签自动换行,否则就是一行输出
            ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            //设置编码(默认编码就是utf-8)
            ma.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            //是否省略xml头信息,默认不省略(false)
            ma.setProperty(Marshaller.JAXB_FRAGMENT, false);
            //编组
            ma.marshal(o, file);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Person person = new Person("abc", "男", "北京", "朝阳区");
        File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
        generateXML(file,Person.class,person);
    }
}

测试结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person>
    <id>abc</id>
    <name></name>
    <gender>北京</gender>
    <addr>朝阳区</addr>
</Person>

2.带属性xml转换

使用@XmlAttribute:注解对应的字段映射成本类对应XML元素的属性。

1.javaBean

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person  {

    @XmlAttribute(name="id")
    private String id;
    @XmlElement(name="name")
    private String name;
    @XmlElement(name="gender")
    private String gender;
    @XmlElement(name="addr")
    private String addr;

}

测试结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
    <name></name>
    <gender>北京</gender>
    <addr>朝阳区</addr>
</Person>

3.循环标签/元素

1.javaBean

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person  {

    @XmlAttribute(name="id")
    private String id;
    @XmlElement(name="name")
    private String name;
    @XmlElement(name="gender")
    private String gender;
    @XmlElement(name="addrs")
    private List<Addr> addrs;

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="addr")
public class Addr {
     @XmlElement(name="province")
     private String province;
     @XmlElement(name="city")
     private String city;
     @XmlElement(name="area")
     private String area;
}

2.Test

    public static void main(String[] args) {
        final Addr addr = new Addr("北京市","通州区","永顺镇");
        List<Addr> adds = new ArrayList<>();
        adds.add(addr);
        Person person = new Person("abc", "男", "北京", adds);
        File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
        generateXML(file,Person.class,person);
    }
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
    <name></name>
    <gender>北京</gender>
    <addrs>
        <province>北京市</province>
        <city>通州区</city>
        <area>永顺镇</area>
    </addrs>
</Person>

4.元素文本

@XmlValue: 定义xml元素文本值的类型
如果类具有 @XmlElement 属性, 则不能具有 @XmlValue 属性。

1.javaBean

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "addr")
public class Addr {
    @XmlAttribute(name = "province")
    private String province;
    @XmlAttribute(name = "city")
    private String city;
    @XmlAttribute(name = "area")
    private String area;
    @XmlValue
    private String value;
}

2.Test

    public static void main(String[] args) {
        final Addr addr = new Addr("北京市","通州区","永顺镇","源盛东街66号");
        List<Addr> adds = new ArrayList<>();
        adds.add(addr);
        Person person = new Person("abc", "男", "北京", adds);
        File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
        generateXML(file,Person.class,person);
    }

测试结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
    <name></name>
    <gender>北京</gender>
    <addrs province="北京市" city="通州区" area="永顺镇">源盛东街66号</addrs>
</Person>

javaBean2xml

1.包含上面所有场景

1.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Person id="abc">
    <name></name>
    <gender>北京</gender>
    <addrs province="北京市" city="通州区" area="永顺镇">源盛东街66号</addrs>
</Person>

2.javaBean

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="Person")
public class Person  {

    @XmlAttribute(name="id")
    private String id;
    @XmlElement(name="name")
    private String name;
    @XmlElement(name="gender")
    private String gender;
    @XmlElement(name="addrs")
    private List<Addr> addrs;

}

@Data
@AllArgsConstructor
@NoArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "addr")
public class Addr {
    @XmlAttribute(name = "province")
    private String province;
    @XmlAttribute(name = "city")
    private String city;
    @XmlAttribute(name = "area")
    private String area;
    @XmlValue
    private String value;
}

3.Test

public class DemoTest {

    public static <T> T generateBean(File file, Class<T> beanClazz) {
        T t = null;
        try {
            JAXBContext jc = JAXBContext.newInstance(beanClazz);
            Unmarshaller uma = jc.createUnmarshaller();
             t = (T) uma.unmarshal(file);
            System.out.println(t);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return t;
    }
    
    public static <T> T generateBean(String xml, Class<T> beanClazz) {
        T t = null;
        try {
            JAXBContext context = JAXBContext.newInstance(beanClazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            t = (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (Exception e) {
            System.out.println(e);
        }
        return t;
    }

    public static void main(String[] args) {
        File file = new File("D:\\Users\\work\\Desktop\\demo\\person.xml");
        Person person = generateBean(file, Person.class);
        System.out.println("person:");
        System.out.println(person);
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                "<Person id=\"abc\"><name>男</name><gender>北京</gender><addrs province=\"北京市\" city=\"通州区\" area=\"永顺镇\">源盛东街66号</addrs></Person>\n";
        Person person2 = getMarkBean(xml, Person.class);
        System.out.println("person2:");
        System.out.println(person2);
    }
}

测试结果:

person:
Person(id=abc, name=男, gender=北京, addrs=[Addr(province=北京市, city=通州区, area=永顺镇, value=源盛东街66号)])
person2:
Person(id=abc, name=男, gender=北京, addrs=[Addr(province=北京市, city=通州区, area=永顺镇, value=源盛东街66号)])

JAXB常用注解

JAXB常用注解讲解(超详细)


版权声明:本文为QQ657205470原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。