JAXB如何决定在编组可以匹配这两种类型的XML时创建哪种类型?

时间:2014-09-06 17:12:00

标签: java xml jaxb

我有一个XML架构,其最顶层的元素是Document

<xsd:element name="Document" type="Document"/>

它包含一个ZZ_Customer类型的元素,它是Customer的限制。 这两个元素都包含相同名称但类型略有不同的子元素。

<xsd:complexType name="Document">
        <xsd:sequence>
            <xsd:element name="CstmrCdtTrfInitn" type="ZZ_Customer"/>
        </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ZZ_Customer">
    <xsd:complexContent>
        <xsd:restriction base="Customer">
                <xsd:sequence>
                    <xsd:element name="GrpHdr" type="ZZ_Group"/>
                    <xsd:element name="PmtInf" type="ZZ_Payment" maxOccurs="unbounded"/>                        
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="Customer">
        <xsd:sequence>
            <xsd:element name="GrpHdr" type="Group"/>
            <xsd:element name="PmtInf" type="Payment" maxOccurs="unbounded"/>
        </xsd:sequence>
</xsd:complexType>

当JAXB解组一个XML文件时,它会创建一个ZZ_Customer实例还是会创建一个Customer实例?同样,它何时会创建Group或ZZ_Group的实例?

我注意到JAXB将为XML的某些部分提供ZZ_ *实例,但是将其基本计数器部分用于XML的其他部分。

它以什么为基础做出决定? JAXB正在使用哪个标准似乎并不明显。

不幸的是,我无法控制架构及其设计。

1 个答案:

答案 0 :(得分:0)

由于Document具有与子类型对应的属性。 解组时将创建子类型。这是有道理的,因为在Java中,当属性被键入子类时,您无法在其上设置超类的实例。

如果属性对应于超类型,则默认情况下JAXB会将其解组为超类型的实例。 XML可以包含xsi:type属性,以指定正在使用子类型。