自动生成xml文件
1、为什么编写自动生成xml文件的工具类?
由于在ajax访问后台代码过程中,后台需要传送格式化后的数据给jsp等前台文件,所以选择了xml文件格式;由于在生成xml文件过程中需要程序员手动输入结点名称,数据量少的情况下,可以应用,但随着数据量的增加,手动输入有点累、烦、代码冗余等,所以选择了编写该工具类自动生成xml数据。
2、生成原理?
利用类的反射机制,获取类的名称、属性的名称,根据类的名称生成根节点名称,根据类(自定义类)的属性的名称生成分结点名称。依据属性的类型在进一步深化。
3、适应范围?
java基本数据类型、数组、自定义类、Collection、Map或他们的子类。
4、设计缺陷?
在设计这个方法的时候没有考虑其他数据结构,如有兴趣可以对以下代码进行更新!
5、测试过程中的问题?
<--
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {}
-->
这段代码在MyEclipse配置java compiler 其 compiler compliance level设置为1.5时,而设置为1.6时需要将上面代码修改为
<--
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length-1; i++) {}
-->
6、如有其他错误或有更好的实现方法,敬请指教!
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jdom.Document;
import org.jdom.Element;
public class XMLDocumentUtil {
/*
* 利用对象生产相应的xml数据信息
*
* @param obj 数据源
* @return document xml文档对象
* @throws Exception
*/
public static Document createXMLDocument(Object obj) throws Exception {
Element headerNode = getElementFromName(obj.getClass().getName());
Document document = new Document(headerNode);
int flag = estimateNestingNode(obj);
if (0 == flag) {
headerNode.addContent("" + obj);
} else {
distributeCreateNodeTask(null, obj, headerNode, flag);
}
return document;
}
/*
* 根据属性类型选择相应的处理方法
*
* @param name 父节点的名称
* @param obj 数据源
* @param element 父节点
* @flag 相应方法的选择依据
* throws Exception
*
*/
private static void distributeCreateNodeTask(String name, Object obj,
Element element, int flag) throws Exception {
if (flag == 1) {
createNodeProperties(name, obj, element);
} else if (flag == 2) {
createSingleNode(name, obj, element);
} else if (flag == 3) {
createListNode(name, obj, element);
} else if (flag == 4) {
createMapNode(name, obj, element);
} else if (flag == 5) {
createSetNode(name, obj, element);
}
}
/*
* 生成对象数组结点
*
* @param name 父节点的名称
* @param obj 数据源
* @param element 父节点
* @flag 相应方法的选择依据
* throws Exception
*
*/
public static void createNodeProperties(String name, Object obj,
Element element) throws Exception {
Element nodes;
if (null == name || name.equals("") || name.trim().equals("")) {
nodes = element;
} else {
nodes = new Element(name);
element.addContent(nodes);
}
Object[] objects = (Object[]) obj;
for (int i = 0; i < objects.length; i++) {
Element node = getElementFromName(objects[i].getClass().getName());
nodes.addContent(node);
createSingleElement(objects[i], node);
}
}
/*
* 生成类对象结点
*
* @param name 父节点的名称
* @param obj 数据源
* @param element 父节点
* @flag 相应方法的选择依据
* throws Exception
*
*/
public static void createSingleNode(String name, Object obj, Element element)
throws Exception {
Element node;
if (null == name || name.equals("") || name.trim().equals("")) {
node = element;
} else {
node = new Element(name);
element.addContent(node);
}
createSingleElement(obj, node);
}
/*
* 将类属性所有数据依次写入相应xml的类结点中
*
* @param obj 数据源
* @param element 类结点
* throws Exception
*/
public static void createSingleElement(Object obj, Element element)
throws Exception {
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
int flag = estimateNestingNode(fields[i], obj);
String name = fields[i].getName();
if (0 == flag) {
setNodeProperties(fields[i], obj, element);
} else {
distributeCreateNodeTask(name, fields[i].get(obj), element,
flag);
}
}
}
/*
* 生成List类型的结点
*
* @param name 结点名称
* @param obj 数据源
* @param element 父结点
* throws Exception
*/
public static void createListNode(String name, Object obj, Element element)
throws Exception {
Element node;
if (null != name && !name.trim().equals("")) {
node = new Element("List");
node.setAttribute("name", name);
element.addContent(node);
} else {
node = element;
}
List list = (List) obj;
for (Object object : list) {
createListElement(object, node);
}
}
/*
* 将List类型数据写入相应xml的List结点
*
* @param name 结点名称
* @param obj 数据源
* @param element 类结点
* throws Exception
*/
public static void createListElement(Object obj, Element element)
throws Exception {
int flag = estimateNestingNode(obj);
String name = "value";
if (0 == flag) {
Element node = new Element(name);
node.addContent("" + obj);
element.addContent(node);
} else {
distributeCreateNodeTask(name, obj, element, flag);
}
}
/*
* 将Map类型数据写入相应xml的Map结点
*
* @param name 结点名称
* @param obj 数据源
* @param element 类结点
* throws Exception
*/
public static void createMapNode(String name, Object obj, Element element)
throws Exception {
Element node;
if (null != name && !name.trim().equals("")) {
node = new Element("Map");
node.setAttribute("name", name);
element.addContent(node);
} else {
node = element;
}
Map map = (Map) obj;
for (Object key : map.keySet()) {
if (null == key) {
continue;
}
Element ele = new Element("entry");
ele.setAttribute("key", "" + key);
node.addContent(ele);
createMapElement(map.get(key), ele);
}
}
/*
* 将Map类型数据写入相应xml的Map结点
*
* @param name 结点名称
* @param obj 数据源
* @param element 类结点
* throws Exception
*/
public static void createMapElement(Object obj, Element node)
throws Exception {
int flag = estimateNestingNode(obj);
String name = "value";
if (0 == flag) {
node.setAttribute(name, "" + obj);
} else {
distributeCreateNodeTask(name, obj, node, flag);
}
}
/*
* 将Set类型数据写入相应xml的Set结点
*
* @param name 结点名称
* @param obj 数据源
* @param element 类结点
* throws Exception
*/
public static void createSetNode(String name, Object obj, Element element)
throws Exception {
Element node;
if (null != name && !name.trim().equals("")) {
node = new Element("Set");
node.setAttribute("name", name);
element.addContent(node);
} else {
node = element;
}
Set set = (Set) obj;
for (Object object : set) {
createListElement(object, node);// set、list结构一样
}
}
/*
* 将单个类属性数据写入相应xml的类结点中
*
* @param field 属性信息
* @param obj 数据源
* @param element 类结点
* throws Exception
*/
private static void setNodeProperties(Field field, Object obj,
Element element) throws Exception {
String name = field.getName();
boolean accFlag = field.isAccessible();
field.setAccessible(true);
Object value = field.get(obj);
field.setAccessible(accFlag);
element.setAttribute(name, "" + value);
}
/*
* @param obj 要判定的数据
* @return 该数据类型
* 0--基本数据类型、String
* 1--数组
* 2--自定义类
* 3--List
* 4--Map
* 5--Set
*/
private static int estimateNestingNode(Object obj) {
String str = "";
if (obj instanceof List) {
return 3;// 表示该属性是list
}
if (obj instanceof Map) {
return 4;// 表示该属性是Map
}
if (obj instanceof Set) {
return 5;// 表示该属性是Set
}
if (null != obj) {
str = obj.getClass().getName();
}
if (str.indexOf("[") != -1) {
return 1;
}
if (str.indexOf("java") != -1) {
return 0;
}
return 2;
}
private static int estimateNestingNode(Field field, Object obj)
throws Exception {
String str = "";
Object value = null;
value = field.get(obj);
if (value instanceof List) {
return 3;// 表示该属性是list
}
if (value instanceof Map) {
return 4;// 表示该属性是list
}
if (value instanceof Set) {
return 5;// 表示该属性是list
}
if (null != value) {
str = value.getClass().getName();
if (str.indexOf("[") != -1) {
return 1;
}
if (str.indexOf("java") != -1) {
return 0;
}
}
return 2;
}
/*
* @param name 变量全称
* @return 变量名生成结点对象
*/
private static Element getElementFromName(String name) {
String[] namesplit = name.split("\\.");
if (namesplit[namesplit.length - 1].endsWith(";")) {
namesplit[namesplit.length - 1] = namesplit[namesplit.length - 1]
.replace(';', 'S');
}
return new Element(namesplit[namesplit.length - 1]);
}
}