У меня есть набор сложных типов в файле XML-схемы. В основном у меня есть куча объектов «ответа». Каждый объект ответа следует одному и тому же общему формату, но более конкретным образом. Так, например:Использование XML-схем в качестве наследования OO (JAXB) - возможно?
<xsd:simpleType name="Transition">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
<xsd:complexType name="ResponseBlock"/>
<xsd:complexType name="Response">
<xsd:complexContent>
<xsd:sequence>
<xsd:element name="transition" type="dto:Transition"/>
<xsd:element name="data" type="dto:ResponseBlock"/>
</xsd:sequence>
</xsd:complexContent>
</xsd:complexType>
Я хотел бы, чтобы сделать возможным, чтобы иметь «подкласс» это где «переход» и «ResponseBlock» заменяются действительными «подклассы» каждый из этих типов. То есть Я уже получены их ограничения/расширения и хотите, чтобы включить их в ответ, который сам получен путем ограничения:
<xsd:simpleType name="IDTransition">
<xsd:restriction base="dto:Transition">
<xsd:enumeration value="NEXT_PAGE"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="IDResponseBlock">
<xsd:complexContent>
<xsd:extension base="dto:ResponseBlock">
<xsd:sequence>
<xsd:element type="xsd:int" name="userID"/>
<xsd:element type="xsd:string" name="userName"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="IDResponse">
<xsd:complexContent>
<xsd:restriction base="Response">
<xsd:sequence>
<xsd:element name="transition" type="dto:IDTransition"/>
<xsd:element name="data" type="dto:IDResponseBlock"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Таким образом, с помощью JAXB, я мог бы генерировать полностью объектно-ориентированную структуру наследования. Но он, похоже, не компилируется; Eclipse показывает ошибку:
вывод-ok-restriction.5.4.2: Ошибка для типа 'IDResponse'. Частица этого типа не является допустимым ограничением частицы основания. rcase-Recurse.2: Не существует полного функционального отображения между частицами.
Любые идеи о том, как я могу это сделать?
"ComplexType" была опечатка, это действительно complexContent. Моя проблема в том, что, по моему мнению, «расширение» означает, что вы добавляете * к существующим полям, а «ограничение» означает, что вы * меняете * их. Я хочу изменить поля, чтобы использовать «подклассы», а не оригинальные, более широкие определения. Я просто не уверен, что это возможно. – Daniel
Неясно, какую иерархию классов вы пытаетесь описать в XSD. Возможно, диаграмма иерархии поможет сообщить о вашей проблеме. – vocaro
Несомненно. Я добавлю его. – Daniel