我一直在做很多研究,试图解决这个问题,但是 仍然不成功。
我有许多遵循此架构的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,我能够 marshall / unmarshall 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>
Identity的值是Unmahalled到Simple_Identification对象而不是专用的Simple_S对象。此外,如果我编组回所有xsi:type属性在生成的XML中丢失。
所以,基本上,我的问题是如何正确地解组并生成包含xsi:types的XML。我正在使用的模式不适合这样做吗? xsd:restriction是不是被JAXB解释为一种继承?
请注意,XSD不是我要修改的,我只需要使用它们来正确读取和生成XML。
感谢您花时间帮我解决这个问题!
-Anca
答案 0 :(得分:0)
JAXB确实支持xsi:type
,但在处理复杂类型而不是简单类型时,您只会看到生成的不同子类(以及创建的实例对象)。
仅使用构面限制简单类型不会导致使用JAXB创建新类。这是因为,纯粹在面向对象的术语中,派生类看起来与超类完全相同。