我一直在进行大量的研究,试图弄清楚这一点,但是 仍然不成功。JAXB2 map xsd:限制作为子类和(un)marshall xsi:类型
我有一些XSD的遵循此模式:
Simple_Identification.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="./Base_3039.xsd"/>
<xsd:include schemaLocation="./Simple_A.xsd"/>
<xsd:include schemaLocation="./Simple_S.xsd"/>
<xsd:include schemaLocation="./Simple_N.xsd"/>
<xsd:include schemaLocation="./Simple_V1.xsd"/>
<xsd:include schemaLocation="./Simple_L.xsd"/>
<xsd:include schemaLocation="./Simple_V.xsd"/>
<xsd:include schemaLocation="./Simple_C.xsd"/>
<xsd:simpleType name="Simple_Identification">
<xsd:restriction base="Base_3039"/>
</xsd:simpleType>
</xsd:schema>
其中,例如Simple_S.xsd看起来是这样的:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="./Simple_Identification.xsd"/>
<xsd:simpleType name="Simple_S">
<xsd:restriction base="Simple_Identification">
<xsd:minLength value="14"/>
<xsd:maxLength value="14"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
最终,我希望能够生成包含的XML文件 标签看起来像这样:
<Identification xsi:type="Simple_S">XYZUVW</Identification>
目前,而不启用mapSimpleTypeDef,我能够 马歇尔/和解组XML文件,忽略了简单的类型,如Simple_S。
启用mapSimpleTypeDef类后,将为简单的 类型生成类。 Simple_Identification被映射到包含Base_3039字段的类。 Base_3039类包含一个String字段。但是,Simple_Identifications的不同子类的类不会扩展Simple_Identification,但只包含Simple_Identification类型的字段,在编组/解组时不起作用。
例如,解组此XML文件时:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
<Identification>EDS-200708021031-950012222329</Identification>
<Time>2007-08-02T10:31:44.449+01:00</Time>
<Function>9</Function>
<Sender>
<Identity xsi:type="Simple_S">111111380002111</Identity>
</Sender>
</Header>
认同的价值是unmashalled到Simple_Identification对象不是一个专门的Simple_S对象。而且,如果我收回所有xsi:type属性,则会在生成的XML中丢失。
所以,基本上,我的问题是我该如何正确解组并生成包含xsi:types的XML。我正在使用的模式不适合做这个吗?是否将xsd:restriction解释为JAXB的继承类型?
请注意,XSD不是我的修改,我只需要与他们合作来正确地读取和生成XML。
感谢您花时间帮我弄清楚这一点!
-Anca
嗨xcut-感谢您的回答,它使事情变得更加清晰。在这种情况下,我猜想,仅仅基于我拥有的XSD,我无法生成类似上述示例的XML文件。 为了能够生成包含xsi:types的东西,我正在考虑使用JDOM来构造XML,然后根据模式进行验证。 你有更好的建议吗? – Anca 2011-05-19 14:54:56