这里提供了一个工具类,可以直接复制用的,使用的是原生的不依赖任何第三方jar包的。转换示例这里也提供了,需要的可以收藏起来!
我们是用的jdk自带的javax.xml包当中提供的方法及主键。
下面这几个注解,是java自带的注解,用来java对象转xml数据使用。
@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER)
可能值:
xml 文件的根元素
代表的生成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;
}
}
放在属性上,或者set方法上,代表不进行序列化。
该属性作为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;
}
}
@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 的作用。
我们拿这个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;
}
}
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();
}
}
}
}
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);
}
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());
}