文章目录
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>