JAXB - SAXParseException Cannot find the declaration of element
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"
?
BkSouX
Updated on June 17, 2022Comments
-
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 over 10 yearsWell, 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 over 10 yearsbefore the exception, the validation worked when the XML wasn't correct. for example it told me to change fields...
-
BkSouX over 10 yearsi cannot change the xsd, but i will try.
-
BkSouX over 10 yearsyes it's working thanks. the problem was in the CJCommon :) Thanks for your help !
-
Line over 6 years@BkSouX so the problem was then one of the included XSD was bad-defined?