Jackson实现xml转换

主要依赖

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.0</version>
</dependency>

xml文件demo:

<?xml version="1.0" encoding="GB2312" ?>
<PROGRAM>
	<FILE name="ZQVideo Program List File" version="PGM1.0" create="2021-12-08 13:12:41" MasterSlaverSame="FALSE" PlaylistSrc="Master" MasterSlaverLog="主备节目单信息一致" IsOnline="TRUE" />
	<INFO>
		<SECTION PsId="100001" ChannelID="CH01" Date="2021-12-08" UserID="" SecGuid="402881995b93f4b4015b944fb4bb000a" SecName="XXX档" />
	</INFO>
	<PGM>
		<ITEM>
			<MAIN date="2021-12-08" time="10:47:10:00" dur="00:00:15:00" id="FC1614CA-02E4-441C-97B7-DD508C924010" name="卫视片头19" />
			<VIDEOSRC id="DEC" type="LVSRC_DEC" name="主"/>
			<SWITCH mode="TAKE" rate="SLOW"/>
			<AUX logo="TRUE" title="FALSE"/>
			<CLIP>
				<ITEM id="9CRD0094" name="卫视片头19" />
			</CLIP>
			<CGLIST/>
		</ITEM>
		<ITEM>
			<MAIN date="2021-12-08" dur="00:28:00:00" id="B6272B45-449B-480A-B837-E7CCA252BB86" name="卫视第16集" />
			<VIDEOSRC id="DEC" type="LVSRC_DEC" name="主"/>
			<SWITCH mode="TAKE" rate="SLOW"/>
			<AUX logo="TRUE" title="FALSE"/>
			<CLIP>
				<ITEM id="9BLY0130" name="卫视第16集" />
			</CLIP>
			<CGLIST/>
		</ITEM>
		<ITEM>
			<MAIN date="2021-12-08" dur="00:00:30:00" id="FC35F00E-E301-4938-9841-897615B87FF4" name="30秒预告" />
			<VIDEOSRC id="DEC" type="LVSRC_DEC" name="主"/>
			<SWITCH mode="TAKE" rate="SLOW"/>
			<AUX logo="TRUE" title="FALSE"/>
			<CLIP>
				<ITEM id="1C7Y0074" name="30秒预告" />
			</CLIP>
			<CGLIST/>
		</ITEM>
		<ITEM>
			<MAIN date="2021-12-08" dur="00:00:15:00" id="1D807914-CB4D-4E62-8121-9175BE80E7C4" name="卫视片头19" />
			<VIDEOSRC id="DEC" type="LVSRC_DEC" name="主"/>
			<SWITCH mode="TAKE" rate="SLOW"/>
			<AUX logo="TRUE" title="FALSE"/>
			<CLIP>
				<ITEM id="9CRD0094" name="卫视片头19" />
			</CLIP>
			<CGLIST/>
		</ITEM>
	</PGM>
	<EXTRAINFO Token="" User="" LastModifyTime=""/>
</PROGRAM>

根据xml文件定义POJO:
LocalXMLDto:
这里需要注意PGM标签下ITEM的定义

@Data
@JacksonXmlRootElement(localName = "PROGRAM")
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE,isGetterVisibility = JsonAutoDetect.Visibility.NONE)
public class LocalXMLDto {

    @JacksonXmlProperty(localName = "FILE")
    private XFile file;

    @JacksonXmlProperty(localName = "INFO")
    private XInfo info;

    @JacksonXmlElementWrapper(localName = "PGM")
    @JacksonXmlProperty(localName = "ITEM")
    private List<XItem> items;
}

XFile:
标签FILE没有子标签,不过都是attribute,只需要将注解@JacksonXmlProperty的isAttribute属性设置为true即可


import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;

@Data
@JacksonXmlRootElement(localName = "FILE")
public class XFile {

    @JacksonXmlProperty(localName = "name", isAttribute = true)
    private String name;

    @JacksonXmlProperty(localName = "version", isAttribute = true)
    private String version;

    @JacksonXmlProperty(localName = "create", isAttribute = true)
    private String create;

    @JacksonXmlProperty(localName = "MasterSlaverSame", isAttribute = true)
    private String masterSlaverSame;

    @JacksonXmlProperty(localName = "PlaylistSrc", isAttribute = true)
    private String playlistSrc;

    @JacksonXmlProperty(localName = "MasterSlaverLog", isAttribute = true)
    private String masterSlaverLog;

    @JacksonXmlProperty(localName = "IsOnline", isAttribute = true)
    private String isOnline;
}

XItem:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;

import java.util.List;

@Data
@JacksonXmlRootElement(localName = "ITEM")
public class XItem {

    @JacksonXmlProperty(localName = "MAIN")
    private XMain main;

    @Data
    @JacksonXmlRootElement(localName = "MAIN")
    public static class XMain{
        @JacksonXmlProperty(localName = "date", isAttribute = true)
        private String date;

        @JacksonXmlProperty(localName = "time", isAttribute = true)
        private String time;
        
        @JacksonXmlProperty(localName = "dur", isAttribute = true)
        private String dur;

        @JacksonXmlProperty(localName = "id", isAttribute = true)
        private String id;
    }

    @JacksonXmlProperty(localName = "VIDEOSRC")
    private XVideoSrc videoSrc;

    @Data
    @JacksonXmlRootElement(localName = "VIDEOSRC")
    public static class XVideoSrc{
        @JacksonXmlProperty(localName = "id", isAttribute = true)
        private String id;

        @JacksonXmlProperty(localName = "type", isAttribute = true)
        private String type;

        @JacksonXmlProperty(localName = "name", isAttribute = true)
        private String name;
    }

    @JacksonXmlProperty(localName = "SWITCH")
    private XSwitch xSwitch;

    @Data
    @JacksonXmlRootElement(localName = "SWITCH")
    public static class XSwitch{
        @JacksonXmlProperty(localName = "mode", isAttribute = true)
        private String mode;

        @JacksonXmlProperty(localName = "rate", isAttribute = true)
        private String rate;
    }

    @JacksonXmlProperty(localName = "AUX")
    private XAux aux;

    @Data
    @JacksonXmlRootElement(localName = "AUX")
    public static class XAux{
        @JacksonXmlProperty(localName = "logo", isAttribute = true)
        private String logo;

        @JacksonXmlProperty(localName = "title", isAttribute = true)
        private String title;
    }

    @JacksonXmlElementWrapper(localName = "CLIP")
    @JacksonXmlProperty(localName = "ITEM")
    private List<XSubItem> clipSubItems;


    @Data
    @JacksonXmlRootElement(localName = "ITEM")
    public static class XSubItem{

        @JacksonXmlProperty(localName = "id", isAttribute = true)
        private String id;

        @JacksonXmlProperty(localName = "name", isAttribute = true)
        private String name;
    }

}

xmlmapper工具:

/**
 * XmlMapper工具
 * 使用单例模式(静态内部类的方式)
 */
public class XMLMapperUtil extends XmlMapper{

    private XMLMapperUtil(){
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        this.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
        //带有xml文件头,<?xml version="1.0" encoding="utf-8" ?>
        this.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
    }

    /**
     * 获取XmlMapper工具
     * 执行此方法时,静态内部类XMLMapperUtilsInstance才会装载
     * @return XMLMapperUtils
     */
    public static XMLMapperUtil getInstance(){
        return XMLMapperUtilsInstance.INSTANCE;
    }

    private static class XMLMapperUtilsInstance{
        private static final XMLMapperUtil INSTANCE = new XMLMapperUtil();
    }

    /**
     * 获取转换工具
    public static XmlMapper getMapper(){
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        xmlMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
        //带有xml文件头,<?xml version="1.0" encoding="utf-8" ?>
        xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
        return xmlMapper;
    }
    */
}

xml文件转换工具类:
不使用XMLMapperUtil 类时,XMLMapperUtil.getInstance()可替换为XMLMapperUtil 中注释掉的方法,这都不是重点,只要构造出XmlMapper即可

@Slf4j
public class XMLConvertUtils {

    /**
     * xml转pojo
     * @param filePath xml文件地址
     * @param t pojo类型
     * @param <T> pojo
     * @return t类型的pojo
     */
    public static <T> T xmlToPojo(String filePath, Class<T> t) {
        try(InputStream is = new FileInputStream(new File(filePath))) {
            return XMLMapperUtil.getInstance().readValue(is, t);
        }catch (Exception e){
            log.error("xml转pojo失败!xml文件路径={},pojo类型={}", filePath, t.getName());
            e.printStackTrace();
        }
        throw new BusinessException(500, "xml转pojo失败!");
    }


    /**
     * pojo转为xml文件
     * @param t pojo
     * @param filePath xml文件存储地址
     * @param <T> pojo类型
     */
    public static <T> boolean pojoToXmlFile(T t, String filePath) {
        File file = new File(filePath);
        try(FileOutputStream fileOutputStream = new FileOutputStream(file)) {
            XMLMapperUtil.getInstance().writeValue(fileOutputStream, t);
            return true;
        }catch (Exception e){
            log.error("pojo转为xml文件失败!pojo类型={}, 目标xml地址={}", t.getClass(), filePath);
            e.printStackTrace();
        }
        return false;
    }

    /**
     * pojo转为xml字符串
     * @param t pojo
     * @param <T> pojo类型
     * @return String
     */
    public static <T> String pojoToXmlStr(T t) throws JsonProcessingException {
        try {
            return XMLMapperUtil.getInstance()
            .writerWithDefaultPrettyPrinter().writeValueAsString(t);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        //xml pojo互转测试
        String path = "E:\\demo.xml";
        LocalXMLDto dto = XMLConvertUtils.xmlToPojo(path, LocalXMLDto.class);
        System.out.println("-----XML TO POJO------");
        System.out.println(dto);
        System.out.println("-----POJO TO XML FILE------");
        XMLConvertUtils.pojoToXmlFile(dto, "E:\\convert-demo.xml");
        System.out.println("-----POJO TO XML FILE------");
        String xmlStr = XMLConvertUtils.pojoToXmlStr(dto);
        System.out.println(xmlStr);
    }
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值