在我的模式中,我有一些类型只是扩展一个简单的XSD类型(int或string)。 JAXB为每种类型创建一个单独的java类。我想删除此中间类并将JAXB配置为尽可能使用原语(例如,将CountryType
替换为java.lang.String
,将DocumentType
替换为int
或lava.lang.Integer
。例如,对于给定的XSD,最好有DestinationType.setDocumentType(int)
和List<String> StatesType.getCountry()
。我很乐意为此编写类型范围an adapter,但看起来只支持来自原始XML类型的转换。也许有可能进行每个属性的类型转换?请提供任何可以提供帮助的JAXB绑定自定义示例。
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:exch="http://www.mycompany.org/exchange"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
targetNamespace="http://www.mycompany.org/exchange"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<complexType name="countryType">
<simpleContent>
<extension base="string"/>
</simpleContent>
</complexType>
<complexType name="statesType">
<sequence maxOccurs="unbounded">
<element name="country" type="exch:countryType"/>
</sequence>
</complexType>
<complexType name="documentType">
<simpleContent>
<extension base="integer"/>
</simpleContent>
</complexType>
<complexType name="destinationType">
<sequence>
<element name="states" type="exch:statesType" maxOccurs="1"/>
<element name="document-type" type="exch:documentType" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
</schema>
答案 0 :(得分:2)
另一种可能性,您可以更改架构吗?:
以下架构更改将生成所需的对象模型。
使用:
<simpleType name="documentType">
<restriction base="integer"/>
</simpleType>
而不是:
<complexType name="documentType">
<simpleContent>
<extension base="integer"/>
</simpleContent>
</complexType>
答案 1 :(得分:0)
好问题。在过去,我通过XSLT预处理步骤运行模式解决了这个问题,“扁平化”了类型层次结构,同时保留了文档的语义。
例如,XSLT将删除documentType
类型的定义,并将documentType
的每个引用替换为integer
。生成的已处理模式仍然代表相同的实例文档,但更简单,并且可以实现更好的绑定。
这个(相当不完整的)解决方案可以应用于与过度复杂的模式有关的许多类似问题(例如,用选择结构替换替换组)。