Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从相互引用的XML标记创建Java对象?_Java_Xml_Spring_Jaxb_Jibx - Fatal编程技术网

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

如何从相互引用的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 -静态地图 -字符串名 -字

我有一个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
-静态地图
-字符串名
-字符串aInfo1
-字符串aInfo2
B
-静态地图
-字符串名
-字符串bInfo1
-字符串bInfo2
C
-对象
-B对象
现在,在我的XML中,我为a对象和B对象定义了一个标记列表,然后我为C对象定义了标记,这些对象使用名称字段引用a和B对象。 我有两个要求:

  • 从XMLs读取A和B对象时,在A和B中填充静态映射。映射将分别包含a.name到a和B.name到B的映射
  • 通过从XML标记中读取A.name和B.name,然后使用在A和B对象中定义的映射来填充C对象
  • 我读过一些Java框架,比如JAXB,但我无法想出一种从XML创建此类对象的方法。Java中是否有一个框架可以开箱即用或用最少的逻辑实现这一点

    编辑:

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

    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类
    (如果您熟悉JAXB注释,并且希望使用Java而不是XSD控制接口,那么您也可以用另一种方法来实现)

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

    编辑:

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


    看起来你在发明轮子。看看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,并注入适当的值。您可以随心所欲地管理结构,甚至可以填充地图!听起来很奇怪,你怎么能