簡體   English   中英

使用Digester從XML文件創建Java對象

[英]Using Digester to create Java Objects from XML file

有人可以幫助我使用Digester API從下面的XML文件中創建Java對象。

我有一個班級公司有這樣的地圖

  Map<String,Department> nameToDeptMap= new HashMap<String,Department>();

我想將下面的XML數據加載到此地圖。

     Department is super class. Development,Testing,Requirment...etc are extending that class. 


    <Company>
    <Employee empname="xyz" department ="com.compnayname.departments.department.Development>
    <Employee empname="xyza" department ="com.compnayname.departments.department.Testing>
    <Employee empname="xyzab" department ="com.compnayname.departments.department.Requiremetns>
    <Employee empname="xyzabc" department ="com.compnayname.departments.department.Production>
     .
     .
     .
     .
    </Company>

加載地圖時,我將傳遞“ empname”以獲取部門對象。

如果您想知道我的狀況,請參見下面的代碼。 我知道這是錯的。

我的Java文件就是這樣。

我能夠編寫Digester規則,以XML文件的形式從String中獲取值,但不知道如何以Object的形式獲取。

    Digester digester = new Digester();     
    digester.addObjectCreate("Company/Employee", Company.class);        
    digester.addCallMethod("Company/Employee", "setComapnyConfigMap", 2);
    digester.addCallParam("Company/Employee", 0, "empname");
    digester.addCallParam("Company/Employee", 1, "department");


           :> Using JDK 1.6 , commons-digester-2.0. 

這不是Digester要做的:

“許多項目讀取XML配置文件以提供系統中各種Java對象的初始化。有多種方法可以這樣做,而Digester組件旨在提供可在許多不同項目中使用的通用實現。”

使用XStream甚至是DOM解析(jdom或dom4j),可以輕松完成您想做的事情。

我還不太清楚您要在此處實現的目標:您是否需要為每個員工創建一個新的Department實例,還是要將員工ID映射到現有部門?

無論哪種方式,使用Digester都可以執行許多操作,但是,如果您不熟悉Digester,最簡單的方法就是只更新setComapnyConfigMap方法以接受字符串參數,然后在其中進行處理。 例如,為每個雇員創建特定部門子類的新實例:

public static class Company {
  private Map<String, Department> nameToDeptMap = new HashMap<>();

  public void setComapnyConfigMap(String empName, String deptClass)
      throws InstantiationException, IllegalAccessException, ClassNotFoundException {

    Department dept = (Department)Class.forName(deptClass).newInstance();
    nameToDeptMap.put(empName, dept);
  }
}

那么您的Digester代碼就是您已經擁有的代碼:

  String xml = "<Company>"
      + "<Employee empname='xyz' department ='com.compnayname.departments.department.Development'/>"
      + "<Employee empname='xyza' department='com.compnayname.departments.department.Testing'/>"
      + "<Employee empname='xyzab' department='com.compnayname.departments.department.Requirements'/>"
      + "<Employee empname='xyzabc' department='com.compnayname.departments.department.Production'/>"
      + "</Company>";

  Digester digester = new Digester();
  digester.addObjectCreate("Company/Employee", Company.class);
  digester.addCallMethod("Company/Employee", "setComapnyConfigMap", 2);
  digester.addCallParam("Company/Employee", 0, "empname");
  digester.addCallParam("Company/Employee", 1, "department");

  Company c = digester.parse(new StringReader(xml));

如果要將員工映射到特定部門,請使摘要代碼相同,而只需更改Company.setComapnyConfigMap方法的內容。

(我使用的是JDK7 / Digester 3,但在JDK6 / Digester 2中應該沒問題)

干杯,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM