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 :

XML et validation DTD [DOM]


Sujet :

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

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Par défaut XML et validation DTD
    Bonjour,

    J'ai un problème sur un bout de code qui parse du xml.
    Voici le bout de code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    		/* Cree le parser XML */
    		try {
    			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    			dbf.setAttribute (JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
    			dbf.setValidating (false);
     
    			DocumentBuilder db = dbf.newDocumentBuilder ();
    	    	doc = db.parse (new InputSource (new StringReader (xmlData)));
     
        	} catch (ParserConfigurationException ex) {
    			logger.log (Logger.ERROR, "ParserConfigurationException : " + ex.getMessage ());
    	    	return false;
    		} catch (SAXException ex) {
    			logger.log (Logger.ERROR, "SAXException : " + ex.getMessage ());
    	    	return false;
    		} catch (IOException ex) {
    			logger.log (Logger.ERROR, "IOException : " + ex.getMessage ());
    			ex.printStackTrace (System.out);
    	    	return false;
    		} catch (FactoryConfigurationError ex) {
    			logger.log (Logger.ERROR, "FactoryConfigurationError : " + ex.getMessage ());
    	    	return false;
    		}
    Mon problème c'est que j'obtiens une IOException lors de l'appel à parse. Il essaye apparement d'allez consulter la DTD sur le site spécifié dans le DOCTYPE. Ce programme doit-être installer sur un serveur qui n'aura pas accès au net et qui ne pourra donc pas allez sur ce fameux site.
    J'ai pourtant mis setValidating à false, je ne comprend pas ... Si qq1 a une solution.

    PS : lorsque je supprime le DOCTYPE dans le XML, ca marche à merveille

    Merci !
    [edit] moi utiliser bon francais dans phrase [/edit]

  2. #2
    Membre confirmé
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Par défaut
    The DocumentBuilderFactory interface contains a setFeature(String,boolean) method which can be used to set features on the underlying parser. For example:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.DocumentBuilder;
     
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setNamespaceAware(true);
     
    try {
        dbf.setFeature("http://apache.org/xml/features/allow-java-encodings", 
                       true);
    } 
    catch (ParserConfigurationException e) {
        System.err.println("could not set parser feature");
    }
    Tu mets à false, ca marche fort bien avec mes SAXParsers en tout cas


    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                saxParser.setFeature
                ("http://xml.org/sax/features/validation",false);
                saxParser.parse(confFile);

  3. #3
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    utilise la méthode setEntityResolver pour spécifier un EntityResolver qui saura faire le lien entre l'uri et un emplacement en local.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Par défaut
    Le setFeature ne fonctionne pas, j'ai une exception qui me dit que la feature n'est pas autorisé. y-a-t-il une liste des features quelque part. J'ai pas trouvé.
    En attendant je me penche sur le EntityReslover.

    Merci à tout les deux !

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Par défaut
    Citation Envoyé par dlemoing
    utilise la méthode setEntityResolver pour spécifier un EntityResolver qui saura faire le lien entre l'uri et un emplacement en local.
    Donc si j'ai bien compris je suis tout de même obligé d'avoir la DTD quelque part en local. EntityResolver me sert juste à lui dire : Si tu cherche cette url, tu utilise cet InputSource.

    On ne peut donc pas zapper purement et simplement la validation du document mis à part en supprimant le DOCTYPE ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 376
    Par défaut
    Ca marche !
    Avec la DTD en local et un EntityResolver maison ça tourne.

    Merci !!!!

  7. #7
    Membre averti
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Par défaut
    Bonjour Getupa,

    j'essaie moi aussi d'utiliser l'interface EntityResolver pour que mon parser utilise une DTD qui n'est pas au même endroit que mes fichiers XML mais sans succès...

    Mes DOCTYPE sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <!DOCTYPE rootName SYSTEM "dtd/Version/rootName.dtd">
    et au niveau de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public InputSource  resolveEntity(String publicId, String systemId)
    Mon publicId est null et mon systemId est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //C:/le/chemin/vers/mon/appli/dtd/Version/rootName/dtd
    Je voudrai en fait rediriger vers "resources/dtd/Version/rootName.dtd" mais je n'arrive pas à récupérer le SYSTEMID brut, sans le début du chemin absolu, car ce chemin absolu change selon le dossier depuis lequel je lance mon appli.

    Merci si tu peux m'apporter ton aide.

    Vignot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML]EntityResolver / Validation DTD fourni dans le jar
    Par Julaie95 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 30/12/2008, 23h37
  2. [DTD] Valider un fichier xml suivant une DTD
    Par Tail dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/06/2006, 11h23
  3. [dtd] .xml non valide
    Par SaintAmand dans le forum Valider
    Réponses: 3
    Dernier message: 20/02/2006, 14h54
  4. [SAX] Parser XML et validation avec dtd
    Par arno00020 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 22/11/2005, 17h30
  5. Réponses: 2
    Dernier message: 03/06/2005, 11h00

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