IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Sax Exception: 'cvc-elt.1: Cannot find the declaration of element 'site:blog'


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre très actif
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Par défaut Sax Exception: 'cvc-elt.1: Cannot find the declaration of element 'site:blog'
    Bonjour!
    j'ai l,exception mentionnée dans le sujet quand je je tente de parser un xml associé a un schema XSD

    PVI voici le XSD, le XML et un bout du code JAVA servant à parser:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.netbeans.org/schema/blog"
                xmlns:tns="http://xml.netbeans.org/schema/blog"
                elementFormDefault="qualified">
    	<!-- Définition du ROOT elem 'Blog' -->
    	<xs:annotation>
    		<!-- DOC-->
    		<xs:documentation>
                xs pour le blog engine XML
     
            </xs:documentation>
    	</xs:annotation>
    	<xs:element name="Blog">
    		<xs:complexType>
    			<xs:sequence>
    				<!-- Début de définition de l'élément Entry -->
    				<xs:element name="Entry " minOccurs="0" maxOccurs="unbounded">
    					<xs:annotation>
    						<xs:documentation>
                                L'élément Entry représente un billet donné
                            </xs:documentation>
    					</xs:annotation>
    					<!-- DOC-->
    					<xs:complexType>
    						<xs:sequence>
    							<xs:element name="Text"/>
    							<xs:element name="Resume" minOccurs="0" maxOccurs="unbounded"/>
    							<!-- Début de définition de l'élément Comment -->
    							<xs:element name="Comment" minOccurs="0" maxOccurs="unbounded">
    								<xs:annotation>
    									<xs:documentation>
                                            L'élément comment représente un commentaire d'un lecteur à propos d'un billet donné
                                        </xs:documentation>
    								</xs:annotation>
    								<!-- DOC-->
    								<xs:complexType>
    									<xs:sequence>
    										<xs:element name="CommentText" maxOccurs="1"/>
    									</xs:sequence>
    									<xs:attribute name="date" type="xs:date" use="required"/>
    									<xs:attribute name="author" type="xs:string"/>
    									<xs:attribute name="webPage" type="xs:anyURI"/>
    									<!-- Début de séquence définissant les sous éléments de Comment -->
    									<!-- attributs de l'élément Comment-->
    									<!--  Fin des attributs de l'élément comment-->
    								</xs:complexType>
    							</xs:element>
    							<!-- Fin de séquence définissant les sous éléments de Comment -->
    						</xs:sequence>
    						<xs:attribute name="date" type="xs:date" use="required"/>
    						<xs:attribute name="categoryHash" type="xs:integer" default="0"/>
    						<xs:attribute name="allowComments" type="xs:boolean" default="false"/>
    						<xs:attribute name="hash" type="xs:integer"/>
    						<xs:attribute name="commentsCounts" type="xs:integer" default="0"/>
    						<!-- Début de séquence définissant les sous éléments de Entry -->
    						<!-- Fin de séquence définissant les sous éléments de Entry -->
    						<!-- attributs de l'élément Entry-->
    						<!--  Fin des attributs de l'élément Entry-->
    					</xs:complexType>
    				</xs:element>
    				<!-- Fin de définition de l'élément Entry -->
    				<!-- Début de définition de l'élément Category -->
    				<xs:element name="Category" minOccurs="0" maxOccurs="unbounded">
    					<xs:annotation>
    						<xs:documentation>
                                L'élément Categoy représente une catégorie pour un billet donné
                            </xs:documentation>
    					</xs:annotation>
    					<!-- DOC-->
    					<xs:complexType>
    						<xs:attribute name="hash" type="xs:integer" default="0"/>
    						<xs:attribute name="name" type="xs:string" use="required"/>
    						<xs:attribute name="description" type="xs:string"/>
    					</xs:complexType>
    				</xs:element>
    			</xs:sequence>
    			<!-- Début de séquence définissant les sous éléments du Blog -->
    			<!-- Fin de séquence définissant les sous éléments du Blog -->
    		</xs:complexType>
    	</xs:element>
    	<!-- Fin du ROOT element-->
    </xs:schema>

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <site:Blog  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
       xmlns:site='http://xml.netbeans.org/schema/blog'
       xsi:schemaLocation='http://xml.netbeans.org/schema/blog blog.xsd'>
    <site:Entry date="2007-09-07" categoryHash="222" allowComments="true" hash="26657200">
    		<site:Text>Texte</site:Text>
    		<site:Resume>R&amp;eacute;sum&amp;eacute; du billet non disponible</site:Resume>
    	</site:Entry>
     
    	<site:Category hash="123" description="Une desciption" name="Cat1"/>
     
     
    </site:Blog>

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    public static final String NAMESPACES_FEATURE =
    			    "http://xml.org/sax/features/namespaces";
     
    	public static final String VALIDATION_FEATURE =
    			    "http://xml.org/sax/features/validation";
     
    	public static final String SCHEMA_VALIDATION_FEATURE =
    			    "http://apache.org/xml/features/validation/schema";
     
    	public static final String SCHEMA_FULL_CHECKING_FEATURE =
    			    "http://apache.org/xml/features/validation/schema-full-checking";
     
    //	public static final String DYNAMIC_VALIDATION_FEATURE =
    //			    "http://apache.org/xml/features/validation/dynamic";
    //
    //	public static final String LOAD_EXTERNAL_DTD_FEATURE =
    //			    "http://apache.org/xml/features/nonvalidating/load-external-dtd";
    //
    //	public static final String JAXP_SCHEMA_LANGUAGE =
    //			    "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    //	public static final String W3C_XML_SCHEMA =
    //			    "http://www.w3.org/2001/XMLSchema";
     
        public static  final  String EXTERNAL_XSD="http://apache.org/xml/properties/external-SchemaLocation";
    	public static final String DOCUMENT_IMPLEMENTATION_PROPERTY =
    			    "http://apache.org/xml/properties/dom/document-class-name";
    	public static final String DOCUMENT_PSVI_IMPLEMENTATION =
    			    "org.apache.xerces.dom.PSVIDocumentImpl";
     
    	boolean _validating;
     
    	/**
             * Constructor for Xerxes loader.
             */
    	public CustomDomLoader() {
    		_validating = false;
    	}
     
    	/**
             * The Xerces loader loads the XML docuemnt
             * @param in is the input stream.
             * @throws DOMLoaderException DOM loader exception.
             * @return The loaded document.
             */
    	// XXX: fix error reporting
    	public Document load(InputStream in) throws DOMLoaderException {
     
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
                    factory.setNamespaceAware(true);
                    //factory.setAttribute(EXTERNAL_XSD,"http://xml.netbeans.org/schema/blog /home/laurent/Programming tools/blog/blog.xsd");
                    factory.setValidating(_validating);
    		factory.setAttribute(SCHEMA_VALIDATION_FEATURE,
    				     new Boolean(_validating));
    		factory.setAttribute(DOCUMENT_IMPLEMENTATION_PROPERTY,
    		                     DOCUMENT_PSVI_IMPLEMENTATION);
    //		factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
     
                    try {
                            DocumentBuilder builder = factory.newDocumentBuilder();
     
                            if(_validating) {
                                    builder.setErrorHandler(new ErrorHandler() {
                                            public void fatalError(SAXParseException e) throws SAXException {
                                                    throw e;
                                            }
                                            public void error(SAXParseException e) throws SAXParseException {
                                                    throw e;
                                            }
                                            public void warning(SAXParseException e) throws SAXParseException {
                                                    throw e; // XXX
                                            }
                                                             });
                            }
                            return builder.parse(in);
                    } catch(SAXException e) {
                            System.out.println("Sax exception: "+e.getMessage());
                            e.printStackTrace();
                    return null;
                    } catch(ParserConfigurationException e) {
                            throw new DOMLoaderException("Parser configuration exception: " +
                                                         e.getMessage());
                    } catch(IOException e) {
                            throw new DOMLoaderException("IO exception: " +
                                                         e.getMessage());
                    }
     
    	}

    Avez-vous des idées du pourquoi j'obtiens cette exception ?

    Si vous avez besoin de plus d'infos n'hésitez pas

    Merci!

  2. #2
    Membre très actif
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Par défaut
    Et si je mettais aucune espace de nom ?

  3. #3
    Membre très actif
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Par défaut
    Bon ce que j'ai tenté de faire : enlever le namespace en utilisant l'attribut "xsi:noNamespaceSchemaLocation" en début de fichier xml
    ça change rien

    j'en ai déduis que le parser ne trouvais pas le fichier de schéma*
    Donc j'ai regardé pour voir si j'avais spécifié correctement le chemin en fait le xml et xsd sont dans le même répertoire j'ai juste eu a faire blog.xsd

    Mais mes tests échouent quand même.

    SAUF si je spécifie le chemin complet "C:\Users\laurent\Documents\blog\blog.xsd" dans le XML. `Là ça marche correctement

    C'est sur que c'est pas bon. Ce bug là ralentit mes trucs depuis 3 mois!


    Des idées ?

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    Le schemaLocation n'est pas vraiment utilisé par le parseur.

    Il faut donner le schéma au parseur Java.

    Personnellement j'utilise plutot une factory SAX pour faire une simple validation.
    L'exemple suivant utilise un xsd situé dans le classpath

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
    String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; 
     
    SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    saxFactory.setNamespaceAware(true);
    saxFactory.setValidating(true); 
     
    SAXParser saxParser = saxFactory.newSAXParser();
    saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
    saxParser.setProperty(JAXP_SCHEMA_SOURCE, 
        new InputSource(getClass().getResourceAsStream("/blog.xsd")));
    ...
    saxParser.parse( ... , ... );

  5. #5
    Membre très actif
    Homme Profil pro
    SAQ
    Inscrit en
    Novembre 2005
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Canada

    Informations professionnelles :
    Activité : SAQ
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 167
    Par défaut
    Selon mes observations: le parser sax et sa méthode parse ne retourne pas le document

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 210
    Par défaut
    Dans ce cas avec DOM, tu peux faire un setSchema() sur ton objet DocumentBuilder.
    (le Schema est créé grace à un SchemaFactory)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SchemaFactory schemaFactory = SchemaFactory.newInstance();
    Source schemaSource = new InputSource(getClass().getResourceAsStream("/blog.xsd"));
    Schema schema = schemaFactory.newSchema(schemaSource);
     
    builder.setSchema(schema);

Discussions similaires

  1. cvc-elt.1: Cannot find the declaration of element
    Par jbelis dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 15/02/2011, 13h12
  2. [JAXB] XmlRootElement & Cannot find the declaration of element ...
    Par ZuZu dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 13/10/2010, 11h21
  3. Réponses: 1
    Dernier message: 27/08/2010, 14h10
  4. [JAXB] Cannot find the declaration of element
    Par thomas.huguerre dans le forum Persistance des données
    Réponses: 1
    Dernier message: 23/06/2009, 18h16
  5. Réponses: 4
    Dernier message: 25/04/2006, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo