package xml;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
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 XmlGeneratorDemo {
public static void main(String[] args) throws IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
String outputPath = "src/xml/parser/persons.xml";
Person person1 = new Person("jinbo",33);
Person person2 = new Person("gameboy",25);
List<Object> list = new ArrayList<Object>();//将数组转换成List
list.add(person1);
list.add(person2);
generateXml(outputPath,list);
}
public static void generateXml(String outputPath,List<Object> list) {
try {
Document doc = generateXml(list);//生成XML文件
outputXml(doc, outputPath);//将文件输出到指定的路径
} catch (Exception e) {
System.err.println("出现异常");
}
}
/**
* 将XML文件输出到指定的路径
* @param doc
* @param fileName
* @throws Exception
*/
private static void outputXml (Document doc, String fileName) throws Exception{
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
DOMSource source = new DOMSource(doc);
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");//设置文档的换行与缩进
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
StreamResult result = new StreamResult(pw);
transformer.transform(source, result);
System.out.println("生成XML文件成功!");
}
/**
* 生成XML文件
* @param list
* @return
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
*/
public static Document generateXml(List<Object> list) throws NoSuchMethodException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException {
Document doc = null;
Element root = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.newDocument();
root = doc.createElement("person");
doc.appendChild(root);
} catch (Exception e) {
e.printStackTrace();
return null;//如果出现异常,则不再往下执行
}
Element element ;
for (int i = 0; i < list.size(); i++) {
Object model = list.get(i);
element = doc.createElement("person"+(i+1));
// 获取实体类的所有属性,返回Field数组
Field[] field = model.getClass().getDeclaredFields();
// 遍历所有属性
for (int j = 0; j < field.length; j++) {
// 获取属性的名字
String name = field[j].getName();
// 将属性的首字符大写,方便构造get,set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
// 获取属性的类型
String type = field[j].getGenericType().toString();
// 如果type是类类型,则前面包含"class ",后面跟类名
if (type.equals("class java.lang.String")) {
Method m = model.getClass().getMethod("get" + name);
// 调用getter方法获取属性值
String value = (String) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
if (type.equals("class java.lang.Integer")) {
Method m = model.getClass().getMethod("get" + name);
Integer value = (Integer) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
if (type.equals("int")) {
Method m = model.getClass().getMethod("get" + name);
Integer value = (Integer) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
if (type.equals("class java.lang.Short")) {
Method m = model.getClass().getMethod("get" + name);
Short value = (Short) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
if (type.equals("class java.lang.Double")) {
Method m = model.getClass().getMethod("get" + name);
Double value = (Double) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
if (type.equals("class java.lang.Boolean")) {
Method m = model.getClass().getMethod("get" + name);
Boolean value = (Boolean) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
if (type.equals("class java.util.Date")) {
Method m = model.getClass().getMethod("get" + name);
Date value = (Date) m.invoke(model);
element.setAttribute(""+name, ""+value);
}
}
root.appendChild(element);
}
return doc;
}
}
我这样写的好处就是,不管是存储什么实体类,只需要用存入list<object>,就可以实现自动存储,不需要遍历。