注解+反射+递归动态生成多层XML

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解+反射+递归动态生成多层XML相关的知识,希望对你有一定的参考价值。

1.首先我们先创建一个xml的帮助类,这个帮助类不许要任何属性,需要帮助实体类识别其他的成员实体类,代码如下:
注释xml帮助类

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

*

  • @auther QiaoZhenwu

  • @date 2017年8月9日 下午5:16:00

    */

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

@Documented

public @interface XmlHelper {}

2.下面我们多创建几个实体类,并且使它们通过@XmlHelper的注解联系起来,代码如下:
import java.util.List;

/**

  • @auther QiaoZhenwu

  • @date 2017年8月9日 下午4:53:35

    */

public class Child {

private String name;

private String age;

@XmlHelper

private List<ChildToChild> childToChilds;

@XmlHelper

private Child2 child2;

public Child2 getChild2() {

    return child2;

}

public void setChild2(Child2 child2) {

    this.child2 = child2;

}

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public String getAge() {

    return age;

}

public void setAge(String age) {

    this.age = age;

}

public List<ChildToChild> getChildToChilds() {

    return childToChilds;

}

public void setChildToChilds(List<ChildToChild> childToChilds) {

    this.childToChilds = childToChilds;

}

}

/**

  • @auther QiaoZhenwu

  • @date 2017年8月10日 下午5:16:56

    */

public class Child2 {

private String name;

private String age;

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public String getAge() {

    return age;

}

public void setAge(String age) {

    this.age = age;

}

}

/**

  • @auther QiaoZhenwu

  • @date 2017年8月10日 上午10:38:54

    */

public class ChildToChild {

private String name;

private String age;

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public String getAge() {

    return age;

}

public void setAge(String age) {

    this.age = age;

}

}

/**

  • @auther QiaoZhenwu

  • @date 2017年8月9日 下午4:53:26

    */

public class Parent {

private String name;

private String age;

@XmlHelper

private Child child;

@XmlHelper

private ParentToParent parentToParent;

public Child getChild() {

    return child;

}

public void setChild(Child child) {

    this.child = child;

}

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public String getAge() {

    return age;

}

public void setAge(String age) {

    this.age = age;

}

public ParentToParent getParentToParent() {

    return parentToParent;

}

public void setParentToParent(ParentToParent parentToParent) {

    this.parentToParent = parentToParent;

}

}

/**

  • @auther QiaoZhenwu

  • @date 2017年8月10日 下午4:44:26

    */

public class ParentToParent {

private String name;

private String age;

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public String getAge() {

    return age;

}

public void setAge(String age) {

    this.age = age;

}

}

3.下面我们写一下xml的生成和测试类,代码如下:
xml生成和测试类

import java.beans.PropertyDescriptor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import com.alibaba.fastjson.JSON;

/**

  • @auther QiaoZhenwu

  • @date 2017年8月9日 下午4:54:43

    */

public class TestMain {

public static void main(String[] args) throws DocumentException {

    List<ChildToChild> childToChilds = new ArrayList<ChildToChild>();

    ChildToChild ctc = new ChildToChild();

    ctc.setAge("8");

    ctc.setName("ctc1");

    ChildToChild ctc2 = new ChildToChild();

    ctc2.setAge("8");

    ctc2.setName("ctc2");

    childToChilds.add(ctc);

    childToChilds.add(ctc2);

    Child2 c2 = new Child2();

    c2.setAge("c18");

    c2.setName("c2");

    Child c = new Child();

    c.setAge("18");

    c.setName("C");

    c.setChildToChilds(childToChilds);

    c.setChild2(c2);

    ParentToParent ptp = new ParentToParent();

    ptp.setAge("p48");

    ptp.setName("ptp");

    Parent p = new Parent();

    p.setAge("48");

// p.setName("P");

    p.setChild(c);

    p.setParentToParent(ptp);

    Document doc = DocumentHelper.createDocument();

    Element root = doc.addElement("xml");

    Element eles = root.addElement("interface");

    eles.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

    eles.addAttribute("xsi:schemaLocation", "http://www.chinatax.gov.cn/tirip/dataspec/interfaces.xsd");

    eles.addAttribute("version", "DZFP1.0");

    getbean(p, eles, "Child");

    String reqBody = "<?xml version=‘1.0‘ encoding=‘utf-8‘ ?>"

            + doc.getRootElement().asXML();

    System.out.println(reqBody);

    Document document=DocumentHelper.parseText(reqBody);

    Element r=document.getRootElement();

    Map<String, Object> map = ParseXml.getMap(r, r.nodeCount());

    System.out.println(JSON.toJSONString(map));

}

/**

 * 生成xml

 * @param o

 * @param root

 */

public static void getbean(Object o, Element root, String name) {

    Class<? extends Object> cls = o.getClass();

    try {

        // 得到自定义的属性

        Field[] fields = cls.getDeclaredFields();

        for (Field f : fields) {

            // 获取属性

            PropertyDescriptor pd = new PropertyDescriptor(f.getName(), cls);

            Method getMethod = pd.getReadMethod();// 获得get方法

            Object ob = getMethod.invoke(o);// 执行get方法返回一个Object

// System.out.println(f.getName() + ":" + f.getType().getName() + " = " + JSON.toJSONString(ob));

            XmlHelper xh = f.getAnnotation(XmlHelper.class);//获取带有@XmlHelper注解的实体

            if (xh != null) {

                if(name != null && !"".equals(name) && name.equals(o.getClass().getSimpleName())){

                    if(f.getType().getName().equals("java.util.List") && ((List)ob).size() > 0){

                        Element eles = root.addElement(f.getName());

                        eles.addAttribute("class", f.getName().substring(0, f.getName().length() - 1));

                        eles.addAttribute("size", ((List)ob).size() + "");

                        for(int i = 0; i < ((List)ob).size(); i++){

                            Object os = ((List)ob).get(i);

                            Element ele = eles.addElement(os.getClass().getSimpleName());//添加xml标签

                            getbean(os, ele, name);//递归 注解类继续解析

                        }

                    }else{

                        Element ele = root.addElement(f.getName());

                        ele.addAttribute("class", f.getName());

                        String getMeName = "get" + f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1);

                        Method actionMethod = cls.getDeclaredMethod(getMeName);

                        // 执行这个方法

                        Object obj = actionMethod.invoke(o);

                        getbean(obj, ele, name);//递归 注解类继续解析

                    }

                }else{

                    Element ele = root.addElement(f.getName());

                    String getMeName = "get" + f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1);

                    Method actionMethod = cls.getDeclaredMethod(getMeName);

                    // 执行这个方法

                    Object obj = actionMethod.invoke(o);

                    getbean(obj, ele, name);//递归 注解类继续解析

                }

            } else {

                if(ob != null){

                    root.addElement(f.getName()).addText(JSON.toJSONString(ob).replace("\"", ""));

                }else{

                    root.addElement(f.getName());

                }

            }

        }

    } catch (Exception e) {

    }

}

}

4.xml解析类
import java.util.HashMap;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import com.alibaba.fastjson.JSON;

/**

  • @auther QiaoZhenwu

  • @date 2017年8月17日 下午2:20:03

    */

public class ParseXml {

public static Map<String, Object> getMap(Element e, int cnt){

    Map<String, Object> map = new HashMap<String, Object>();

    int count = cnt;

    for(int j = 0; j < count; j++){

        if(null != e.node(j).getName()){

            Element el = e.element(e.node(j).getName());

            if(el.getText() == null || "".equals(el.getText())){

                Map<String, Object> ma = getMap(el,el.nodeCount());

                map.put(e.node(j).getName(), ma);

            }else{

                map.put(el.getName(), el.getText());

            }

        }

    }

    return map;

}

}

以上是关于注解+反射+递归动态生成多层XML的主要内容,如果未能解决你的问题,请参考以下文章

Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

java反射机制

注解与反射

注解与反射

Java高级之注解反射

反射 注解 XML总结