2012-04-13 6 views
2

Nach diesem ähnlichen question gestern habe ich eine andere Frage bezüglich der Vererbung in XML-Schema und XJC-Bindungen.XJC Java Klassengeneration für <xs:choice> Element, das nicht unbegrenzt ist

Gegeben das folgende Auswahlelement, so dass Book und Journal einen gemeinsamen übergeordneten Typ haben (Publication).

<xsd:choice > 
    <xsd:element name="Book" type="Book" /> 
    <xsd:element name="Journal" type="Journal" /> 
</xsd:choice> 

Die Java-Klasse Eigenschaften, die erzeugt werden, sind wie:

private Book book; 
private Journal journal; 

Da <xsd:choice> bedeutet, dass es sein könnte entweder ein Book oder ein Journal I

private Publication bookOrJournal; 

bevorzugen würde, wenn ich hatte eine Liste von Publikationen durch Setzen maxOccurs="unbounded" in der Wahl-Element, würde es so funktionieren und ich würde

bekommen
private List<Publication> bookOrJournal; 

Wie erreicht man dies mit einer Nicht-Sammeleigenschaft?

Antwort

5

Sie können dazu die folgenden XJC binding verwenden.

<xs:complexType name="myClass"> 
    <xs:sequence> 
    <xs:choice> 
     <xs:annotation> 
     <xs:appinfo> 
      <jaxb:property name="bookOrJournal"/> 
     </xs:appinfo> 
     </xs:annotation> 
     <xs:element name="Book" type="Book"/> 
     <xs:element name="Journal" type="Journal"/> 
    </xs:choice> 
    </xs:sequence> 
</xs:complexType> 

Nach xjc <XSD File> -extension Ausführung erzeugt dies die folgende Java-Klasse für mich.

@XmlElements({ 
    @XmlElement(name = "Book", type = Book.class), 
    @XmlElement(name = "Journal", type = Journal.class) 
}) 
protected Publication bookOrJournal; 

Um die XJC-Bindung zu verwenden, habe ich oben auf meiner XSD hinzugefügt.

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:version="1.0" jaxb:extensionBindingPrefixes="xjc"> 
+0

Natürlich können diese XJC-Anweisungen auch extern in der XSD in ihrer eigenen Datei gespeichert werden, was eine klarere Trennung der Probleme darstellt. –

+0

Entschuldigung, das hat nicht wie erwartet funktioniert. Wenn Sie kommentieren, wie Sie es taten, bekomme ich einen XJC-Fehler, dass XJC diese Anpassung nicht berücksichtigen konnte, weil sie inkonsistent oder nicht dem richtigen Element zugewiesen ist (kann den Fehler nicht angeben, weil mein XJC deutsch zu sprechen scheint ;-)). Wenn ich die Anmerkung z. Das Book-Element als nur die Book-Eigenschaft wird in 'publication' umbenannt, aber es gibt noch zwei Eigenschaften,' publication' und 'journal'. – rainer198

+0

@ rainer198 Ich habe die vollständige XSD-Definition hinzugefügt, die ich verwendet habe. Sehen Sie, ob Sie damit Ihr Problem überhaupt beheben können. –