xml 转 对象 对象转xml
Posted 煎蛋的技术笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xml 转 对象 对象转xml相关的知识,希望对你有一定的参考价值。
今天在和外部对接接口时,需要用到 xml 格式的请求参数。刚下手时突然感觉有点手生,这次特地记录一下。
直接上互转代码
```
import com.alibaba.fastjson.JSON;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
public class XmlParseUtils {
/**
* bean转化成xml
* @param obj
* @param load
* @return
* @throws JAXBException
*/
public static String beanToXml(Object obj, Class<?> load) {
JAXBContext context;
try {
context = JAXBContext.newInstance(load);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 是否格式化生成的xml串
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //编码格式
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xm头声明信息
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
return writer.toString();
} catch (JAXBException e) {
e.printStackTrace();
throw new IllegalArgumentException("xmlContext:"+ JSON.toJSONString(obj) +",class:"+load.getName(),e);
}
}
/**
* xml转化成bean
* @param load
* @return
* @throws JAXBException
* @throws IOException
*/
public static <T> T xmlToBean(String xmlContext, Class<T> load) {
try {
JAXBContext context = JAXBContext.newInstance(load);
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlContext);
Object object = unmarshaller.unmarshal(sr);
return (T) object;
} catch (JAXBException e) {
throw new IllegalArgumentException("xmlContext:"+xmlContext +",class:"+load.getName(),e);
}
}
}
```
转化的代码还是很简单的。但接下来问题来了,对面要求,对象的首字母大写其余的小写,参数的字母都要大写。可这明显不符合命名规范。于是只能强行命名。
这是便要用到xml的注解了。
如下面的对象
```
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Person")
public class Person {
private String name;
private String style;
private Family family;
@XmlAttribute(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute(name = "STYLE")
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
@XmlElement(name = "Family")
public Family getFamily() {
return family;
}
public void setFamily(Family family) {
this.family = family;
}
}
```
下面分别来讲一下这些注解的作用
@XmlRootElement(name = *”Person”*),这个是*必须要的注解*,里面的name 是为了解决刚提到的xml的首字母大写的问题。
@XmlAttribute(name = *”NAME”*),是用来解决字段显示在同一个</>中的问题,name是为了解决刚提到的字段字母大写的问题。也可以使用@ XmlElement(name = *”NAME”*),但两个注解的显示方式不一样。如使用@XmlAttribute 显示<Person NAME=“张珊” /> 如使用XmlElement(name = *”NAME”*) 显示 <Person><NAME>张珊</NAME></Person>
@XmlElement(name = *”Family”*), 是用来解决对象的xml的首字母大写的问题。
到此,对方的要求全部满足
如刚入门,建议看一下w3cschool [JAXB 概述_w3cschool](https://www.w3cschool.cn/jaxb2/jaxb2-5hnk2zo8.html)
以上是关于xml 转 对象 对象转xml的主要内容,如果未能解决你的问题,请参考以下文章