JAXB Liste de Choix
J'ai schéma suivant
<complexType name="BookShelf">
<sequence>
<element name="newBook" type="string" minOccurs="0" maxOccurs="unbounded"/>
<element name="oldBook" type="string" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
XJC génère Bibliothèque de classe avec deux listes, une pour les newBook et un pour oldBook. Excellent!
Maintenant, je veux des livres à apparaître dans n'importe quel ordre. J'ai donc réécrire mon schéma:
<complexType name="BookShelf">
<sequence>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="newBook" type="string"/>
<element name="oldBook" type="string"/>
</choice>
</sequence>
</complexType>
Mais maintenant XJC génère Étagère avec une seule liste newBookOrOldBook de type List<JAXBElement<String>>
.
Je ne se soucient pas de l'ordre dans lequel les livres apparaissent et je veux permettre enregistreur XML pour spécifier les livres dans l'ordre qu'il\elle le souhaite, mais je veux encore des livres de chaque type de Liste générée Bibliothèque de classe. Est il possible que je peux réaliser ceci?
Précision: vous voulez la même classe que dans le premier exemple, mais en utilisant le schéma dans l'exemple de deux? (et bien sûr, les listes peuvent être de longueurs différentes)
Aussi, quelque chose qui est arrivé à votre syntaxe à la "Liste>" - vous avez sans doute laissé de côté ` pour échapper à code en ligne.
Aussi, quelque chose qui est arrivé à votre syntaxe à la "Liste>" - vous avez sans doute laissé de côté ` pour échapper à code en ligne.
OriginalL'auteur olek | 2009-05-20
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le Simplifier plugin de JAXB2 Bases. Il permet de simplifier
@XmlElements
et@XmlElementRefs
propriétés, ce qui rend les choses beaucoup plus facile, si vous n'avez pas vraiment à l'ordre. Voici un exemple (extrait de la documentation):Considérer le choix suivant:
Ce sera normalement générer une propriété comme:
Vous pouvez utiliser le
simplify:as-element-property
élément de remodeler cette propriété complexe que les deux propriétés de l'élément ousimplify:as-reference-property
que les deux propriétés de référence.Pas que, dans le cas d'une référence à la propriété, vous devez personnaliser l'un des
xs:element
et pas lexs:choice
.Résultats dans:
OriginalL'auteur lexicore
Peut-être quelque chose comme ça?
Bien sûr, vous pourriez simplifier à
Vous pouvez avoir un overconstrained problème, je pense. Je ne sais pas beaucoup sur JAXB et la possibilité de la forme de l'objet modèle généré à partir du fichier XSD. Distinguer les données de même type par le nom de l'élément lui seul, a besoin de votre programme à appeler getName(). Si vous modifiez la forme du schéma, vous pouvez utiliser <livre name="bookname" type="nouvelle" />, dans ce cas, vous n'auriez pas à appeler getName(). Au lieu de cela, vous auriez un autre modèle d'objet. Ou vous pouvez spécifier de nouvelles complexTypes pour newBook et oldBook, comme dans mon premier exemple de schéma. C'est à vous.
OriginalL'auteur Cheeso
Je ne pense pas que ce soit possible dans JAXB, sans écrire de coutume, java ou XSLT.
JAXB n'est pas très bon à la correspondance entre les objets et le langage xml qui ont une structure différente, comme la vôtre. Aussi, la commande du livre ancien à l'égard des nouveaux livres en XML serait perdue lors de la conversion de deux listes distinctes en Java, et JAXB généralement veut conserver l'information.
Ce qui suit ne pas répondre à votre question, mais c'est peut-être une étape vers ce que vous voulez:
Je n'ai pas essayé cela avec JAXB, mais je pense qu'il va générer un liste d'un classe avec deux champs, newBook et oldBook. Donc, vous n'avez pas de jeter ou de les utiliser instanceof, mais peut simplement vérifier la valeur null pour voir lequel c'est. Comme je l'ai dit, c'est pas une solution, mais peut-être un peu plus près.
OriginalL'auteur 13ren
Je pense que je dois refuser l'idée de mélanger des listes d'éléments différents dans un seul élément (mélange de vieux et de nouveaux livres sur un bookself), surtout parce que j'ai l'intention de listes de référence de ces éléments (nouveaux et de vieux livres de listes) dans d'autres éléments. Si je ne le fait pas, il est rapidement devenu un cauchemar dans du code java. J'ai fini avec le schéma suivant:
Merci à tous de m'aider à réaliser cela. Ce schéma sera plus clair et plus simple de code Java ainsi que plus lisible et prévisible document XML.
OriginalL'auteur olek