首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

XML 轉 JavaBean 並持久化:半自動解析框架設計

     編輯:J2EE

背景:無 Schema XML 的業務解析難題

外部系統提供無 DTD/Schema 的 XML,且 XML 結構與業務物件模型不完全對應 (如多層 content 節點)。無法使用 JAXB 等自動綁定工具,需手工解析但又想復用共同邏輯。

設計目標:半自動框架

  • 自動:利用反射自動處理屬性映射、遞迴遍歷、資料庫寫入。
  • 手動:定義每個業務 Bean、建立對應資料表、實作節點特有邏輯 (如 XML 節點名稱映射、集合節點迭代器)。

核心介面:BusiNode


public interface BusiNode {
    List getAtomicPropNames();           // 基本型別屬性 (String)
    List getXMLAttributes();             // 對應 XML Attribute 的屬性名
    List getXMLAtomicElements();         // 對應 XML 子元素(文字) 的屬性名
    Map> getCollectionPropsMap(); // 集合屬性: 屬性名 -> 元素類別
    List getBusiNodePropNames();         // 單一子節點屬性 (亦實作 BusiNode)
    Element getXMLElementParent(Element root);   // 取得當前節點的 XML 父元素 (處理多層 content)
    Iterator getCollectionElementIterator(Element parent, String propName); // 集合子元素迭代器
    void parseFromXML(Element root);             // 遞迴解析入口
}

預設實作:DefaultBusiNode (Template Method 模式)

  • 利用 PropertyUtils (Apache Commons BeanUtils) 以屬性名字串動態設值。
  • 基本型別限定為 String,避免類型轉換複雜度。
  • 集合屬性需手動註冊 Map<屬性名, 元素Class> (Java 1.4 無泛型擷取限制)。
  • 解析順序:XML Attribute → XML 文字元素 → 單一子節點 → 集合子節點。

持久化:BusiNodeDAO (遞迴寫入)


public class BusiNodeDAO {
    public Long save(BusiNode node, Long parentId) {
        Long id = saveBareNode(node, parentId); // 寫入基本欄位 + parent_id
        // 寫入集合子節點
        for (Map.Entry> e : node.getCollectionPropsMap().entrySet()) {
            Collection coll = (Collection) PropertyUtils.getProperty(node, e.getKey());
            for (Object child : coll) save((BusiNode) child, id);
        }
        // 寫入單一子節點
        for (String prop : node.getBusiNodePropNames()) {
            BusiNode child = (BusiNode) PropertyUtils.getProperty(node, prop);
            if (child != null) save(child, id);
        }
        return id;
    }
    // saveBareNode 利用反射動態生成 INSERT SQL,回傳自增主鍵
}

資料庫約定

  • 每張表需有 id (PK) 與 parent_id (FK) 欄位,名稱統一。
  • 基本型別欄位統一用 VARCHAR,配合 String 屬性避免類型轉換。

優缺點總結

此模式在「結構固定但結構不規範」的整合專案中極具價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優點缺點/限制
大幅減少重複解析/入庫代碼需手工寫 Bean、建表、註冊集合類別
統一異常處理、事務控制基本型別限定 String,無法直接支援 Date/Number
應對不規範 XML 結構靈活Java 1.4 需手動註冊集合泛型類別