将XML结点转换成JAVABEAN并存入数据库
http://tech.ddvip.com 2007年07月03日 社区交流
内容摘要:动解析的过程中,我们仍然发现各个结点的解析和入库中有很多东西是共同的,或者有共同的规律,这些东西可以抽出来作为一个准框架,然后再将结点中不同的部分开放出来,允许具体的结点做具体的实现,并最终形成一个半自动的解析/入库框架。
程序在解析时,遍历的是BEAN树;在持久化时也是。比起XML树,BEAN树代表真正的业务结构;比起数据库表关系树,BEAN树才能由父至子地进行先序遍历
4.其他问题
a.要让程序知道,原子属性中哪些是XML结点的属性,哪些是XML结点的原子ELEMENT。代码中这是两个抽象方法,必须让具体的结点类实现
b.回顾本文概述部分提到的“pig --content --pighead 的三级关系,无端端多了一个content结点”,因此我们要让程序知道,pighead,pigfoot等结点的子结点,究竟是pig,还是pig下的content。处理不规范XML时要注意这个问题。这也是一个抽象方法,必须让具体的结点类实现
c.与上一条类似但更变态的,是类集结点的不规范问题。假设一个pig有多个pighead,那结构可能为 pig--pighead,pighead,...,也可能为pig--pigheads--content,content.... 必须让程序知道某个具体结点用的是哪种模式
5.代码
核心:多态 + 递归
a.接口BusiNode
import java.util.*;
import org.dom4j.Element;
/**
* 每个结点都要实现的接口
* 它提供了一些方法以方便实现递归的XML解析和持久化
*
*/
public interface BusiNode {
/**
* 所有类型为不可分类型的属性
* @return 属性名的集合
*/
public List getAtomicPropNames();
/**
* 一些成员变量。这些成员变量是XML结点的属性
* @return
*/
public List getXmlAttributes();
/**
* 一些成员变量。这些成员变量是XML结点的子元素,并且类型为不可分的
* @return
*/
public List getXmlAtomicElements();
/**
* 所有类型为类集的属性,并且这些类集中每个元素的类型都是BusiNode
* @return key = 属性名, value = 属性类的Class对象。
* 如果为空不返回NULL,而是空的MAP
*/
public Map getCollectionPropsMap();
/**
* 所有类型为BusiNode的属性
* @return 属性名的集合
*/
public List getBusiNodePropNames();
/**
* 从XML中解析出来。
* @param element
* @return
*/
public void parseFromXML(Element element);
}
责编:豆豆技术应用
正在加载评论...