我有一个具有以下结构的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创建对象?
当生活给你灵活的对象时,包装纸就是你的朋友。
理想情况下,您的"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);
}
}
然后,您的包装器使用泛型,并可以选择返回类类型。
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);
之后,您可以基于键获取对象,或使用标准映射函数获取键映射。若要获取对象的类型,可以获取其持久类。