现在的位置: 首页 > 综合 > 正文

Java动态生成XML文件

2017年11月29日 ⁄ 综合 ⁄ 共 4110字 ⁄ 字号 评论关闭
文章目录

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>

抱歉!评论已关闭.