2014-12-10 2 views
1

У меня есть бизнес-кейс, в котором у меня будет около 10 различных pojo для отображения 10 разных входящих xml-файлов, т. Е. (Местоположение, продукт, заказ, элемент ....) Мне было интересно, если они это способ в JAXB настроить это. Может быть конфигурационным файлом для сопоставления xml-файла в нужном классе. поэтому мне не придется вводить логику в свой код, чтобы определить правильный классКонфигурация Jaxb во время выполнения

Спасибо!

ответ

0

Вы можете сделать что-то похожее на грубый пример, который я показал ниже, чтобы использовать файл для сопоставления классов с XML-файлами. Вам нужно будет адаптировать его в соответствии с вашими конкретными потребностями.

Я создал несколько очень простых классов провести некоторые примитивные типы данных для иллюстрации использования:

ClassOne:

package so27409179; 

@XmlRootElement(name="ClassOne") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassOne { 
    @XmlElement(name="Field") 
    String field; 

    public ClassOne() { 

    } 

    public String getField() { 
     return field; 
    } 

    public void setField(String field) { 
     this.field = field; 
    } 

    @Override 
    public String toString() { 
     return "ClassOne\n" + "\tField = " + getField(); 
    } 
} 

ClassTwo:

package so27409179; 

@XmlRootElement(name="ClassTwo") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassTwo { 
    @XmlElement(name="Field1") 
    String field1; 
    @XmlElement(name="Field2") 
    int field2; 
    @XmlElement(name="Field3") 
    double field3; 

    public ClassTwo() { 

    } 

    public String getField1() { 
     return field1; 
    } 

    public void setField1(String field1) { 
     this.field1 = field1; 
    } 

    public int getField2() { 
     return field2; 
    } 

    public void setField2(int field2) { 
     this.field2 = field2; 
    } 

    public double getField3() { 
     return field3; 
    } 

    public void setField3(double field3) { 
     this.field3 = field3; 
    } 

    @Override 
    public String toString() { 
     return "ClassTwo\n" + 
       "\tField1 = " + getField1() + 
       "\n\tField2 = " + getField2() + 
       "\n\tField3 = " + getField3(); 
    } 
} 

ClassThree:

package so27409179; 

@XmlRootElement(name = "ClassThree") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ClassThree { 
    @XmlElement(name="Field1") 
    String field1; 
    @XmlElement(name="Field2") 
    String field2; 

    public ClassThree() { 

    } 

    public String getField1() { 
     return field1; 
    } 

    public void setField1(String field1) { 
     this.field1 = field1; 
    } 

    public String getField2() { 
     return field2; 
    } 

    public void setField2(String field2) { 
     this.field2 = field2; 
    } 

    @Override 
    public String toString() { 
     return "ClassThree\n" + 
       "\tField1 = " + getField1() + 
       "\n\tField2 = " + getField2(); 
    } 
} 

Затем я создал простой файл сопоставления (с разделителями-запятой), который сопоставляет имена файлов именам классов. Я назвал этот файл mappings.txt:

XmlFile1.xml,so27409179.ClassOne 
XmlFile2.xml,so27409179.ClassTwo 
XmlFile3.xml,so27409179.ClassThree 

Затем я создал несколько фиктивных файлов XML, чтобы соответствовать отображениями:

XmlFile1.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ClassOne> 
    <Field>Some Class 1 Field Value</Field> 
</ClassOne> 

XmlFile2.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ClassTwo> 
    <Field1>Some Class 2 Field Value</Field1> 
    <Field2>100</Field2> 
    <Field3>12.34</Field3> 
</ClassTwo> 

XmlFile3.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ClassThree> 
    <Field1>Some Class 3 Field Value</Field1> 
    <Field2>Another Class 3 Field Value</Field2> 
</ClassThree> 

Затем я создал тестовый класс, который считывает этот файл и помещает имя файла и объект класса, соответствующее имя класса в Map, который вы можете использовать для любого вы хотите, а также распаковать данные и распечатать информацию, которую он прочитал

public class TestClassMapper { 
    public static void main(String[] args) { 
     Map<String,Class> classMap = new HashMap<String, Class>(); 

     try { 
      // reader for reading mapping file 
      BufferedReader reader = new BufferedReader(new FileReader("mappings.txt")); 

      String line; 
      // read each line in the file 
      while ((line = reader.readLine()) != null) { 
       // split the data 
       String[] parts = line.split(","); 
       String fileName = parts[0]; // file name 
       Class clazz = Class.forName(parts[1]); // class object 
       classMap.put(fileName, clazz); // you might want to do something with this later... 

       // unmarshal the data 
       JAXBContext context = JAXBContext.newInstance(clazz); 
       Unmarshaller u = context.createUnmarshaller(); 
       // generic object 
       Object o = u.unmarshal(new File(fileName)); 
       // print out the data received 
       System.out.println(o.toString()); 
      } 
     } 
     catch (Exception ex) { 

     } 
    } 
} 

наблюдается следующий вывод:

ClassOne 
    Field = Some Class 1 Field Value 
ClassTwo 
    Field1 = Some Class 2 Field Value 
    Field2 = 100 
    Field3 = 12.34 
ClassThree 
    Field1 = Some Class 3 Field Value 
    Field2 = Another Class 3 Field Value 

Удачи, надеюсь, это поможет.

+0

Отлично. Спасибо Райан Дж. Я попробую это. – user4347087

Смежные вопросы