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.
Cố gắng thay đổi '@ id = 'Contains'' trong' @ name'Contains'' và thêm' // xs' thay của '/ xs' – Xstian
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
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