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

我有一个XML,它有与三种类型的Java对象相对应的标记,这些标记将从XML创建。 对象的forms如下:

A - static Map - String name - String aInfo1 - String aInfo2 B - static Map - 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对象。

我已经阅读了一些像JAXB这样的Java框架,但是我无法想出一种从我的XML创建这种类型的对象的方法。 Java中是否有一个可以开箱即用或者逻辑最少的框架?

编辑:

还有另一个要求:我需要定义表单的D和E对象

 D - Map 

我将定义类似于在web.xml中定义servlet的E对象,即首先定义E类的名称和类,然后在其他地方使用E的名称。 另外,传递参数以实例化E对象。 标签看起来像:

  queryProcessor com.mydomain.QueryProcessor  

现在,这将在定义D中的Map内容时使用

   name_of_some_A_object  name_of_some_B_object name_of_some_B_object  name_of_some_A_object  name_of_some_B_object name_of_some_B_object    

本质上,D中的映射将通过实例化一个基类型E的类来填充,其中传递给它的参数和由其名称引用的A的对象。

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

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

注意:静态地图很可能不是您想要使用的。 如果您解释更多关于您想要解决的问题,我们可能会指出一些替代方法

编辑:

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

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

根据您的描述,这可以通过一个常见的框架(如Spring)来完成,可以通过更改XML或生成XSTL来创建XML XML配置文件。

Spring Core文档可能足以让您入门。 XML的一个例子是

         

但你所描述的不应该用反思太难。 假设其他对象都不需要构造函数中的引用(而是作为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 。 如果它不适合您的需要,您可以随时轻松地构建另一个类,以使用XStream从XML读取必要的信息,例如

 public class CInfo { public String aName; public String bName } 

并使用CInfo构造C实例。 鉴于你已经有了A和B实例图的名称,这将是微不足道的。