JAXB - SAXParseException Cannot find the declaration of element

18,512

Can you try modify your schema to:

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

EDIT: I think you have problem with load XSD. Could you change this code for test purpose:

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

Please try it!

EDIT2: I tried parse ACCESREFUSE class with your XSD. I don't know your ./include/CJCommon.xsd schema, so I omitted. Here is my code:

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

The my ACCESREFUSE.class:

@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;
    }

The message:

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>";
    }

and modified your XSD to simple string elements:

<?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"/>
     ...

The program correctly working! :)

So could you check your ./include/CJCommon.xsd? Are you use xs prefix for type="xs:string"?

Share:
18,512
BkSouX
Author by

BkSouX

Updated on June 17, 2022

Comments

  • BkSouX
    BkSouX almost 2 years

    I have a problem trying to validate an object with a given xsd. The classes has been generated from the xsd.

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

    Here is the exception message

    [org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'ACCESREFUSE'.]

    Here is the 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>
    

    The element ACCESREFUSE is the root of the 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>
    

    Any idea ? Thank you

  • BkSouX
    BkSouX over 10 years
    Well, this is strange because the validation worked before the error. Only when everything is fine, I have the error with the root element. I have tried with InputStream but the result is the same
  • BkSouX
    BkSouX over 10 years
    before the exception, the validation worked when the XML wasn't correct. for example it told me to change fields...
  • BkSouX
    BkSouX over 10 years
    i cannot change the xsd, but i will try.
  • BkSouX
    BkSouX over 10 years
    yes it's working thanks. the problem was in the CJCommon :) Thanks for your help !
  • Line
    Line over 6 years
    @BkSouX so the problem was then one of the included XSD was bad-defined?