【发布时间】:2010-02-22 05:15:41
【问题描述】:
我有一个 JAXB 类生成问题,希望能得到一些帮助。这是我的问题根源的 XML 部分...
<xs:complexType name="IDType">
<xs:choice minOccurs="0" maxOccurs="2">
<xs:element name="DriversLicense" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="SSN" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="CompanyID" minOccurs="0" maxOccurs="1" type="an..35" />
</xs:choice>
</xs:complexType>
<xs:simpleType name="an..35">
<xs:restriction base="an">
<xs:maxLength value="35" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="an">
<xs:restriction base="xs:string">
<xs:pattern value="[ !-~]*" />
</xs:restriction>
</xs:simpleType>
...现在这将生成 JAXBElement 类型,因为 choice 带有 maxOccurs > 1 。我想避免这些,所以我通过修改代码来使用“Wrapper”元素并将maxOccurs 移动到序列标签,如下所示......
<xs:complexType name="IDType">
<xs:sequence maxOccurs="2">
<xs:element name=Wrapper>
<xs:complexType>
<xs:choice>
<xs:element name="DriversLicense" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="SSN" minOccurs="0" maxOccurs="1" type="an..35" />
<xs:element name="CompanyID" minOccurs="0" maxOccurs="1" type="an..35" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="an..35">
<xs:restriction base="an">
<xs:maxLength value="35" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="an">
<xs:restriction base="xs:string">
<xs:pattern value="[ !-~]*" />
</xs:restriction>
</xs:simpleType>
对于类生成,看起来效果很好 - JAXB 元素被替换为 String 的包装器列表(即 List<IDType.Wrapper<String> )并且编译良好。
但是,当我将实际 XML 数据解组到生成的类中时,包装类中的数据不会被填充 - 但 JAXB 不会引发异常。
我的问题是:我是否需要以不同的方式更改架构才能使其正常工作?或者我可以在生成的代码或注释中添加/更改/删除什么?
【问题讨论】: