Jaxb 基于具体实例的解组

Jaxb 基于具体实例的解组,jaxb,Jaxb,我是JaxB领域的新手,我面临一个问题:将存储的xml内容解组到java类对象中。问题描述如下。让我知道这是否可以解决 我的xsd文件包含以下内容(这只是一个示例) 学生信息 <xs:complexType name="specialization" abstract="true"> </xs:complexType> <xs:complexType name="Engineering"> <xs:compl

我是JaxB领域的新手,我面临一个问题:将存储的xml内容解组到java类对象中。问题描述如下。让我知道这是否可以解决 我的xsd文件包含以下内容(这只是一个示例) 学生信息

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>

现在,所有相应的java类都是通过编译xsd生成的。现在让我们假设在我的应用程序中,我将通过构造工程类实例来设置Student info的specialization属性。所以在所有的操作之后,当我保存 保存的xml文件将具有如下条目

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
<Student>
    <Name>Name1</Name>
    <Specialization>
        <percentage>78<percentage>
    </Specialization>
</Student>

名称1
78
现在,当上面的内容用于解组时,解组失败。我猜这是b'cos专门化元素的类型专门化,它调用自身的解组,而不是存储的派生对象

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
我希望我的解释清楚。是否有任何方法可以基于派生类实例类型来解组。xsd和bindings.xjb文件完全在我的控制之下,因此我可以添加或修改任何条目/信息,这些条目/信息传递给反汇编规则,以在派生类上反汇编

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>


谢谢你的建议,但这对我仍然不起作用

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
这是我试过的

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
选项#1-xsi:type
我的xsd看起来与示例中所解释的相同,但是Xsi:type仍然没有出现在结果xml中。编译时是否需要添加任何其他设置?对此,我应该使用哪个JaxB版本

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
选项2-替代组
当我在xsd中添加替换条目部分时,xsd编译无法说出重复的名称“Engineering”和“Medical”。我猜元素名和类型名是相同的编译框架(所有的工程、医学、专门化在类型定义和元素名上都是相同的)

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>

我不能修改生成的类,因为我们使用的是模型驱动的体系结构。唯一在手的是xsd。允许对xsd进行任何修改。理想情况下,第一种选择应该有效。但我不明白为什么它不起作用。如果您有缩小问题范围的建议,请告诉我。

在使用JAXB时,用XML表示Java继承有不同的方法:

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
选项#1-xsi:type

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
在此表示中,属性用于指示用于填充此元素的子类型

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>
<Student>
    <Name>Name1</Name>
    <Specialization xsi:type="Engineering">
        <percentage>78<percentage>
    </Specialization>
</Student>
有关详细示例,请参见:

    <xs:complexType name="specialization" abstract="true">
    </xs:complexType>


    <xs:complexType name="Engineering">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="percentage" type="xs:int" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Medical">
        <xs:complexContent>
            <xs:extension base="specialization">
                <xs:sequence>
                    <xs:element name="grade" type="xs:string" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
</xs:complexType>

谢谢你的建议,但它仍然不适合我。下面是我尝试的选项#1-xsi:type我的xsd看起来与示例中解释的相同,但xsi:type仍然没有出现在结果xml中。编译时是否需要添加任何其他设置?对于这个选项,我应该使用哪个JaxB版本?选项#2-替换组当我在xsd中添加替换条目部分时,xsd编译没有说出重复的名称“Engineering”和“Medical”。我猜元素名和类型名是相同的编译框架(所有的工程、医学、专业化在类型定义和元素名上都是相同的),我不能修改生成的类,因为我们使用的是模型驱动的体系结构。唯一在手的是xsd。允许对xsd进行任何修改。理想情况下,第一种选择应该有效。但我不明白为什么它不起作用。如果你有什么建议,请告诉我