2010-11-12 2 views
2

У меня есть набор сложных типов в файле 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: Не существует полного функционального отображения между частицами.

Любые идеи о том, как я могу это сделать?

ответ

0

Если запрос IDResponse распространяется на Response, «complexType» должен быть «complexContent», а «ограничение» должно быть «расширением».

+0

"ComplexType" была опечатка, это действительно complexContent. Моя проблема в том, что, по моему мнению, «расширение» означает, что вы добавляете * к существующим полям, а «ограничение» означает, что вы * меняете * их. Я хочу изменить поля, чтобы использовать «подклассы», а не оригинальные, более широкие определения. Я просто не уверен, что это возможно. – Daniel

+0

Неясно, какую иерархию классов вы пытаетесь описать в XSD. Возможно, диаграмма иерархии поможет сообщить о вашей проблеме. – vocaro

+0

Несомненно. Я добавлю его. – Daniel

5
+0

Большое спасибо за ссылки. К сожалению, ни одна из них, похоже, не справляется с этой конкретной ситуацией. Первая ссылка - это то, что я уже делаю сейчас. Второй - для глобальных элементов, а не типов. И третий концентрируется на генерации XML с Java, а не наоборот. 8- ( – Daniel

Смежные вопросы