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<Object> 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<Object> 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<Object> 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文件
<?xml version="1.0" encoding="UTF-8"?>
<Result Total_Size="4" time="2014-06-06 10:42:19">
<Person age="20" name="lily"/>
<Person age="25" name="lucy"/>
<Person age="15" name="Tom"/>
<Person age="35" name="Jack"/>
</Result>