2015-09-22 15 views
6

Ho un problema, sto cercando di associare un XML dove ci sono il nome 'Contiene' tre volte.Gli elementi nidificati in XSD causano un'eccezione del ciclo di ereditarietà della classe non valida in JAXB, come posso sovrascrivere correttamente i bind?

Quindi ho letto che è possibile sovrascrivere i nomi dei nodi con un file di bind. Al momento non funziona.

Penso che l'errore provenga da Xpath nel file di bind, ma non ne sono sicuro. Ho provato molto, ma non ci sono mai riuscito.

C'è il mio XSD File:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="fr:gouv:ae:archive:draft:standard_echange_v0.2" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> 

    <xs:element name="ArchiveTransferRequest"> 
    <xs:complexType> 
     <xs:sequence> 

     <xs:element type="xs:string" name="Comment"/> 
     <xs:element type="xs:dateTime" name="Date"/> 
     <xs:element name="TransferRequestIdentifier">....</xs:element> 
     <xs:element name="TransferringAgency">...</xs:element> 
     <xs:element name="ArchivalAgency">...</xs:element> 

     <xs:element name="Contains"> 
      <xs:complexType> 
      <xs:sequence> 

       <xs:element type="xs:string" name="ArchivalAgencyArchiveIdentifier"/> 
       <xs:element type="xs:string" name="ArchivalAgreement"/> 
       <xs:element type="xs:string" name="ArchivalProfile"/> 
       <xs:element name="DescriptionLanguage">...</xs:element> 
       <xs:element name="DescriptionLevel">...</xs:element> 
       <xs:element type="xs:string" name="Name"/> 
       <xs:element name="ContentDescription">...</xs:element> 

       <xs:element name="Contains" id="contains" > 
       <xs:complexType> 
        <xs:sequence> 

        <xs:element name="DescriptionLevel">...</xs:element> 
        <xs:element type="xs:string" name="Name"/> 
        <xs:element name="ContentDescription">...<xs:element> 

        <xs:element name="Contains" maxOccurs="unbounded" minOccurs="0"> 
         <xs:annotation> 
         <xs:documentation>a new contains for a new XML</xs:documentation> 
         </xs:annotation> 
         <xs:complexType> 
         <xs:sequence> 
          ... 
         </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

e il file di legame per modificare la seconda e la thirs 'contiene' nodo.

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       version="2.1"> 
    <jaxb:bindings schemaLocation="seda_actes.xsd"> 
     <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']"> 
      <jaxb:class name="SecondContains"/> 
     </jaxb:bindings> 
     <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']"> 
      <jaxb:class name="ThirdContains"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 

</jaxb:bindings> 

Ma quando eseguo il seguente comando xjc:

xjc -b C:\Users\jtvervliet\Documents\SAE\seda_actes_binding.xml -d C:\Users\jtvervliet\workspace\poc_bordereau\src -p test4.impnat.xml C:\Users\jtvervliet\Documents\SAE\seda_actes.xsd

ho ottenuto questo errore:

analyse dun schéma... compilation dun schéma... Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop. Outer class SecondContains may not subclass from inner class: SecondContains at com.sun.codemodel.internal.JDefinedClass._extends(JDefinedClass.java:258) at com.sun.tools.internal.xjc.generator.bean.ImplStructureStrategy$1._extends(ImplStructureStrategy.java:104) at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.(BeanGenerator.java:200) at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:154) at com.sun.tools.internal.xjc.model.Model.generateCode(Model.java:275) at com.sun.tools.internal.xjc.Driver.run(Driver.java:348) at com.sun.tools.internal.xjc.Driver.run(Driver.java:185) at com.sun.tools.internal.xjc.Driver._main(Driver.java:108) at com.sun.tools.internal.xjc.Driver.access$000(Driver.java:65) at com.sun.tools.internal.xjc.Driver$1.run(Driver.java:88)

Tutte le idee saranno apprezzati :)

Grazie.

+0

cercare di cambiare '@ id = 'Contains'' in' @ name'Contains'' e aggiungere '// xs' invece di '/ xs' – Xstian

+0

Grazie per la risposta, ho modificato il mio post,' @ id = 'Contains'' e è stato un altro test, ma ho ancora provato con '@ name =' Contains'' ottenere gli stessi risultati. Se aggiungo '// xs' invece di'/xs' xjc ritorno: '[ERRORE] L'évalutazione XPath de" // xs: element [@ name = 'ArchiveTransferRequest'] // xs: complexType // xs: sequence // xs: element [@ name = 'Contains'] // xs: complexType // xs: sequence // xs: element [@ name = 'Contains'] "génère un trop grand nombre de noeuds cible (2) ligne 6 sur file:/C:/Users/jtvervliet/Documents/SAE/seda_actes_binding.xml'. Credo che non sappia con precisione quale nodo voglio sovrascrivere. – jdelagorce

+0

Prova a vedere [questa mia risposta] (http://stackoverflow.com/a/29969915/3364187) potrebbe essere utile – Xstian

risposta

9

Hai scritto:

<jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest'] 
    /xs:complexType/xs:sequence/xs:element[@name='Contains'] 
    /xs:complexType/xs:sequence/xs:element[@name='Contains']"> 

Ho seguito il tuo XSD e fissato per renderlo un documento legale. Poi ho preso le tue espressioni XPath, hanno selezionato il xs:element correttamente.

C'è solo una cosa che devi fare per rendere questo lavoro: selezionare il xs:complexType, non il xs:element, perché è quello che usa JAXB per creare le classi, non gli elementi.

Il seguente dovrebbe funzionare:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       version="2.1"> 
    <jaxb:bindings schemaLocation="seda_actes.xsd"> 
     <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest'] 
      /xs:complexType/xs:sequence/xs:element[@name='Contains'] 
      /xs:complexType/xs:sequence/xs:element[@name='Contains'] 
      /xs:complexType"> 
      <jaxb:class name="SecondContains"/> 
     </jaxb:bindings> 
     <jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest'] 
      /xs:complexType/xs:sequence/xs:element[@name='Contains'] 
      /xs:complexType/xs:sequence/xs:element[@name='Contains'] 
      /xs:complexType/xs:sequence/xs:element[@name='Contains'] 
      /xs:complexType"> 
      <jaxb:class name="ThirdContains"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 

</jaxb:bindings> 
0

Anche se è una vecchia questione, ma solo per aiutare gli altri assicurarsi di aggiungere il "/ xs: complexType" alla fine. Così, invece di seguito:

<jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']"> 
    <jaxb:class name="SecondContains"/> 
</jaxb:bindings> 

Dovrebbe essere come:

<jaxb:bindings node="//xs:element[@name='ArchiveTransferRequest']/xs:complexType/xs:sequence/xs:element[@name='Contains']/xs:complexType/xs:sequence/xs:element[@name='Contains']**/xs:complexType**"> 
     <jaxb:class name="SecondContains"/> 
    </jaxb:bindings> 
Problemi correlati