主要依赖
<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);
}
}