2013-10-15 17 views
5

Tôi gặp sự cố khi cố xác thực đối tượng bằng xsd đã cho. Các lớp học đã được tạo từ xsd.JAXB - SAXParseException Không thể tìm thấy phần khai báo của phần tử

SchemaFactory factory = SchemaFactory 
       .newInstance("http://www.w3.org/2001/XMLSchema"); 
Schema schema = factory.newSchema(getClass().getResource("/xsd/test.xsd")); 
JAXBContext context = JAXBContext.newInstance(aClass); 
Unmarshaller u = context.createUnmarshaller(); 
u.setSchema(schema); 
Object anObject = u.unmarshal(new StreamSource(new StringReader(
       MESSAGE)), aClass); 

Dưới đây là thông điệp ngoại lệ

[org.xml.sax.SAXParseException: cvc-elt.1: Không thể tìm thấy việc kê khai của nguyên tố 'ACCESREFUSE'.]

Đây là XSD :

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="./include/CJCommon.xsd"/> 
<xs:element name="ACCESREFUSE"> 
<xs:complexType> 
    <xs:sequence maxOccurs="1" minOccurs="1"> 
    <!-- Entete --> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDOper"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="DateEvt"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDEvt"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDJoueur"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="HashJoueur"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IDSession"/> 
    <xs:element maxOccurs="1" minOccurs="1" ref="IPJoueur"/> 
    <xs:element maxOccurs="1" minOccurs="0" ref="IDCoffre"/> 
    <!-- Corps --> 
    <xs:element maxOccurs="1" minOccurs="1" ref="TypAg"/> 
    <xs:element maxOccurs="1" minOccurs="0" name="CauseRefus" type="string-1024"/> 
    <xs:element maxOccurs="1" minOccurs="0" name="TypeRefus"> 
     <xs:simpleType> 
     <xs:restriction base="string-1024"> 
      <xs:enumeration value="DelaiIdentite"/> 
      <xs:enumeration value="RejetIdentite"/> 
      <xs:enumeration value="Interdit"/> 
      <xs:enumeration value="AutoInterdit"/> 
      <xs:enumeration value="OpVerrouille"/> 
      <xs:enumeration value="Verrouille"/> 
      <xs:enumeration value="Cloture"/> 
      <xs:enumeration value="Autre"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

Phần tử ACCESREFUSE là gốc của xml.

XML:

<ACCESREFUSE> 
     <dateEvt>Tue Oct 15 11:45:48 CEST 2013</dateEvt> 
     <hashJoueur>0000000000000000000000000000000000000000</hashJoueur> 
     <typAg>JC</typAg> 
     <causeRefus>Interdit</causeRefus> 
     <typeRefus>Interdiction Temporaire</typeRefus> 
     <idjoueur>81.252.190.129</idjoueur> 
     <idoper>002</idoper> 
     <idsession>301090</idsession> 
     <idevt>0</idevt> 
     <ipjoueur/> 
     <idcoffre/> 
</ACCESREFUSE> 

Bất kỳ ý tưởng? Cảm ơn bạn

Trả lời

4

Bạn có thể thử thay đổi sơ đồ của bạn để:

<xs:element name="ACCESREFUSE"> 
<xs:complexType name="ACCESREFUSE"> 
... 
</xs:schema> 

EDIT: Tôi nghĩ bạn có vấn đề với XSD tải. Bạn có thể thay đổi mã này cho mục đích thử nghiệm không:

InputStream xmlStream = ... 
Schema schema = factory.newSchema(xmlStream); 

Hãy dùng thử!

EDIT2: Tôi đã thử phân tích cú pháp ACCESREFUSE lớp học với XSD. Tôi không biết lược đồ ./include/CJCommon.xsd của bạn, vì vậy tôi đã bỏ qua. Đây là mã của tôi:

 SchemaFactory factory = SchemaFactory 
       .newInstance("http://www.w3.org/2001/XMLSchema"); 
     File file = new File("test.xml"); 
     Schema schema = factory.newSchema(file); 

    JAXBContext context = JAXBContext.newInstance(ACCESREFUSE.class); 
    Unmarshaller u = context.createUnmarshaller(); 
    u.setSchema(schema); 
    Object anObject = u.unmarshal(new StreamSource(new StringReader(
      getMessage())), ACCESREFUSE.class); 

Các ACCESREFUSE.class tôi:

@XmlRootElement(name="ACCESREFUSE") 
public class ACCESREFUSE { 

    protected String v1; 
    protected String v2; 
    protected String v3; 
    protected String v4; 
    protected String v5; 
    protected String v6; 
    protected String v7; 
     protected String v8; 
    protected String v9; 
    protected String CauseRefus; 
    protected TypeRefus typeRefus; 

    public enum TypeRefus{ 
     DelaiIdentite, RejetIdentite, Interdit, AutoInterdit, OpVerrouille, Verrouille, Cloture, Autre; 
    } 

Thông điệp:

private static String getMessage() { 

     return "<ACCESREFUSE>" 
       + "<v1>Tue Oct 15 11:45:48 CEST 2013</v1>" 
       + "<v2>0000000000000000000000000000000000000000</v2>" 
       + "<v3>JC</v3>" + "<v4>Interdit</v4>" 
       + "<v5>81.252.190.129</v5>" 
       + "<v6>002</v6>" + "<v7>301090</v7>" 
       + "<v8>0</v8>" + "<v9> test </v9>" 
       + "<TypeRefus>RejetIdentite</TypeRefus>" 

       + "</ACCESREFUSE>"; 
    } 

và sửa đổi XSD của bạn đến các yếu tố chuỗi đơn giản:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="ACCESREFUSE"> 
<xs:complexType> 
    <xs:sequence maxOccurs="1" minOccurs="1"> 
    <!-- Entete --> 
    <xs:element maxOccurs="1" minOccurs="1" type="xs:string" name="v1"/> 
    ... 

Chương trình hoạt động chính xác! :)

Bạn có thể kiểm tra ./include/CJCommon.xsd của mình? Bạn có sử dụng tiền tố xs cho type="xs:string" không?

+0

Vâng, điều này là lạ vì xác thực đã làm việc trước lỗi. Chỉ khi mọi thứ đều ổn, tôi có lỗi với phần tử gốc. Tôi đã thử với InputStream nhưng kết quả là cùng một – BkSouX

+0

trước khi ngoại lệ, xác thực đã làm việc khi XML không chính xác. ví dụ nó nói với tôi để thay đổi lĩnh vực ... – BkSouX

+1

có nó làm việc nhờ. vấn đề là trong CJCommon :) Cảm ơn sự giúp đỡ của bạn! – BkSouX

0

Có thể là vấn đề không gian tên. bạn nên thử nhập ./include/CJCommon.xsd với khai báo không gian tên thích hợp, v.v. link

+0

tôi không thể thay đổi xsd, nhưng tôi sẽ thử. – BkSouX

+0

thông báo đã thay đổi – BkSouX

Các vấn đề liên quan