XML动态生成相对应的类

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>>中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzj0470

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值