2015-09-22 12 views
6

Bir sorunum var, 'İçeriyor' üç adında bir adın bulunduğu bir XML'yi bağlamaya çalışıyorum.İç içe yerleştirilmiş öğeler XSD'ye neden olur JAXB'de geçersiz sınıf devralma döngüsü istisnası, bağlamaları düzgün bir şekilde nasıl geçersiz kılabilirim?

Düğüm adlarını bir bağ dosyasıyla geçersiz kılmanın mümkün olduğunu okudum. Şu anda çalışmıyor.

Sanırım hata dosyada Xpath'den geliyor, ama emin değilim. Çok denedim ama asla başaramadım.

benim XSD Dosya yok:

<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> 

Ve ikinci ve thirs değiştirmek için bağlayıcı dosya düğümü 'İçeren'.

<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> 

Ama şu XJC komutu çalıştırdığınızda: Ben bu hatayı var

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

:

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)

Herhangi bir fikir takdir edilecektir :)

teşekkür ederiz.

+0

deneyin @ name'Contains'' 'in' @ id = 'Contains'' değiştirebilir ve eklemek '// xs' yerine kadar/xs' – Xstian

+0

Cevabınız için teşekkür ederiz, mesajımı düzenledim, '@ id = 'İçer' ' başka bir testti, fakat henüz' @ name = 'Contains'', ve ben de denedim aynı sonuçları al. '/ xs' xjc dönüş yerine' // xs 'eklerseniz: '[ERROR] L'évaluation XPath de" // xs: element [@ name =' ArchiveTransferRequest '] // xs: complexType // xs: sequence // xs: element [@ name = 'içerir'] // xs: complexType // xs: sequence // xs: element [@ name = 'içerir'] "génère un trop grand nombre de noeuds cible (2) ligne 6 sur dosyası:/C:/Kullanıcılar/jtvervliet/Belgeler/SAE/seda_actes_binding.xml'. Hangi düğümü geçersiz kılmak istediğimi tam olarak bilmediğini ihmal etmeyin. – jdelagorce

+0

[Bu benim cevabım] 'ı görmeye çalışın (http://stackoverflow.com/a/29969915/3364187) yararlı olabilir – Xstian

cevap

9

yazmıştın:

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

Ben senin XSD aldı ve bu yasal bir belge yapmak için düzelttim. Sonra XPath ifadelerinizi aldım, xs:element'u doğru seçtiler.

Bu çalışma yapmak için yapmanız gereken tek şey daha var: xs:complexType değil xs:element seçmek , o JAXB sınıflar değil elemanları oluşturmak için kullandığı çünkü.

şu çalışmalıdır:

<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

eski bir soru ama sadece yardım etmeye diğerleri eklemek için emin olun rağmen: sonuna "/ xs complexType". Bunun yerine aşağıda ait:

<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> 

O kadar olmalıdır:

<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> 
İlgili konular