2010-11-12 3 views
2

J'ai un ensemble de types complexes dans mon fichier de schéma XML. Fondamentalement, j'ai un tas d'objets "réponse". Chaque objet de réponse suit le même format général mais de manière plus spécifique. Ainsi, par exemple:Utilisation de schémas XML en tant qu'héritage OO (JAXB) - possible?

<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> 

Je voudrais permettre d'avoir une « sous-classe » de celui-ci où la « transition » et « ResponseBlock » sont remplacés par « valides » de sous-classes chacun de ces types. C'est à dire. Je les ai déjà obtenu par restriction/extension et vouloir les inclure dans une réponse qui est lui-même dérivé par restriction:

<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> 

De cette façon, en utilisant JAXB, je pourrais générer une structure d'héritage totalement orienté objet. Mais il ne semble pas compiler; Eclipse affiche une erreur:

derivation-ok-restriction.5.4.2: Erreur pour le type 'IDResponse'. La particule du type n'est pas une restriction valide de la particule de la base. rcase-Recurse.2: Il n'y a pas de correspondance fonctionnelle complète entre les particules.

Des idées sur comment je peux accomplir ceci?

Répondre

0

Si IDResponse étend la réponse, "complexType" doit être "complexContent" et "restriction" doit être "extension".

+0

"complexType" était une faute de frappe, il était en effet complexContent. Mon problème est que, à mon sens, "extension" signifie que vous * ajoutez * aux champs existants, tandis que "restriction" signifie que vous les * changez *. Je veux changer les champs pour utiliser des "sous-classes" plutôt que les définitions originales plus larges. Je ne suis pas sûr que ce soit possible. – Daniel

+0

Le type de hiérarchie de classe que vous essayez de décrire dans le XSD n'est pas clair. Peut-être qu'un diagramme de la hiérarchie aiderait à communiquer votre problème. – vocaro

+0

Bien sûr. Je vais l'ajouter. – Daniel

5
+0

Merci beaucoup pour les liens. Malheureusement, aucun d'entre eux ne semble aborder cette situation particulière. Le premier lien est essentiellement ce que je fais déjà maintenant. La seconde concerne les éléments globaux plutôt que les types. Et le troisième se concentre sur la génération de XML à partir de Java plutôt que vice versa. 8- ( – Daniel

Questions connexes