1.工具介绍
1:maven仓库搜索:jackson-dataformat-xml
仓库地址:https://mvnrepository.com/
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.16.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2:在pom.xml中引入后就可以
2.使用方式代码
1.处理单个实体类
1:创建实体类(处理单个实体类)
@Data
@NoArgsConstructor
@AllArgsConstructor
@JacksonXmlRootElement(localName = "root")//设置根节点名
public class Student implements Serializable {
@JacksonXmlProperty(localName = "WorkId")//设置xml字符串的字段别名
private String workId;
@JacksonXmlProperty(localName = "NAME")
private String name;
// @JacksonXmlProperty(localName = "age")
private String age; //不加就是属性名
@Override
public String toString() {
return "{" +
"workId='" + workId + '\'' +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
2:处理方法
public static void main(String[] args) {
//工具处理对象
XmlMapper mapper = new XmlMapper();
//添加<?xml version='1.0' encoding='UTF-8'?> 标签
mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
try {
Student student = new Student();
student.setWorkId("0001");
student.setName("小王");
student.setAge("29");
//将对象转化成字符串
String xmlStr = mapper.writeValueAsString(student);
log.info("转化的xml是:"+xmlStr);
//将字符串转化成对象
Student student1 = mapper.readValue(xmlStr, Student.class);
log.info("转化的对象数据:"+student1.toString());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
3:处理结果
转化的xml是:<?xml version='1.0' encoding='UTF-8'?><root><age>29</age><WorkId>0001</WorkId><NAME>小王</NAME></root>
转化的对象数据:{workId='0001', name='小王', age='29'}
2.处理泛型
1:处理类似这种
<?xml version='1.0' encoding='UTF-8'?>
<service>
<Head>
<TxCode>111111</TxCode>
<RetCode>0000</RetCode>
<RetMsg>交易成功</RetMsg>
<note/>
</Head>
<Body>
<sdoList>
<sdo>
<sdo1>111</sdo1>
<sdo2>111</sdo2>
<sdo3>111</sdo3>
</sdo>
<sdo>
<sdo1>111</sdo1>
<sdo2>111</sdo2>
<sdo3>111</sdo3>
</sdo>
</sdoList>
<Name>小王</Name>
<Address>北京一号垃圾桶17号床位</Address>
<Age>25</Age>
<Sex>男</Sex>
</Body>
</service>
2:对应实体类
/**
* 请求头
*/
@Data
@ToString
@JacksonXmlRootElement(localName = "Head")
public class ReqHead {
@JacksonXmlProperty(localName = "TxCode")
private String txCode;
@JacksonXmlProperty(localName = "RetCode")
private String retCode;
@JacksonXmlProperty(localName = "RetMsg")
private String retMsg;
@JacksonXmlProperty(localName = "note")
private String note;
}
/**
* 请求体
*/
@Data
@JacksonXmlRootElement(localName = "Body")
public class ReqXmlBody {
@JacksonXmlProperty(localName = "Name")
private String name;
@JacksonXmlProperty(localName = "Address")
private String address;
@JacksonXmlProperty(localName = "Age")
private String age;
@JacksonXmlProperty(localName = "Sex")
private String sex;
// @JacksonXmlProperty(localName = "sdoList")
@JacksonXmlElementWrapper(localName = "sdoList")//序列化
private List<Sdo> sdo;
//这里如果使用@JacksonXmlProperty注解,集合里的根节点名称设置不了
//没有找到解决的(这里能暂时解决)
}
/**
* 整体处理
* @param <T>
*/
@Data
@ToString
@JacksonXmlRootElement(localName = "service")//根节点
public class ReqMessage<T> implements Serializable {
@JacksonXmlProperty(localName = "Head")
private ReqHead head;//请求头对象
@JacksonXmlProperty(localName = "Body")
private T body;//泛型消息体
}
3:处理代码
/**
* 对象转xml
*/
@PostMapping("objectToXml")
public String objectToXml() throws JsonProcessingException {
ReqMessage<ReqXmlBody> data = new ReqMessage<>();
ReqHead head = new ReqHead();
head.setTxCode("111111");
head.setRetCode("0000");
head.setRetMsg("交易成功");
ReqXmlBody body = new ReqXmlBody();
body.setName("小王");
body.setAddress("北京一号垃圾桶17号床位");
body.setAge("25");
body.setSex("男");
data.setHead(head);
data.setBody(body);
List<Sdo> list = new ArrayList<>();
Sdo sdo = new Sdo();
sdo.setSdo1("111");
sdo.setSdo2("111");
sdo.setSdo3("111");
Sdo sdo2 = new Sdo();
sdo2.setSdo1("111");
sdo2.setSdo2("111");
sdo2.setSdo3("111");
list.add(sdo);
list.add(sdo2);
body.setSdo(list);
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
String xmlString = xmlMapper.writeValueAsString(data);
log.info("对象转xml:{}", xmlString);
//转化成对应实体类
ReqMessage<ReqXmlBody> data = mapper.readValue(xmlString, new TypeReference<ReqMessage<ReqXmlBody>>() {
});
log.info("xml转对转:{}", data );
return xmlString;
}