作者:手机用户2502921293 | 来源:互联网 | 2023-01-27 08:40
1.说明
在工作中,需要将Java集合中的数据保存到XML文件中。
在此总结一下,动态保存数据到XML文件的方法。
2.Java源码
(1)打入XML相关的Jar包
打入jdom.jar包
下载地址:http://jarfiles.pandaidea.com/jdom.html
(2)要生成的JavaBean对象
package com.test;
public class Person {
private String name;
private int age;
public Person(){}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)动态生成XML文件工具类
package com.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class XmlGeneratorUtil {
//对应JavaBean的类名(包名+类名)
public static String JAVA_FULL_NAME="";
//生成的XML的文件名
private static String XML_FILE_NAME="";
/**
* 生成XML文件
* @param list
* @param className :包名+类名
* @return
*/
public static void createXmlDocument(List list,String javaClassName) {
try {
//设置全局属性
JAVA_FULL_NAME=javaClassName;
int lastIndexOf = javaClassName.lastIndexOf('.');
if(lastIndexOf!=-1){
XML_FILE_NAME= javaClassName.substring(lastIndexOf+1);
}
//将集合对象转换为XML文件内容
Document doc = generateXMLContents(list);
//生成XML文件
DOMSource source = new DOMSource(doc);
TransformerFactory tf = TransformerFactory.newInstance();
//设置缩进量
tf.setAttribute("indent-number", new Integer(3));
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//设置文档的换行与缩进
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//合成文件路径
String xmlFilePath = System.getProperty("user.dir");
File file = new File(xmlFilePath +"\\"+ XML_FILE_NAME +".xml");
//写入文件
FileOutputStream fileOutputStream = new FileOutputStream(file);
PrintWriter pw = new PrintWriter(fileOutputStream);
StreamResult result = new StreamResult(pw);
transformer.transform(source, result);
System.out.println("生成XML文件成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 将集合对象转换为XML文件内容
* @param list
* @param className
* @return
*/
public static Document generateXMLContents(List list) {
Document doc=null;
Element root = null;
try {
//创建新文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.newDocument();
doc.setXmlStandalone(true);
//第一行
root = doc.createElement("Result");
root.setAttribute("Total_Size", ""+list.size());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeDate = df.format(new Date());
root.setAttribute("time", timeDate);
doc.appendChild(root);
//反射机制获得所有属性
Class c = Class.forName(JAVA_FULL_NAME);
Method[] methods = c.getMethods();
Field[] fields = c.getDeclaredFields();
//遍历集合,一个对象一行
for (Object obj: list) {
//节点名称为JAVA文件类名
Element element = doc.createElement(XML_FILE_NAME);
for(Field field:fields){
String fieldName = field.getName();
//根据属性名合成方法名
String methodName ="get"+ fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
//动态获取该方法
Method method = c.getMethod(methodName, null);
//动态调用该方法
Object invoke = method.invoke(obj, null);
if(invoke==null){
invoke ="";
}
//添加属性
element.setAttribute(fieldName,invoke.toString());
}
root.appendChild(element);
}
} catch (Exception e) {
e.printStackTrace();
}
return doc;
}
}
(4)执行类
package com.test;
import java.util.Arrays;
import java.util.List;
public class XmlGeneratorDemo {
public static void main(String[] args) {
try {
Object[] arr = new Person[] {
new Person("lily", 20),
new Person("lucy", 25),
new Person("Tom", 15),
new Person("Jack", 35)
};
// 将数组转换成List
List list = Arrays.asList(arr);
// 生成XML文件
String name = Person.class.getName();
XmlGeneratorUtil.createXmlDocument(list,name);
} catch (Exception e) {
e.printStackTrace();
System.err.println("出现异常");
}
}
}
3.结果
刷新一下项目,项目的根目录下生成了Person.xml文件