2017-02-13 5 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またはクローズド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; 
    } 
} 

必要に応じて、宣言時にObject型を指定し、型の解析またはデータ変換を指定します。私は、型が標準の解析可能な型であると仮定しているので、XMLパーサーで型に基づいて処理と格納を行うことができます。その後

String key, type, value; //from xml; 
ObjectWrapper object; 
if(type.contains("String")) { 
    object = new ObjectWrapper<String>(value); 
} 
else if(type.contains("Double")) { 
    object = new ObjectWrapper<Double>(Double.parseDouble(value)); 
} 

xmlObject.add(key, object); 

は、キーに基づいてオブジェクトを取得する、または標準のマップ機能を使用してキーマップを取得することができます。オブジェクトの型を取得するには、永続クラスを取得します。

関連する問題