5

我有一个 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 对象定义了标签,这些标签使用那里的名称字段引用 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 的对象,由其名称引用。

4

3 回答 3

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

(如果您熟悉 JAXB 注释并希望使用 Java 而不是 XSD 来控制接口,也可以反过来做)。

注意:静态地图很可能不是您想要使用的。如果您详细说明您要解决的问题,我们可能会为您指出一些替代方法

编辑:

您是在谈论 XML 的格式吗?或者为什么我需要 XML?我需要 XML 才能使我的应用程序在 Java 之外可配置。

看起来你正在重新发明轮子。看看 Spring,看看它是否符合您的需求。如果不是,请解释原因。

于 2011-12-02T16:14:43.633 回答
1

根据您的描述,这可以使用 Spring 等通用框架来完成,可以通过更改 XML 或生成 XSTL 来从 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 开始,创建并存储所有对象及其名称并记住“连接”列表,以便制作。创建所有对象后,执行连接列表中的所有连接。

于 2011-12-06T14:06:26.763 回答
1

也许你想看看 XStream:http: //x-stream.github.io/

它是一个很好的库,可以将对象编组和解组到 XML 和从 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 的实例映射的名称,这将是微不足道的。

于 2011-12-07T02:40:58.170 回答