如何从相互引用的XML标记创建Java对象?
我有一个XML,它的标签对应于三种类型的Java对象,这些对象将从XML中创建。对象的形式如下:如何从相互引用的XML标记创建Java对象?,java,xml,spring,jaxb,jibx,Java,Xml,Spring,Jaxb,Jibx,我有一个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 A -静态地图 -字符串名 -字
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
A
-静态地图
-字符串名
-字符串aInfo1
-字符串aInfo2
B
-静态地图
-字符串名
-字符串bInfo1
-字符串bInfo2
C
-对象
-B对象
现在,在我的XML中,我为a对象和B对象定义了一个标记列表,然后我为C对象定义了标记,这些对象使用名称字段引用a和B对象。
我有两个要求:
D
- Map<A, E>
D
-地图
我将定义与web.xml中定义servlet类似的E对象,即首先定义E类的名称和类,然后在其他地方使用E的名称。此外,传递参数以实例化对象。标签看起来像:
<E>
<name>queryProcessor</name>
<class>com.mydomain.QueryProcessor</class>
</E>
查询处理器
com.mydomain.QueryProcessor
现在,在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对象。- 使用XSD指定正确的XML格式
- 生成JAXB类
看起来你在发明轮子。看看Spring,看看它是否适合您的需要。如果没有,请解释原因。根据您的描述,这可以通过一个公共框架(如Spring)来实现,可以通过更改XML或生成一个XSTL来从XML创建Spring XML配置文件 可能足够让你开始了。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: 它是一个很好的库,可以在XML之间封送和解封对象,并且不做其他事情(与Spring不同)。如中的示例所示,您可以轻松地从XML加载对象,如下所示:
Person newJoe = (Person)xstream.fromXML(xml);
为了让XStream理解您的XML,您需要设置一些别名,如所述
单靠XStream无法完全解决您的问题,主要是因为有两个静态映射。但是,您可以让XStream从XML中加载As和Bs的列表,然后从列表中构建这两个映射
对于引用A和B的对象C,您可以阅读以下有关对象引用的教程:。如果它不适合您的需要,您总是可以轻松地构建另一个类,使用XStream从XML中读取必要的信息,如
public class CInfo {
public String aName;
public String bName
}
并使用CInfo构造C实例。假设您已经有了A和B的名称到实例的映射,那么它将是微不足道的。关于那个XML有多大?(如果它小于20MB,你可以使用比它大时更简单的结构)不幸的是,“静态”不能很好地转换为XML。它非常小,将填充大约10到20个a和B对象,以及大约20到25个C对象。我想对于这样一个简单的结构来说,使用XPath并填充对象要简单得多。我同意,但这只是一个开始。随着XML的发展,还会出现很多其他复杂的情况。我希望能找到一种方法,在处理其余部分的同时,在几个地方连接一些逻辑。静态映射需要使用它们的名称来查找类型a的对象。这对于填充其他对象(如C和D)非常有用。您可能需要某种类型的单例,但在大多数情况下,静态映射迟早会让您遇到问题。我如何使用JAXB初始化E类型的类?如果您想读取XML,请使用解组器:仅读取XML并不是我想要的。正如我在问题中提到的,我需要阅读XML并以一种非常具体的方式填充我的对象。JAXB可以做到这一点吗?如何通过Spring做到这一点?我的XML中需要做哪些更改。如果需要,我可以完全更改XML格式。我将在答案中添加一个示例,将A、B、C、D、E的每个实例定义为spring定义中的bean,并注入适当的值。您可以随心所欲地管理结构,甚至可以填充地图!听起来很奇怪,你怎么能