使用JAXB实现JavaBean与XML互相转换

JAXB 注解列表

|--------------------|------|-------------------------------------------------------------------------------------------------------------------------|
| 注解 | 使用范围 | 描述 |
| @XmlAccessorOrder | 包、类 | 控制类中字段和属性的顺序。 |
| @XmlAccessorType | 包、类 | 此注释提供对类中属性和字段的默认序列化的控制。 |
| @XmlRootElement | 类、枚举 | 将类或枚举类型映射到XML元素。此注释可与以下注释一起使用:XmlType、XmlEnum、XmlAccessorType、XmlAccessorOrder。 |
| @XmlElement | 字段 | 将JavaBean属性映射到从属性名称派生的XML元素 |
| @XmlElementWrapper | 字段 | 围绕XML表示生成包装器元素。这主要用于围绕集合生成包装XML元素。此注释可与以下注释一起使用:XmlElement、XmlElements、XmlElementRef、XmlElementRefs、XmlJavaTypeAdapter。 |
| @XmlAttribute | 字段 | 将JavaBean属性映射到XML属性。 |
| @XmlValue | 字段 | 将字段或属性映射到 XML 标记上的文本值。 |

JAXB 注解示例

xml文件根元素的定义

java 复制代码
import javax.xml.bind.annotation.*;
import java.io.Serializable;
import java.util.List;

@XmlRootElement(name = "Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root implements Serializable {

    private static final long serialVersionUID = 1L;
    @XmlAttribute(name = "id")
    private String id;

    @XmlElementWrapper(name = "records")
    @XmlElement(name = "record")
    private List<Record> record;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public List<Record> getRecord() {
        return record;
    }

    public void setRecord(List<Record> record) {
        this.record = record;
    }
}

子节点下的类定义

java 复制代码
import javax.xml.bind.annotation.XmlElement;
import java.io.Serializable;
import java.util.List;


public class Record implements Serializable {
    private static final long serialVersionUID = 1L;

    private List<Item> item;

    public List<Item> getItem() {
        return item;
    }
    @XmlElement(name = "item")
    public void setItem(List<Item> item) {
        this.item = item;
    }
}
java 复制代码
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;
import java.io.Serializable;


public class Item implements Serializable {
    private static final long serialVersionUID = 1L;

    private String id;

    private String dataType;

    private String perDataProId;

    private String value;

    public String getId() {
        return id;
    }
    @XmlAttribute(name = "id")
    public void setId(String id) {
        this.id = id;
    }

    public String getDataType() {
        return dataType;
    }
    @XmlAttribute(name = "dataType")
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    public String getPerDataProId() {
        return perDataProId;
    }
    @XmlAttribute(name = "perDataProId")
    public void setPerDataProId(String perDataProId) {
        this.perDataProId = perDataProId;
    }

    public String getValue() {
        return value;
    }
    @XmlValue
    public void setValue(String value) {
        this.value = value;
    }
}

xml数据结构格式

XML 复制代码
<Root id="Root">
	<records>
		<record id="">
		<item id="field1" dataType="java.lang.String" perDataProId="">1</item>
		<item id="field2" dataType="java.lang.String" perDataProId="">2</item>
		<item id="field3" dataType="java.lang.String" perDataProId="">3</item>
		<item id="field4" dataType="java.lang.String" perDataProId="">4</item>
		<item id="field6" dataType="java.lang.String" perDataProId="">6</item>
		<item id="field7" dataType="java.lang.String" perDataProId="">7</item>
		</record>
	</records>
</Root>

javaBean和xml转换工具类

java 复制代码
import cn.hutool.json.JSONUtil;
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;
import java.util.ArrayList;
import java.util.List;

public class BeanXmlUtils {
    /**
     * bean转xml
     * @param obj 需要转换的对象
     * @param load 对应的class
     * @param config isFormat:是否需要格式[默认:false],charSet:字符集[默认:utf-8],xmlHeader:是否需要xml头部[默认:false]
     **/
    public static String beanToXml(Object obj, Class<?> load,Object... config) {
        String xmlStr = null;
        try {
            boolean isFormat = false;
            String charSet = "utf-8";
            boolean xmlHeader = false;
            if (config.length>=1){
                isFormat = (Boolean) config[0];
                if (config.length>=2){
                    charSet =  (String)config[1];
                }
                if (config.length>=3){
                    xmlHeader = (Boolean)config[2];
                }
            }
            JAXBContext context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, xmlHeader);
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isFormat);
            marshaller.setProperty(Marshaller.JAXB_ENCODING,charSet);
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            xmlStr = writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlStr;
    }

    /**
     * xml转bean
     * @param str
     * @param load
     * @return T
     **/
    public  static <T>  T  xmlToBean(String str, Class<T> load) {
        Object object = null;
        try {
            JAXBContext context = JAXBContext.newInstance(load);
            Unmarshaller unmarshaller = context.createUnmarshaller();

            object = unmarshaller.unmarshal(new StringReader(str));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return  (T)object;
    }

    public static void main(String[] args) {
        //xmlToBean();
        beanToXml();
    }

    private static void xmlToBean() {
        String xmlStr = "<Root id=\"Root\">\n" +
                "<records>\n" +
                "\t<record id=\"\">\n" +
                "\t<item id=\"field1\" dataType=\"java.lang.String\" perDataProId=\"\">1</item>\n" +
                "\t<item id=\"field2\" dataType=\"java.lang.String\" perDataProId=\"\">2</item>\n" +
                "\t<item id=\"field3\" dataType=\"java.lang.String\" perDataProId=\"\">3</item>\n" +
                "\t<item id=\"field4\" dataType=\"java.lang.String\" perDataProId=\"\">4</item>\n" +
                "\t<item id=\"field5\" dataType=\"java.lang.String\" perDataProId=\"\">5</item>\n" +
                "\t<item id=\"field6\" dataType=\"java.lang.String\" perDataProId=\"\">6</item>\n" +
                "\t<item id=\"field7\" dataType=\"java.lang.String\" perDataProId=\"\">7</item>\n" +
                "\t</record>\n" +
                "</records>\n" +
                "</Root>";
        Root root = xmlToBean(xmlStr, Root.class);
        System.out.println(JSONUtil.toJsonPrettyStr(root));
    }

    private static void beanToXml() {
        Root root = new Root();
        root.setId("Root");
        List<Record> records = new ArrayList<>();
        List<Item> items = new ArrayList<>();
        Item item = new Item();
        item.setId("itemCode");
        item.setDataType("java.lang.String");
        item.setPerDataProId("");
        item.setValue("TZ0001");
        Item item1 = new Item();
        item1.setId("itemName");
        item1.setValue("吹风机");
        items.add(item);
        items.add(item1);
        Record record = new Record();
        record.setItem(items);
        records.add(record);
        root.setRecord(records);
        String xmlStr = beanToXml(root, Root.class, false);
        System.out.println(xmlStr);
    }

}
相关推荐
Stringzhua2 分钟前
【SpringCloud】Kafka消息中间件
spring·spring cloud·kafka
向阳12188 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
Gu Gu Study18 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
WaaTong41 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_7430484441 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries43 分钟前
Java字节码增强库ByteBuddy
java·后端
小灰灰__1 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭1 小时前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林2 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac