Использование Digester для создания объектов Java из файла XML

Может ли кто-нибудь помочь мне создать Java-объект из приведенного ниже XML-файла с помощью Digester api.

У меня есть класс Компания имеет такую ​​карту

  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. 

person madhu_karnati    schedule 30.09.2014    source источник


Ответы (2)


Это НЕ то, для чего предназначен Digester:

«Многие проекты читают файлы конфигурации XML, чтобы обеспечить инициализацию различных объектов Java в системе. Есть несколько способов сделать это, и компонент Digester был разработан, чтобы обеспечить общую реализацию, которую можно использовать во многих различных проектах».

То, что вы пытаетесь сделать, гораздо проще выполнить с помощью чего-то вроде XStream или даже синтаксического анализа DOM (jdom или dom4j).

person Larry    schedule 30.09.2014
comment
@Larry: Я думаю, это именно то, для чего Digester предназначен: анализировать XML и запускать предоставленные или настраиваемые правила на основе сопоставления с образцом. Самый следующий абзац из того, что вы процитировали: По сути, пакет Digester позволяет вам настроить модуль сопоставления объектов XML -> Java, который запускает определенные действия, называемые правилами, всякий раз, когда распознается определенный шаблон вложенных элементов XML. Для вашего использования доступен богатый набор предопределенных правил, или вы также можете создать свои собственные. - person Barney; 11.10.2014
comment
Многие проекты читают файлы конфигурации XML, чтобы обеспечить инициализацию различных объектов Java в системе. Есть несколько способов сделать это, и компонент Digester был разработан, чтобы обеспечить общую реализацию, которую можно использовать во многих различных проектах. - person Larry; 12.10.2014
comment
Достаточно справедливо - если вы решите, что хотите использовать Digester только для файлов конфигурации, не беспокойтесь. Лично я использую инструменты, облегчающие мою работу, независимо от того, для чего они изначально предназначались или не предназначались, и часто использую Digester для всех видов отображений XML → Java. И я думаю, что Digester идеально подходит для этого варианта использования, о чем свидетельствует простота решения. - person Barney; 14.10.2014

Я не совсем понимаю, чего вы здесь пытаетесь достичь: вам нужно создать новый экземпляр отдела для каждого сотрудника или вы пытаетесь сопоставить идентификаторы сотрудников с существующими отделами?

В любом случае, есть много способов сделать это с помощью 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 все должно быть в порядке)

Ваше здоровье,

person Barney    schedule 11.10.2014