有人可以帮我使用Digester api从下面的XML文件创建Java Object。
我有一个班级公司有这样的地图
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文件是这样的..
我能够编写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.
答案 0 :(得分:0)
这不是Digester的目的:
&#34;许多项目读取XML配置文件以提供系统内各种Java对象的初始化。有几种方法可以做到这一点,Digester组件旨在提供可以在许多不同项目中使用的通用实现。&#34;
使用XStream甚至DOM解析(jdom或dom4j)之类的东西,可以更容易地完成你想要做的事情。
答案 1 :(得分:0)
我并不完全清楚您要在这里实现的目标:您是否需要为每位员工创建一个新的部门实例,或者您是否尝试将员工ID映射到现有部门?
无论哪种方式,使用Digester有很多方法可以做到这一点,但如果你是Digester的新手,也许最简单的方法就是更新你的setComapnyConfigMap方法来接受字符串参数,并在那里做你需要的whaatever。例如,要为每个员工创建特定Department子类的新实例:
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中应该没问题)
干杯,