2014-09-30 59 views
0

有人可以幫助我使用Digester API從下面的XML文件創建Java對象。使用Digester從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> 

當Map加載時,我會通過「empname」來獲取部門對象。

如果你想知道我在做什麼,請參閱下面的代碼。我知道這是錯誤的。

我的Java文件是這樣的..

我能寫沼氣池規則,以獲得從XML文件作爲字符串的值,但不知道怎麼弄的對象。

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. 

回答

0

這不是沼氣池打算做:

「很多項目讀取XML配置文件在系統內提供各種Java對象的初始化有這樣做的幾種方法,以及沼氣池組件旨在提供可用於許多不同項目的通用實現。「

你想要做的事情是使用XStream甚至DOM解析(jdom或dom4j)這樣的東西來實現更容易。

+0

確定。感謝您的迴應。等着瞧。 – 2014-09-30 17:13:30

+0

@Larry:我認爲這正是Digester設計的目標:解析XML並根據模式匹配觸發提供的或自定義的規則。您引用的那一段的下一段: 「基本上,Digester包允許您配置一個XML - > Java對象映射模塊,只要識別出嵌套的XML元素的特定模式,就會觸發某些稱爲規則的操作。的預定義規則可供您使用,或者您也可以創建自己的規則。「 – Barney 2014-10-11 10:25:44

+0

」許多項目讀取** XML配置文件**以提供系統內各種Java對象的初始化。有幾種方法可以做到這一點,而Digester組件旨在提供一個可用於許多不同項目的通用實現。「 – Larry 2014-10-12 11:32:55

0

我不完全清楚你想在這裏實現什麼:你是否需要爲每個員工創建一個新的Department實例,或者你是否試圖將員工id映射到現有部門?無論採用哪種方式,都有很多方法可以與Digester一起完成此操作,但如果您是Digester的新手,最簡單的方法就是更新您的setComapnyConfigMap方法以接受字符串參數,然後在其中執行whaatever。例如,要創建特定的部門子類的新實例爲每個員工:

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

那麼你的沼氣池代碼是因爲你已經擁有了它:

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 /沼氣池3,但它應該是在JDK6 /沼氣池2罰款)

乾杯,