我有一个XML,它的标签对应于三种类型的Java对象,这些对象将从XML创建。对象的格式为:
A
- static Map<String, A>
- String name
- String aInfo1
- String aInfo2
B
- static Map<String, B>
- String name
- String bInfo1
- String bInfo2
C
- A aObject
- B bObject
现在,在我的XML中,我为A对象和B对象定义了一个标签列表,然后我为C对象定义了标签,这些对象使用name字段引用A和B对象。 我有两个要求:
我已经阅读了一些像JAXB这样的Java框架,但是我无法想出一种从XML创建这种类型的对象的方法。 Java中是否有一个可以开箱即用或者逻辑最少的框架?
编辑:
还有另一项要求: 我需要定义表单的D和E对象
D
- Map<A, E>
我将定义E对象,类似于在web.xml中定义servlet的方式,即首先定义E类的名称和类,然后在其他地方使用E的名称。另外,传递参数以实例化E对象。标签看起来像:
<E>
<name>queryProcessor</name>
<class>com.mydomain.QueryProcessor</class>
</E>
现在,这将在定义D的地图内容时使用
<D>
<map>
<A>name_of_some_A_object</A>
<E name="queryProcessor">
<param1>name_of_some_B_object</param1>
<param2>name_of_some_B_object</param2>
</E>
<A>name_of_some_A_object</A>
<E name="queryProcessor">
<param1>name_of_some_B_object</param1>
<param2>name_of_some_B_object</param2>
</E>
</map>
</D>
本质上,D中的映射将通过实例化一个基类型E的类来填充,其中传递给它的参数和一个A的对象,由其名称引用。
答案 0 :(得分:3)
(如果您熟悉JAXB注释并希望使用Java而不是XSD控制接口,那么您也可以反过来这样做。)
注意:静态地图很可能不是您想要使用的。如果您解释更多关于您想要解决的问题,我们可能会指出一些替代方法
编辑:
您在谈论XML的格式吗?或者为什么我需要XML呢?我需要XML才能使我的应用程序在Java之外进行配置。
看起来你正在重新发明轮子。看看Spring,看看它是否符合您的需求。如果没有,请解释原因。
答案 1 :(得分:1)
根据您的描述,可以使用Spring之类的通用框架来完成,可以通过更改XML或生成XSTL来创建XML XML配置文件。
Spring Core documentation可能足以让你入门。 XML的一个例子是
<bean id="beanOneId" class="the.bean.Class">
<property name="someProperty" value="staticValue">
<property name="someOtherProperty" ref="beanTwoId">
</bean>
<bean id="beanTwoId" class="the.otherbean.Class">
<property name="someOtherProperty" ref="beanOneId">
<property name="someOtherProperty" ref="beanThreeId">
</bean>
但你所描述的不应该用反思太难。假设其他对象都不需要构造函数中的引用(而是作为setX),我将首先扫描xml,创建并存储所有对象及其名称,然后记住一个“连接”列表。创建所有对象后,请在连接列表中执行所有连接。
答案 2 :(得分:1)
也许你想看看XStream:http://x-stream.github.io/
这是一个很好的库,可以将对象与XML进行编组和解组,并且不做任何事情(与Spring不同)。与http://x-stream.github.io/tutorial.html中的示例类似,您可以像以下一样轻松地从XML加载对象:
Person newJoe = (Person)xstream.fromXML(xml);
为了让XStream理解您的XML,您需要设置一些别名,如http://x-stream.github.io/alias-tutorial.html所述。
单独的XStream无法完全解决您的问题,主要是由于两个静态地图。但是,您可以让XStream从XML加载As和B的列表,然后从列表中构建两个映射。
对于引用A和B的对象C,您可以阅读以下有关对象引用的教程:http://x-stream.github.io/graphs.html。如果它不符合您的需要,您可以使用XStream轻松地构建另一个类以从XML读取必要的信息,例如
public class CInfo {
public String aName;
public String bName
}
使用CInfo构造C实例。鉴于你已经有了A和B实例图的名称,这将是微不足道的。