J'utilise JAXB pour lier XML à Java pour une application que j'écris. Je un élément appelé mesure qui contient deux quantité éléments appelés quantité et MaxAmount, dont je veux modéliser une limite inférieure et une valeur limite supérieure. montant et maxAmount sont par ailleurs identiques et je voudrais qu'ils soient mis en œuvre avec la même classe lors d'unmarshalled en Java.contrôlant les noms de classe générés par JAXB pour xsd: attributeGroup?
Ce qui suit est un extrait du schéma XML que je nourris à JAXB:
<xsd:attributeGroup name="AmountAttributes">
<xsd:attribute name="quantity" type="xsd:decimal"/>
<xsd:attribute name="numerator" type="xsd:nonNegativeInteger"/>
<xsd:attribute name="denominator" type="xsd:positiveInteger"/>
</xsd:attributeGroup>
<xsd:element name="measure">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="0" name="amount">
<xsd:complexType>
<xsd:attributeGroup ref="mpr:AmountAttributes"/>
</xsd:complexType>
</xsd:element>
<xsd:element minOccurs="0" name="maxAmount">
<xsd:complexType>
<xsd:attributeGroup ref="mpr:AmountAttributes"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
JAXB crée à partir de cette version plus élaborée des éléments suivants:
public class Measure {
protected Measure.Amount amount;
protected Measure.MaxAmount maxAmount;
public static class Measure.Amount {}
public static class Measure.MaxAmount {}
}
Measure.Amount et Measure.MaxAmount sont identiques à l'exception de leurs noms, mais - bien sûr - en ce qui concerne Java, ils ont peu à faire les uns avec les autres.
est-il un moyen de faire JAXB utiliser la même classe pour les deux quantité et MaxAmount?
Juste pour être complètement propre ;-) Je devrais mentionner que je génère le schéma XML à partir de RNC en utilisant Trang. Si la réponse à la question est "changer le schéma XML", j'ai la question supplémentaire "comment puis-je changer le RNC pour produire ce schéma XML?". Mon RNC ressemble à ceci:
AmountAttributes =
QuantityAttribute?
& attribute numerator { xsd:nonNegativeInteger }?
& attribute denominator { xsd:positiveInteger }?
QuantityAttribute = attribute quantity { xsd:decimal }
Measure =
element measure {
element amount { AmountAttributes }?,
element maxAmount { AmountAttributes }?
}+
J'utilise parce que je trouve RNC plus simple à comprendre, mais si la solution à mon problème signifie simplement à l'aide du schéma XML, soit.
Steve
Merci pour votre collaboration. Il semble que je me soit heurté à une limitation de RNC ou à une limitation de ma connaissance de RNC. Je vais devoir envisager de migrer vers XSD, je suppose. –
Je suis sûr que vous pourriez contourner cette incompatibilité d'impédance RNC <-> XSD en écrivant un plugin de compilateur de schéma, mais je crains que ce serait une lutte difficile. Bonne chance pour votre projet. – JesperSM