Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Digester从XML文件创建Java对象_Java_Xml_Apache_Xml Parsing_Apache Commons Digester - Fatal编程技术网

使用Digester从XML文件创建Java对象

使用Digester从XML文件创建Java对象,java,xml,apache,xml-parsing,apache-commons-digester,Java,Xml,Apache,Xml Parsing,Apache Commons Digester,有人能帮我使用Digester api从下面的XML文件创建Java对象吗 我有一个班级公司有一张这样的地图 Map<String,Department> nameToDeptMap= new HashMap<String,Department>(); 这不是蒸煮器的目的: 许多项目读取XML配置文件以提供系统内各种Java对象的初始化。有几种方法可以做到这一点,Digester组件旨在提供一个通用的实现,可以在许多不同的项目中使用 使用诸如XStream甚至DOM

有人能帮我使用Digester api从下面的XML文件创建Java对象吗

我有一个班级公司有一张这样的地图

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

这不是蒸煮器的目的:

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


使用诸如XStream甚至DOM解析jdom或dom4j之类的工具,您想要做的事情要容易得多。

我不完全清楚您想要在这里实现什么:您需要为每个员工创建一个新的部门实例,还是要尝试将员工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);
  }
}
那么您的消化器代码就是您已经拥有的代码:

  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中应该可以


干杯,

@Larry:我想这正是Digester设计的目的:解析XML和触发器提供的或基于模式匹配的自定义规则。您引用的下一段:基本上,Digester包允许您配置一个XML->Java对象映射模块,每当识别到嵌套XML元素的特定模式时,该模块就会触发称为规则的特定操作。一组丰富的预定义规则可供您使用,您也可以创建自己的规则。许多项目读取XML配置文件以提供系统内各种Java对象的初始化。有几种方法可以做到这一点,Digester组件的设计目的是提供一个通用的实现,可以在许多不同的项目中使用。很公平-如果您决定只对配置文件使用Digester,那么就不用担心了。就我自己而言,我使用的工具使我的工作变得简单,而不管它们最初的用途是什么,并且经常使用Digester进行各种XML->Java映射。我认为Digester非常适合这个用例,解决方案的简单性就证明了这一点。
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));