使用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);
    }

}
相关推荐
皮皮林5515 小时前
使用 Java + WebSocket 实现简单实时双人协同 pk 答题
java·websocket
码小凡6 小时前
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
java·后端
掉鱼的猫8 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·后端
java金融8 小时前
FactoryBean 和BeanFactory的傻傻的总是分不清?
java·后端
独立开阀者_FwtCoder9 小时前
Nginx 通过匹配 Cookie 将请求定向到特定服务器
java·vue.js·后端
名曰大神9 小时前
AEM6.5集成Redis详细步骤(附代码)
java·redis·demo·aem
带刺的坐椅9 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·ai·solon·rag
东阳马生架构9 小时前
商品中心—7.自研缓存框架的技术文档
java
晴空月明12 小时前
线程安全与锁机制深度解析
java
天天摸鱼的java工程师13 小时前
你如何处理一个高并发接口的线程安全问题?说说你做过的优化措施
java·后端