这里提供了一个工具类,可以直接复制用的,使用的是原生的不依赖任何第三方jar包的。转换示例这里也提供了,需要的可以收藏起来!
目录
- 1、注释说明
- 1.1、@XmlAccessorType
- 1.2、@XmlRootElement
- 1.3、@XmlElement
- 1.4、@XmlTransient
- 1.5、@XmlAttribute
- 1.6、@XmlJavaTypeAdaptor
- 2、测试类
- 3、util
- 4、测试bean在指定路径下生成xml
- 5、读取指定路径的xml,转为JavaBean
1、注释说明
我们是用的jdk自带的javax.xml包当中提供的方法及主键。
下面这几个注解,是java自带的注解,用来java对象转xml数据使用。
1.1、@XmlAccessorType
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
可能值:
- FIELD: JAXB 绑定类中的每个非静态、非瞬态字段将会自动绑定到 XML,除非由 XmlTransient 注释。
- NONE: 所有字段或属性都不能绑定到 XML,除非使用一些 JAXB 注释专门对它们进行注释。
- PROPERTY: JAXB 绑定类中的每个获取方法/设置方法对将会自动绑定到 XML,除非由 XmlTransient 注释。
- PUBLIC_MEMBER:每个公共获取方法/设置方法对和每个公共字段将会自动绑定到 XML,除非由 XmlTransient 注释。
1.2、@XmlRootElement
xml 文件的根元素
1.3、@XmlElement
代表的生成xml的属性名称,一般用在属性上,或者set方法上。
用法@XmlElement(name=“NewElementName”),那么生成的xml串的elment的标签是NewElementName。
用法示例:
@XmlRootElement(name = "CaseInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CaseInfo implements Serializable {
/**
* 姓名
*/
@XmlElement(name = "张三")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
转为xml之后是:
1.4、@XmlTransient
放在属性上,或者set方法上,代表不进行序列化。
1.5、@XmlAttribute
该属性作为xml的attribute。
用法示例:
@XmlRootElement(name = "CaseInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CaseInfo implements Serializable {
/**
* 姓名
*/
@XmlAttribute(name = "张三")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
转为xml之后是:
1.6、@XmlJavaTypeAdaptor
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Boy {
private String name = "CY";
private Address address; // 是一个接口
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在 java object 转换成 xml 的时候,接口Address 无法被转换。
所以 这里要加上 @XmlJavaTypeAdapter(AddressAdapter.class)
所以 要多写一个AddressAdaptor 类。
这个类会返回Address接口的一个具体实现类的对象。
这 就是 @XmlJavaTypeAdapter 的作用。
2、测试类
我们拿这个javaBean来作为测试对象。
@XmlRootElement:代表的生成xml的外标签名称
@XmlElement:代表的生成xml的属性名称
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "CaseInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class CaseInfo{
/**
* 姓名
*/
@XmlElement(name = "NAME")
private String name;
/**
* 性别0男 1女
*/
@XmlElement(name = "SEX")
private String sex;
/**
* 民族
*/
@XmlElement(name = "Nation")
private String nation;
/**
* 地址
*/
@XmlElement(name = "Address")
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getNation() {
return nation;
}
public void setNation(String nation) {
this.nation = nation;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3、util
import cn.org.entity.CaseInfo;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
public class XmlUtil {
/**
* 读取指定路径的xml文件转换为Java对象
*
* @param xmlPath
* @param load
* @return
*/
public static Object xmlToBean(String xmlPath, Class<?> load) {
JAXBContext context = null;
Object object = null;
try {
context = JAXBContext.newInstance(load);
Unmarshaller unmarshaller = context.createUnmarshaller();
object = unmarshaller.unmarshal(new File(xmlPath));
} catch (JAXBException e) {
e.printStackTrace();
}
return object;
}
/**
* java对象转换为XML字符串
*
* @param obj Java对象
* @param load Java对象类
* @param coding 编码
* @return
* @throws JAXBException
*/
public static String beanToXml(Object obj, Class<?> load, String coding) {
JAXBContext context = null;
StringWriter writer = null;
try {
context = JAXBContext.newInstance(load);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, coding);
writer = new StringWriter();
marshaller.marshal(obj, writer);
} catch (JAXBException e) {
e.printStackTrace();
}
return writer != null ? writer.toString() : null;
}
/**
* java对象转换为XML字符串,并上传到指定路径
*
* @param obj Java对象
* @param load Java对象类
* @param coding 编码
* @param xmlPath 存放地址
*/
public static void uploadByBeanToXml(Object obj, Class<?> load, String coding, String xmlPath) {
String xmlString = beanToXml(obj, load, coding);
System.out.println(xmlString);
//写入到xml文件中
BufferedWriter bfw = null;
try {
bfw = new BufferedWriter(new FileWriter(new File(xmlPath)));
bfw.write(xmlString);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bfw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4、测试bean在指定路径下生成xml
public static void main(String[] args) {
String url = "C:\\Users\\gxs\\Desktop" + File.separator + "case.xml";
CaseInfo caseInfo = new CaseInfo();
caseInfo.setAddress("北京");
caseInfo.setName("张三");
// 生成xml文件
uploadByBeanToXml(caseInfo,CaseInfo.class,"utf-8",url);
}
这时候会发现,假如caseInfo属性值没有赋值,那么生成的xml是连key值也没有的。
假如想让他在没值的时候,也有key值,可以这样。给属性赋值空值就可以了。这里以Nation属性为例子。
public static void main(String[] args) {
String url = "C:\\Users\\gxs\\Desktop" + File.separator + "case.xml";
CaseInfo caseInfo = new CaseInfo();
caseInfo.setAddress("北京");
caseInfo.setName("张三");
caseInfo.setNation("");
uploadByBeanToXml(caseInfo,CaseInfo.class,"utf-8",url);
}
5、读取指定路径的xml,转为JavaBean
public static void main(String[] args) {
String url = "C:\\Users\\gxs\\Desktop" + File.separator + "case.xml";
CaseInfo o = (CaseInfo)xmlToBean(url, CaseInfo.class);
System.out.println(o.getName());
System.out.println(o.getAddress());
System.out.println(o.getNation());
}