温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-31 02:22:18 来源:网络 阅读:3875 作者:七羽燕 栏目:开发技术

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);

//生成xml
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));//标签添加class属性 eles.addAttribute("size", ((List)ob).size() + "");//标签添加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());//标签添加class属性 String getMeName = "get" + f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1);//构造set方法 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);//构造set方法 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; }

}

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI