[英]How to create Java objects from XML tags which are referring each other?
我有一个XML,该XML的标签与将从XML创建的三种Java对象类型相对应。 对象具有以下形式:
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对象。 我有两个要求:
我已经阅读了一些Java框架(例如JAXB),但是我无法提出一种从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中Map的内容时使用
<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的对象A来填充。
(如果您熟悉JAXB批注并想用Java而不是XSD控制接口,则也可以采用其他方法。)
注意:静态地图很可能不是您想要使用的。 如果您对要解决的问题有更多的解释,我们也许可以为您指出一些其他方法
编辑:
您在谈论XML的格式吗? 还是为什么我根本需要XML? 我需要XML,以便能够在Java之外配置我的应用程序。
看来您是在重新发明轮子。 看看Spring,看看它是否符合您的需求。 如果不是,请说明原因。
根据您的描述,可以通过更改XML或生成XSTL来使用XML之类的通用框架来完成,该XML可以从XML创建一个Spring XML配置文件。
Spring Core文档可能足以让您入门。 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,创建并存储所有带有其名称的对象,并记住一个“连接”列表。 创建所有对象之后,在连接列表中执行所有连接。
也许您想看看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 。 如果不满足您的需要,您总是可以轻松地构建另一个Class来使用XStream从XML读取必要的信息,例如
public class CInfo {
public String aName;
public String bName
}
并使用CInfo构造C实例。 鉴于您已经有了A和B实例映射的名称,这将是微不足道的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.