我有一个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正在使用哪个标准似乎并不明显。
不幸的是,我无法控制架构及其设计。
答案 0 :(得分:0)
由于Document
具有与子类型对应的属性。
解组时将创建子类型。这是有道理的,因为在Java中,当属性被键入子类时,您无法在其上设置超类的实例。
如果属性对应于超类型,则默认情况下JAXB会将其解组为超类型的实例。 XML可以包含xsi:type
属性,以指定正在使用子类型。