热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java动态生成XML文件

1.说明在工作中,需要将Java集合中的数据保存到XML文件中。在此总结一下,动态保存数据到XML文件的方法。2.Java源码(1)打入XML相关的Ja


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文件



   
   
   
   





推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
author-avatar
手机用户2502921293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有