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

Apache Digester 解析 XML 實戰:從規則配置到物件映射完整教學

     編輯:Java 相關知識

Digester 簡介

  • Apache Commons 組件,底層基於 SAX,以「規則驅動」方式將 XML 節點映射至 Java 物件。
  • 無需手寫 SAX Handler,透過 addCallMethod、addCallParam、addObjectCreate、addSetProperties、addSetNext 等規則聲明式處理。

環境準備

所需 JAR:digester、beanutils、collections、commons-logging、相容 SAX2/JAXP1.1 的解析器(如 Xerces)。配置 commons-logging.properties 指向 Log4j。

範例 XML:module.xml

<?xml version="1.0" encoding="gb2312"?>
<quasar_module>
  <module_info>
    <name>Skyhome</name>
    <description>web site system</description>
    <version>2.0.1</version>
    <author>l_walker</author>
    <mail>walker@skyinn.org</mail>
    <update_time>2003-04-30</update_time>
  </module_info>
  <action_mappings>
    <action name="home" requestPath="/Home" actionClass="org.skyinn.action.GlobalAction"/>
    <action name="forum" requestPath="/Forum" actionClass="org.skyinn.action.ForumAction"/>
  </action_mappings>
</quasar_module>

兩種解析模式

模式一:方法呼叫映射

Digester digester = new Digester();
digester.push(this); // 將當前實例壓入堆疊
digester.addCallMethod("quasar_module/module_info", "addModuleInfo", 6);
digester.addCallParam("quasar_module/module_info/name", 0);
digester.addCallParam("quasar_module/module_info/description", 1);
digester.addCallParam("quasar_module/module_info/version", 2);
digester.addCallParam("quasar_module/module_info/author", 3);
digester.addCallParam("quasar_module/module_info/mail", 4);
digester.addCallParam("quasar_module/module_info/update_time", 5);
digester.parse(configFile);

對應處理方法:

public void addModuleInfo(String name, String desc, String ver, String author, String mail, String time) {
    System.out.println("name=" + name + ", version=" + ver + "...");
}

模式二:物件建立與屬性注入

Digester digester = new Digester();
digester.setValidating(false);
digester.addObjectCreate("quasar_module/action_mappings", SampleDigester.class);
digester.addObjectCreate("quasar_module/action_mappings/action", ActionMapping.class);
digester.addSetProperties("quasar_module/action_mappings/action", "name", "name");
digester.addSetProperties("quasar_module/action_mappings/action", "requestPath", "requestPath");
digester.addSetProperties("quasar_module/action_mappings/action", "actionClass", "actionClass");
digester.addSetNext("quasar_module/action_mappings/action", "addActionMapping");
digester.parse("module.xml");

ActionMapping 需具備 name、requestPath、actionClass 三屬性及 getter/setter。addActionMapping(ActionMapping) 會在每個 <action> 結束時被呼叫。

核心規則速查表

規則方法用途
addObjectCreate(pattern, class)遇到 pattern 實例化類別,壓入堆疊
addSetProperties(pattern, attr, prop)將 XML 屬性 attr 映射至堆疊頂物件的屬性 prop
addCallMethod(pattern, method, paramCount)呼叫堆疊頂物件的 method,參數由 addCallParam 提供
addCallParam(pattern, paramIndex)將 pattern 節點文字內容作為第 paramIndex 參數
addSetNext(pattern, method)彈出堆疊頂物件,傳給次頂物件的 method
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved