XML动态生成相对应的类
发布时间:2020-12-16 05:04:09 所属栏目:百科 来源:网络整理
导读:import java.util.Iterator;import java.util.Map;import java.util.Set;import net.sf.cglib.beans.BeanGenerator;import net.sf.cglib.beans.BeanMap;public class CglibBean {/** * 实体Object */public Object object = null;/** * 属性map */public Bea
import java.util.Iterator; import java.util.Map; import java.util.Set; import net.sf.cglib.beans.BeanGenerator; import net.sf.cglib.beans.BeanMap; public class CglibBean { /** * 实体Object */ public Object object = null; /** * 属性map */ public BeanMap beanMap = null; public String nodeName = ""; public String nodeText = ""; public CglibBean() { super(); } @SuppressWarnings("unchecked") public CglibBean(Map propertyMap) { this.object = generateBean(propertyMap); this.beanMap = BeanMap.create(this.object); } /** * 给bean属性赋值 * * @param property * 属性名 * @param value * 值 */ public void setValue(String property,Object value) { beanMap.put(property,value); } /** * 通过属性名得到属性值 * * @param property * 属性名 * @return 值 */ public Object getValue(String property) { return beanMap.get(property); } /** * 得到该实体bean对象 * * @return */ public Object getObject() { return this.object; } @SuppressWarnings("unchecked") private Object generateBean(Map propertyMap) { BeanGenerator generator = new BeanGenerator(); Set keySet = propertyMap.keySet(); for (Iterator i = keySet.iterator(); i.hasNext();) { String key = (String) i.next(); generator.addProperty(key,(Class) propertyMap.get(key)); } return generator.create(); } } import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.Test; public class XMLTest { private static String text = "<?xml version="1.0" encoding="UTF-8"?><books><book id="book"><title id="title">Harry Potterads</title></book></books>"; @Test public void go() { SAXReader reader = new SAXReader(); Document document; try { document = reader.read(new ByteArrayInputStream(text .getBytes("UTF-8"))); CglibBean cglibBean = create(document.getRootElement(),getChildren(document.getRootElement())); StringBuffer sb = new StringBuffer(); sb.append(getStartNode(cglibBean)); sb.append(getNodeChildren(cglibBean)); sb.append("</").append(cglibBean.nodeName).append(">"); System.out.println(sb.toString()); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } // test(root); catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @SuppressWarnings("unchecked") public String getNodeChildren(CglibBean cglibBean) { Map<String,List<CglibBean>> map = (Map<String,List<CglibBean>>) cglibBean .getValue("children"); Set<?> keySet = map.keySet(); StringBuffer sb = new StringBuffer(); for (Iterator<?> i = keySet.iterator(); i.hasNext();) { String key = (String) i.next(); List<CglibBean> cglibBeans = map.get(key); for (CglibBean bean : cglibBeans) { sb.append(getStartNode(bean)); if (!"".equals(bean.nodeText)) { sb.append(bean.nodeText); } else { sb.append(getNodeChildren(bean)); } sb.append("</").append(bean.nodeName).append(">"); } } return sb.toString(); } public String getStartNode(CglibBean cglibBean) { Set<?> keySet = cglibBean.beanMap.keySet(); StringBuffer startNode = new StringBuffer(); startNode.append("<").append(cglibBean.nodeName); for (Iterator<?> i = keySet.iterator(); i.hasNext();) { String key = (String) i.next(); if (key.indexOf(".attr") != -1) { String temp = key.substring(0,key.indexOf(".attr")); temp = temp.substring(temp.lastIndexOf(".") + 1,temp.length()); startNode.append(" ").append(temp).append("="") .append(cglibBean.getValue(key)).append("""); } } startNode.append(">"); return startNode.toString(); } public String getNodeText(CglibBean cglibBean) { String text = ""; Set<?> keySet = cglibBean.beanMap.keySet(); for (Iterator<?> i = keySet.iterator(); i.hasNext();) { String key = (String) i.next(); if (key.indexOf(".text") != -1) { text = (String) cglibBean.getValue(key); } } return text; } @SuppressWarnings("unchecked") public Map<String,List<CglibBean>> getChildren(Element element) throws ClassNotFoundException { Map<String,List<CglibBean>> children = new HashMap<String,List<CglibBean>>(); for (Element child : (List<Element>) element.elements()) { Map<String,List<CglibBean>> cglibBeanMap = getChildren(child); CglibBean cglibBean = create(child,cglibBeanMap); List<CglibBean> cglibBeanList = children.get(child.getName()); if (cglibBeanList == null) { cglibBeanList = new ArrayList<CglibBean>(); cglibBeanList.add(cglibBean); children.put(child.getName(),cglibBeanList); } else { cglibBeanList.add(cglibBean); children.put(child.getName(),cglibBeanList); } } return children; } CglibBean cglibBean; @SuppressWarnings("unchecked") public CglibBean create(Element element,Map<String,List<CglibBean>> children) throws ClassNotFoundException { HashMap<String,Class<?>> propertyMap = new HashMap<String,Class<?>>(); for (Attribute attribute : (List<Attribute>) element.attributes()) { propertyMap.put(element.getName() + "." + attribute.getName() + ".attr",Class.forName("java.lang.String")); } propertyMap.put(element.getName() + ".text",Class.forName("java.lang.String")); propertyMap.put("children",Class.forName("java.util.Map")); // 生成动态 Bean CglibBean bean = new CglibBean(propertyMap); bean.nodeName = element.getName(); bean.nodeText = element.getText(); for (Attribute attribute : (List<Attribute>) element.attributes()) { bean.setValue(element.getName() + "." + attribute.getName() + ".attr",attribute.getText()); } bean.setValue(element.getName() + ".text",element.getText()); bean.setValue("children",children); return bean; } }目前解析思路是:books是一个类,类有个集合属性children,children类型Map<String,List<CglibBean>>,专门存放各种各样的属性,比如:book属性,以此类推。本来想换个思路实现,由于项目没有用到,就停止了。大概说一下另外种做法,books是一个类,类有个book属性,而不是把所有属性全部放在Map<String,List<CglibBean>>中。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |