Java对象转xml(Object to Xml)

目录

友情提醒:

先看目录,了解文章结构,点击目录可跳转到文章指定位置。

第一章、Java对象转xml

1.1)Java实体类

这是需要转xml的实体类

java 复制代码
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName(value="productionissue")
public class ProductionIssue {

    @TableId(value = "id", type = IdType.AUTO)
    private Integer  id;

    @TableField("userid")
    private String userId;

    @TableField("title")
    private String title;

    @TableField("content")
    private String content;

    @TableField("orderNumber")
    private String orderNumber;

    @TableField("file")
    private byte[] file;

    @TableField("date")
    private String date;

    @TableField("sta")
    private String sta;
}

1.2)Xml中需要包含的字段

因为有些XML字段不在数据库对应的实体类中,所以需要额外建一个XML字段对应的实体类

java 复制代码
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

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
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class NewInc {

    @XmlElement(name = "WSUSER")
    private String wsUser;

    @XmlElement(name = "WSPASSWORD")
    private String wsPassword;


    @XmlElement(name = "CREATOR")
    private String userId;

    @XmlElement(name = "CREATORCONTACT")
    private String creatorContact;

    @XmlElement(name = "SOURCE")
    private String source;

    @XmlElement(name = "SUMMARY")
    private String title;

    @XmlElement(name = "DESCRIPTION")
    private String content;

    @XmlElement(name = "PRIORITY")
    private String priority;

    @XmlElement(name = "URGENCY")
    private String urgency;

    @XmlElement(name = "REFLECTCANAL")
    private String reflectCanal;

    @XmlElement(name = "HAPPENTIME")
    private String date;

    @XmlElement(name = "ISEFFECTBUSINESS")
    private String isEffectBusiness;

    @XmlElement(name = "ISEFFECTBUSINESS")
    private String effectSituation;

    @XmlElement(name = "ISACCOUNT")
    private String isAccount;

    @XmlElement(name = "ISREGULATOR")
    private String isRegulator;

    @XmlElement(name = "ISBIGCUSTOMER")
    private String isBigCustomer;


}

1.3)设置根标签和属性序列化方式

@XmlRootElement和@XmlAccessorType是JAXB中用于控制Java对象与XML之间映射关系的注解。@XmlRootElement用于指定生成的XML的根标签名,而@XmlAccessorType用于指定属性的序列化方式。

java 复制代码
import lombok.Data;
import javax.xml.bind.annotation.*;
import java.util.List;


@Data
@XmlRootElement(name="HAPPY")   //根标签名
@XmlAccessorType(XmlAccessType.FIELD)  //属性序列化
public class NewIncXml {

    @XmlElement(name = "IN")
    private List<NewInc> newIncs;

    public List<NewInc> getNewIncs() {
        return newIncs;
    }

    public void setNewIncs(List<NewInc> newIncs) {
        this.newIncs = newIncs;
    }
}

1.4)使用JAXBContext和Marshaller进行转换

将从数据库中获取的NewInc对象转换为XML格式,并输出每个NewInc对象的XML表示。方便地将Java对象转换为XML数据进行处理或传输。

具体逻辑:

遍历List中的每个NewInc对象:

创建一个新的List对象newIncsOne,并将当前NewInc对象添加到这个List中。

创建一个NewIncXml对象xml,并设置其List newIncs属性为newIncsOne。

创建一个StringWriter对象writer用于将XML数据写入。

使用JAXBContext和Marshaller将NewIncXml对象转换为XML格式,并将结果写入到StringWriter中。

打印输出转换后的XML数据

java 复制代码
package com.icbc.coresd.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.icbc.coresd.entity.NewInc;
import com.icbc.coresd.entity.NewIncXml;
import com.icbc.coresd.entity.ProductionIssue;
import com.icbc.coresd.mapper.ProductionIssueMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;

@Service
public class ProductionIssueServiceImpl {

    @Autowired
    ProductionIssueMapper productionIssueMapper;

    /*
    查询数据库productionissue表数据,设置到NewInc
     */
    public List<NewInc> selectAll() {
       LambdaQueryWrapper<ProductionIssue> queryWrapper = new LambdaQueryWrapper<>();
       queryWrapper.eq(ProductionIssue::getSta,0 ).select(ProductionIssue::getTitle,ProductionIssue::getDate,ProductionIssue::getContent);

        List<ProductionIssue> productionIssuesList = productionIssueMapper.selectList(queryWrapper);

        List<NewInc> newIncList = new ArrayList<>();
        for (ProductionIssue pi : productionIssuesList) {
            NewInc newInc = new NewInc();
            // 将User的属性映射到Product的属性
            newInc.setUserId(pi.getUserId());
            newInc.setTitle(pi.getTitle());
            newInc.setContent(pi.getContent());
            newInc.setDate(pi.getDate());
            newInc.setWsUser("name");
            newInc.setWsPassword("pass123");
            newInc.setCreatorContact("user@mail");
            newInc.setSource("固定");
            newInc.setPriority("6");
            newInc.setUrgency("02");
            newInc.setReflectCanal("14");
            newInc.setIsEffectBusiness("是");
            newInc.setEffectSituation("file");
            newInc.setIsAccount("否");
            newInc.setIsRegulator("否");
            newInc.setIsBigCustomer("否");

            newIncList.add(newInc);
        }
        return newIncList;
    }


    public void build() {
        List<NewInc> newIncsList = selectAll();

        System.out.println(newIncsList.size());

        for (int i = 0; i < newIncsList.size(); i++) {
            NewInc newInc = newIncsList.get(i);
            // 对取出的数据进行操作
            List<NewInc> newIncsOne = new ArrayList<>();
            newIncsOne.add(newInc);
            NewIncXml xml = new NewIncXml();

            xml.setNewIncs(newIncsOne);

            StringWriter writer = null;
            try {
                JAXBContext context = JAXBContext.newInstance(NewIncXml.class);
                Marshaller marshaller = context.createMarshaller();
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

                writer = new StringWriter();
                writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
                marshaller.marshal(xml, writer);
            } catch (JAXBException e) {
                e.printStackTrace();
            }

            System.out.println(writer.toString());
        }

    }
}
相关推荐
无限大.6 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw7 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上8 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志11 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
不修×蝙蝠13 分钟前
八大排序--01冒泡排序
java
sky丶Mamba28 分钟前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
数据龙傲天1 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
带带老表学爬虫1 小时前
java数据类型转换和注释
java·开发语言
千里码aicood1 小时前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
cyt涛2 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok