繁体   English   中英

如何从相互引用的XML标签创建Java对象?

[英]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对象。 我有两个要求:

  1. 从XML读取A和B对象的同时,在A和B中填充静态映射。 这些映射将分别包含A.name到A和B.name到B的映射。
  2. 通过从XML标记读取A.name和B.name,然后使用A和B对象中定义的映射来填充C对象。

我已经阅读了一些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来填充。

  • 使用XSD指定正确的XML格式
  • 生成JAXB类

(如果您熟悉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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM