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

责编:豆豆技术应用

正在加载评论...