0

有人可以帮助我使用 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 文件中的值作为字符串获取,但不知道如何作为对象获取。

    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. 
4

2 回答 2

0

这不是 Digester 的意图:

“许多项目读取 XML 配置文件以提供系统内各种 Java 对象的初始化。有几种方法可以做到这一点,而 Digester 组件旨在提供可用于许多不同项目的通用实现。”

您尝试使用 XStream 甚至 DOM 解析(jdom 或 dom4j)之类的东西更容易完成。

于 2014-09-30T16:13:15.357 回答
0

我不完全清楚您要在这里实现什么:您是否需要为每个员工创建一个新的部门实例,或者您是否尝试将员工 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 中应该没问题)

干杯,

于 2014-10-11T10:24:17.940 回答