Java動態生成XML文件


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>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章