2016-03-23 15 views
1

Ich versuche Java-Klassen von XSDs mit JAXB zu generieren.JAXB: Paket.Paket. <Type> ist bereits in package.package definiert. <Type>. <Type>

Die XSDs sind offizielle xsds in meiner Firma, also kann ich sie nicht nur für mein Projekt ändern. Nachdem Hunderte von versuchen und Suche auf dieser Seite habe ich mich entschieden, die Frage direkt zu stellen.

Ich habe dies in meinem XSD:

<xs:element name="Line" minOccurs="0" maxOccurs="999"> 
                <xs:complexType> 
                 <xs:sequence> 
                  <xs:element name="Line" minOccurs="0" maxOccurs="999"> 
                   <xs:complexType> 
                    <xs:attribute name="reference" type="xs:toto" use="optional"> 
                    </xs:attribute> 
                   </xs:complexType> 
                  </xs:element> 
                 </xs:sequence> 
                 <xs:attribute name="reference" type="xs:toto" use="optional"> 

                 </xs:attribute> 
                </xs:complexType> 
               </xs:element> 

Es in der Ausgabe führen: package.Index.Line bereits in package.Index definiert ist

Nachdem bei dem generierten Code suchen kann ich sehen Sie, dass wir eine statische iner Class Line in eine andere statisch innere Klasse Line (unter einem anderen Index) haben

Ich bekomme Fehler auf der Linie (oben) Die verschachtelte Zeile kann einen umschließenden Typ nicht verbergen

Wenn der Name geändert wird (entweder auf xsd oder auf Java-Klasse nach der Generierung), habe ich kein Problem mehr.

Ich habe versucht, eine Bindungsdatei zu erstellen:

<jaxb:bindings schemaLocation="file:../path/myschema.xsd" node="//xs:element[@name='Index']"> 
    <jaxb:bindings node=".//xs:element[@name='Line']" multiple="true"> 
     <jaxb:property name="Lines"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

ich das gleiche Problem haben ... Denn in der Tat unter Index I zwei Knoten Linie haben, damit ich mit diesem versuchen:

<jaxb:bindings schemaLocation="file:path/myxsd.xsd" node="//xs:element[@name='Index']/xs:element[@name='Line']"> 
    <jaxb:bindings node="//xs:element[@name='Line']" multiple="true"> 
     <jaxb:property name="Lines"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

oder

<jaxb:bindings schemaLocation="file:path/myxsd.xsd" node="//xs:element[@name='Index']"> 
    <jaxb:bindings node="//xs:element[@name='Line']/xs:element[@name='Line']" multiple="true"> 
     <jaxb:property name="Lines"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

Aber ich erhalte eine Generation Ausgabe: com.sun.istack.SAXParseException2: XPa Die Auswertung von "// xs: element [@ name = 'Index']/xs: element [@ name = 'Linie']" führt zu einem leeren Zielknoten

Ich bin komplett verloren. Ich esse den ganzen Tag nutella lange die Traurigkeit zu kompensieren Ich fühle mich T_T

Wenn Sie Vorschläge haben;)

Vielen Dank im Voraus

Geoffrey

+0

Zeile ist innerhalb 'xs: complexType'. nicht unter 'xs: element' Linie – ulab

+0

Also wie willst du das machen? Dies funktioniert nicht ' \t \t \t \t \t \t \t \t ' – Geoffrey

+0

siehe meine Antwort unten. – ulab

Antwort

0

Erste configure Bindungen als einzelne Klassen zu erzeugen.

<jaxb:globalBindings localScoping="toplevel"/> 

Verwenden Sie dann komplette XPath für die referenzierten Elemente wie unten.

<bindings version="2.1" xmlns="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <globalBindings localScoping="toplevel"/> 

    <bindings schemaLocation="yourschema.xsd"> 
      <bindings node="//xs:element[@name='Index']/xs:complexType/xs:sequence/xs:element[@name='Line']/xs:complexType"> 
       <class name="Lines1"/> 
      </bindings> 
    </bindings> 

     <bindings schemaLocation="yourschema.xsd"> 
       <bindings node="//xs:element[@name='Index']/xs:complexType/xs:sequence/xs:element[@name='Line']/xs:complexType/xs:sequence/xs:element[@name='Line']/xs:complexType"> 
        <class name="Lines2"/> 
       </bindings> 
    </bindings> 

</bindings>