2015-09-22 13 views
6

Tôi gặp sự cố, tôi đang cố gắng liên kết XML nơi có tên 'Chứa' ba lần.Các phần tử lồng nhau trong XSD gây ra ngoại lệ vòng lặp thừa kế lớp bất hợp pháp trong JAXB, làm thế nào tôi có thể ghi đè đúng các ràng buộc?

Vì vậy, tôi đọc rằng có thể ghi đè tên nút bằng tệp ràng buộc. Tại thời điểm nó không hoạt động.

Tôi nghĩ rằng sai lầm đến từ Xpath trong tệp ràng buộc, nhưng tôi không chắc chắn. Tôi đã thử rất nhiều cách, nhưng tôi chưa bao giờ thành công.

Có XSD tập tin của tôi:

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

Và file ràng buộc để thay đổi thứ hai và thirs 'Có' nút.

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

Nhưng khi tôi thực hiện lệnh sau 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

Tôi đã nhận lỗi này:

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)

Bất kỳ ý tưởng sẽ được đánh giá cao :)

Cảm ơn bạn.

+0

Cố gắng thay đổi '@ id = 'Contains'' trong' @ name'Contains'' và thêm' // xs' thay của '/ xs' – Xstian

+0

Cảm ơn câu trả lời của bạn, tôi đã chỉnh sửa bài đăng của mình,' @ id = 'Contains'' là một thử nghiệm khác, nhưng tôi đã thử với '@ name =' Contains'', và tôi có được kết quả tương tự. Nếu tôi thêm '// xs' thay vì'/xs' xjc return: '[ERROR] L'évaluation XPath de" // xs: element [@ name = 'ArchiveTransferRequest'] // xs: complexType // xs: chuỗi // xs: phần tử [@ name = 'Chứa'] // xs: complexType // xs: chuỗi // xs: phần tử [@ name = 'Chứa'] "génère un trop grand nombre de noeuds cible (2) ligne 6 sur file:/C:/Người dùng/jtvervliet/Documents/SAE/seda_actes_binding.xml'. Ihink rằng nó không biết chính xác nút nào tôi muốn ghi đè lên. – jdelagorce

+0

Hãy thử xem [câu trả lời của tôi] (http://stackoverflow.com/a/29969915/3364187) có thể hữu ích – Xstian

Trả lời

9

Bạn đã viết:

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

tôi mất XSD của bạn và cố định nó để làm cho nó một tài liệu pháp lý. Sau đó, tôi đã lấy biểu thức XPath của bạn, họ đã chọn chính xác xs:element.

Chỉ có một điều nữa bạn cần phải làm gì để làm việc này: chọn xs:complexType, không phải là xs:element, bởi vì đó là những gì JAXB sử dụng để tạo ra các lớp học, không phải là yếu tố.

Sau đây nên làm việc:

<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

Mặc dù nó là một câu hỏi cũ nhưng chỉ để giúp đỡ người khác hãy chắc chắn để thêm "/ xs: complexType" ở cuối. Vì vậy, thay vì dưới đây:

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

Nó nên càng:

<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> 
Các vấn đề liên quan