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

Valider XML Discussion :

Forcer la validation suivant DTD externe


Sujet :

Valider XML

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 24
    Points
    24
    Par défaut Forcer la validation suivant DTD externe
    Bonjour à toutes et à tous,

    J'essaie de parser un document XML avec xml4J. Je souhaite forcer le parsing à valider une DTD externe non référencé dans le document XML, cela est-il possible et si oui avez-vous des infos sur comment faire ?

    Merci pour votre aide.

  2. #2
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Une technique consiste à utiliser "entityResolver", mais il doit y avoir plus propre...

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Merci pour ton aide mais peux-tu m'en dire plus sur EntityResolver ?

  4. #4
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Si tu as un peu cherché, tu sais que EntityResolver est la classe à laquelle le parser delegue (eventuellement, càd si une instance de EntityResolver lui a été affecté via setEntityResolver) l'ouverture des entités externes (i.e. les references de DTD, de schemas, en gros tout ce qui comporte des URI).
    Lorsque le parser rencontre une entité externe, et qu'un objet de type EntityResolver lui a été affecté, il passe la reference de l'entité (publicId, systemId) au dit objet (via resolveEntity) qui doit lui renvoyer une instance de InputSource. En gros il dit : "ce n'est pas mon boulot d'ouvrir cette URL (ou ce fichier); l'EntityResolver va le faire pour moi".
    Si tu t'es un peu interessé à la question, tu as du voir également que, si resolveEntity renvoie null, alors le parser ouvriras lui-même l'entité (càd comportement identique au cas "habituel" où il n'y a pas d'entityResolver).

    Maintenant qu'est-ce que tout cela a à voir avec ta question ?

    Eh bien si tu declares un DTD externe dans ton doc XML (soit le DTD à utiliser par defaut soit un nom qui ne correspond à rien), mettons "<!DOCTYPE monDocType SYSTEM "parametrableDTD">"; rien ne t'empêche quand tu rencontre cette reference, d'ouvrir le DTD de ton choix.

    Un truc du genre (désolé pour les fautes j'ai pas écrit une ligne de java depuis 5 ans):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public InputSource resolveEntity(String publicID, String systemID)
    throws IOException, SAXException {
    string fichierAouvrir;
    if (systemID.equals("parametrableDTD")) {
     
    /* insèrer ici du code qui affecte une valeur à 'fichierAouvrir' (d'ailleurs ce n'est pas forcement un fichier ça peut être une URL) */
     
    return new InputSource(fichierAouvrir);
    }
    return null;
    }
    Cette solution fonctionne mais comme je l'ai dit, je ne suis pas du tout sur que ce soit la meilleure façon de faire. C'est juste une methode que j'ai cru entraperçevoir en surfant sur le net.

    Cordialement,

    Phil

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup d'avoir pris le temps de m'expliquer le mécanisme.
    Si je pousse la reflexion un peu plus loin, est-il possible d'avoir le même comportement mais sans faire de référence à une DTD dans le document XML à parser :

    <?xml version="1.0" standalone="yes"?>
    <!--<!DOCTYPE ServicePackageModule SYSTEM "BatchLoadBis.dtd">-->

    Est-il possible de forcer la validation avec DTD externe que je référence dans mon code ?

  6. #6
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Est-il possible de forcer la validation avec DTD externe que je référence dans mon code ?
    Euh... ben c'est exactement ce que je viens d'expliquer (si je résume mon post precedent : 1) oui c'est possible, 2) comment : cf. le code).

    Je ne veux pas paraitre cassant, mais à ton avis il est où ton EntityResolver à part dans ton code ?

    Je suis désolé, peut-être est-ce moi qui m'explique mal... Dis moi ce que tu ne comprend pas dans ma reponse precedente.

    Phil

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    J'ai parfaitement compris ce que tu m'as expliqué auparavant mais ce que j'aimerais c'est que si le document XML est déclaré standalone (<?xml version="1.0" standalone="yes"?>) donc sans référence de DTD (<!--<!DOCTYPE ServicePackageModule SYSTEM "BatchLoadBis.dtd">--> ), mon parser force la validation et agit comme si le document XML n'était pas standalone et qu'il référençait une DTD.
    Ceci car je n'ai pas la main sur les fichiers XML qui seront fournis au système et je veux imposer une grammaire quelque soit le fichier XML soumis.

    Pour le fichier suivant...

    file.xml :
    <?xml version="1.0" standalone="yes"?>
    <Root>
    </Root>

    ...et le code suivant...

    public static void main(String[] args){
    XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
    parser.setFeature("http://xml.org/sax/features/validation", true);
    parser.setContentHandler(handler);
    parser.setErrorHandler(handler);
    parser.setEntityResolver(handler);
    parser.parse("file.xml");
    }

    public InputSource resolveEntity(String publicID, String systemID) throws SAXException {

    InputSource inputSource = null;

    try {
    inputSource = new InputSource("file.dtd");
    }
    catch (Exception e) {
    }
    return inputSource;
    }


    voici l'erreur que j'obtient :
    org.xml.sax.SAXParseException: Le document n'est pas valide car la grammaire est introuvable. (et ce n'est pas le new InputSource("file.dtd") qui lève cette exception).


    Voilà, j'espère être suffisament précis sur la fonctionnalité dont j'ai besoin.
    Quoi qu'il en soit merci de prendre du temps pour essayer de m'aider.

  8. #8
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Excuses-moi, j'avais pas compris le besoin.
    Effectivement ma solution ne convient pas dans ton cas, je vais voir vite fait si je trouve autre chose dans mes bouquins.

    Phil

  9. #9
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Bonne nouvelle : j'ai retrouvé le petit texte sur lequel je m'étais basé pour te répondre. Il s'agit d'un post de qqun qui pose à peu près la même question que toi (mais en anglais) : "Validating XML, but specify where DTD doc is, at runtime". Tu peux le trouver ici : http://forum.java.sun.com/thread.jsp...&thread=158734

    Mauvaise nouvelle : il n'y a pas l'air d'avoir de solution à part celle que je t'ai donnée. Tu es sur que tu ne peux pas avoir une petite instruction "<!DOCTYPE" dans ton doc XML (comme on l'a vu, l'URI indiquée importe peu, on a juste besoin du tag).

    Cordialement,

    Phil

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup pour ton aide, je crois que je vais en rester là et utiliser <!DOCTYPE...>

    Vincent

Discussions similaires

  1. Valider un XML avec une DTD externe
    Par j.mathieu dans le forum ASP.NET
    Réponses: 4
    Dernier message: 27/06/2009, 10h01
  2. Valider un XML avec une DTD externe
    Par Pub69 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 05/07/2006, 16h35
  3. [DTD] Valider fichier xml avec une DTD externe
    Par Tail dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 26/06/2006, 18h14
  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. [DOM] Erreur pour valider une DTD
    Par lenghh dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 19/05/2004, 18h15

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