XMLParse之XML文件生成实现
前面实现了XML的设计和文件解析,对于XML文件的生成,原理依然是按照反射机制,将
XML标签类
实例逆向保存到dom4j.jar
中的Element中,对照前面两篇文章,实现并不困难
思路分析
通过反射取到
XML标签类
中的各个变量的类型和值。
遇到List
或者非属性对象需要创建新的标签元素。使用addElement()
方法实现添加新的节点。
遇到String
、Integer
、Float
、Boolean
直接添加到当前元素的属性中即可在
XmlGenerate.java
中定义的write()
方法为具体实现。
上代码:
private static void write(Element rootElement, Object object) throws InvocationTargetException, IllegalAccessException {
Class<? extends Object> clazz = object.getClass();
Field[] filds = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
for (Field fild : filds) {
String type = fild.getGenericType().toString();
String name;
if (type.contains(".List")){//子节点 集合
name = fild.getGenericType().toString();
name = name.substring(name.lastIndexOf(".")+1,name.length()-1);
for (Method method : methods) {
if (("get"+name.toLowerCase()+"s").equals(method.getName().toLowerCase())){
List list = (List) method.invoke(object);
if (list != null){
for (Object o : list) {
Element element = rootElement.addElement(name);
write(element,o);
}
}
}
}
System.out.println(fild.getName());
System.out.println(fild.getType());
System.out.println(fild.getDeclaringClass());
System.out.println(fild.getGenericType());
}else if (type.contains(".String")){//属性
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
String s = (String) method.invoke(object);
if (s == null)
s = " ";
rootElement.addAttribute(fild.getName(),s);
}
}
}else if (type.contains(".Integer")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Integer s = (Integer) method.invoke(object);
rootElement.addAttribute(fild.getName(),s+"");
}
}
}else if (type.contains(".Float")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Float s = (Float) method.invoke(object);
rootElement.addAttribute(fild.getName(),s+"");
System.out.println("name"+fild.getName()+" value "+s);
}
}
}else if(type.contains(".Boolean")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Boolean s = (Boolean) method.invoke(object);
rootElement.addAttribute(fild.getName(),s+"");
System.out.println("name"+fild.getName()+" value "+s);
}
}
}else {//子节点 非集合
name = fild.getGenericType().toString();
name = name.substring(name.lastIndexOf(".")+1);
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Object obj = method.invoke(object);//获得子标签
if (obj!=null){
Element element = rootElement.addElement(name);
write(element,obj);
}
}
}
}
}
}
generate 生成XML文件
封装在
XMLAPI.java
文件中,writeObj2Xml()
方法,只需要传入XML标签类
实例和输出路径就可以生成XML文件。在writeObj2Xml()
中调用了XmlGenerate.generate()
。
/**
* Generate.
*
* @param object 数据源,待转化成xml的实体类
* @param DesPath xml文件生成路径
* @throws InvocationTargetException the invocation target exception
* @throws IllegalAccessException the illegal access exception
* @throws IOException the io exception
*/
public static void generate(Object object,String DesPath)throws InvocationTargetException, IllegalAccessException, IOException {
String name;
Class<?> clazz = object.getClass();
String rootname = clazz.getName();
rootname = rootname.substring(rootname.lastIndexOf(".")+1);
System.out.println(rootname);
Field[] filds = clazz.getDeclaredFields();
Method[] methods = clazz.getDeclaredMethods();
Element root = DocumentHelper.createElement(rootname);
// 创建文档并设置文档的根元素节点
Document doucment = DocumentHelper.createDocument(root);
for (Field fild : filds) {
String type = fild.getGenericType().toString();
if (type.contains(".String")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
String s = (String) method.invoke(object);
if (s == null)
s = "";
root.addAttribute(fild.getName(),s);
System.out.println("name"+fild.getName()+" value "+s);
}
}
}else if (type.contains(".Integer")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Integer s = (Integer) method.invoke(object);
root.addAttribute(fild.getName(),s+"");
}
}
}else if (type.contains(".Float")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Float s = (Float) method.invoke(object);
root.addAttribute(fild.getName(),s+"");
System.out.println("name"+fild.getName()+" value "+s);
}
}
}else if(type.contains(".Boolean")){
name = fild.getName();
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Boolean s = (Boolean) method.invoke(object);
root.addAttribute(fild.getName(),s+"");
System.out.println("name"+fild.getName()+" value "+s);
}
}
}else if (type.contains(".List")){
name = fild.getGenericType().toString();
name = name.substring(name.lastIndexOf(".")+1,name.length()-1);
for (Method method : methods) {
if (("get"+name.toLowerCase()+"s").equals(method.getName().toLowerCase())){
List list = (List) method.invoke(object);
for (Object o : list) {
Element element = root.addElement(name);
write(element,o);
}
}
}
}else {
name = fild.getGenericType().toString();
name = name.substring(name.lastIndexOf(".")+1);
for (Method method : methods) {
String mName = method.getName();
if (("get"+name.toLowerCase()).equals(mName.toLowerCase())){
Object obj = method.invoke(object);//获得子标签
if (obj!=null){
Element element = root.addElement(name);
write(element,obj);
}
}
}
}
// 设置XML文档格式
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
// 设置XML编码方式,即是用指定的编码方式保存XML文档到字符串(String),这里也可以指定为GBK或是ISO8859-1
outputFormat.setEncoding("UTF-8");
//outputFormat.setSuppressDeclaration(true); //是否生产xml头
outputFormat.setIndent(true); //设置是否缩进
outputFormat.setIndent(" "); //以四个空格方式实现缩进
outputFormat.setNewlines(true); //设置是否换行
//添加
FileOutputStream file = new FileOutputStream(DesPath);
XMLWriter xmlwriter2 = new XMLWriter(file,outputFormat);
xmlwriter2.write(doucment);
xmlwriter2.flush();
xmlwriter2.close();
}
}
写在最后,XML快速解析三篇文章是本人很早之前写的,刚刚用上CSDN,所以尝试着把文章发一下。文章内描述的内容与项目实际内容已经不太一致,但是整体结构,设计思想没有变化,感兴趣的童鞋可以到 GitHub:lijieqing/XMLParser 查看源码,大家共同进步,谢谢!