2017-02-13 34 views
1

У меня есть XML-файл со следующей структурой:Как создать класс и объект из xml в полете?

<object type="People"> 
    <field id="name" type="class java.lang.String" value="Ivan"/> 
    <field id="age" type="class java.lang.Integer" value="23"/> 
    <field id="salary" type="class java.lang.Double" value="50.0"/> 
</object> 

Но тип объекта, и поля могут быть различны.

Например:

<object type="Worker"> 
    <field id="lastName" type="class java.lang.String" value="Ivan"/> 
    <field id="height" type="double" value="170.00"/> 
    <field id="salary" type="double" value="50.0"/> 
</object> 

Можно ли создать объект из XML с неизвестным полем?

+0

По-разному, вы имеете в виду, что вы полностью отличаетесь или будете «Люди» всегда выглядят так? И тогда у вас может быть что-то вроде «Животных», которые будут иметь связанные с животными вещи. И этот открытый или закрытый XML, как вы могли бы получить неожиданный тип «Автомобили» по дороге, или вы уже знаете все типы? – Compass

+0

Я не знаю всех типов. XML может различаться следующим образом:

ответ

1

Когда жизнь дает вам гибкие объекты, обертка - ваш друг.

Ваш «XmlObject» идеально будет выглядеть так.

public class XmlObject { 
    final String type; 
    Map<String, ObjectWrapper> map = new Map<>(); 

    public XmlObject(String type) { 
     this.type = type; 
    } 

    public void put(String key, ObjectWrapper object) { 
     map.add(key, object); 
    } 

    public ObjectWrapper get(String key) { 
     return map.get(key); 
    } 
} 

Затем ваша обертка использует Generics с возможностью возврата типа класса.

public class ObjectWrapper<T> { 

    private T value; 

    public ObjectWrapper (T value) { 
     this.value = value; 
    } 

    //from http://stackoverflow.com/a/8019188/2958086 
    public Class<T> getPersistentClass() { 
     if (persistentClass == null) { 
      this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
     } 
     return persistentClass; 
    } 
} 

Вы обеспечиваете тип объекта при объявлении, а также любого рода типа синтаксического анализа или преобразования данных, если это необходимо. Я предполагаю, что типы являются стандартными разборными типами, поэтому вы можете в процессе XML-анализатора обрабатывать и хранить на основе типа.

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