Retourner aux forums || Retourner au forum Programmation.java

Programmation.java : Valider un document XML ne contenant pas de declaration DOCTYPE

Posté par figus () le 19 mai 2005
0
Bonsoir à tous

Je cherche à savoir s'il y a un moyen de valider un document XML qui n'a pas de declaration DOCTYPE. Je connais la DTD à associer au fichier XML (je l'ai en local) mais je ne parviens pas à trouver de solution.

L'un de vous aurait-il une idée ?

Merci.

> Lire le message (8 commentaires, moyenne: 1,4).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

idée

Posté par TImaniac (page perso, ) le 19/05/2005 à 20:45. (lien). Évalué à 2.

Ben rajoute le DOCTYPE au début du fichier ^^

  • [^]Re: idée

    Posté par figus () le 19/05/2005 à 21:25. (lien). Évalué à 1.

    J'adore ton humour :-)
    Qqn m'aurait posé cette question, j'aurais répondu de la même manière. Dans un 1er temps.

    Ensuite, j'aurais fait une réponse sérieuse ;-)

    • [^]Re: idée

      Posté par TImaniac (page perso, ) le 19/05/2005 à 21:49. (lien). Évalué à 2.

      Bah c'est pas si bête que ca, c pas bien compliqué en Java d'ajouter une ligne dans un fichier... Et si la classe qui "valide" tiens absolument à trouver cette info pour valider, je ne vois même pas d'autre solution... Elle ne te paraît peut être pas élégante mais elle a l'avantage d'être simple et rapide à mettre en oeuvre.

      • [^]Re: idée

        Posté par figus () le 19/05/2005 à 22:17. (lien). Évalué à 1.

        Merci pour tes précisions.

        Avant de me lancer dans cette solution, que je ne trouve effectivement pas élégante, je cherchais surtout à savoir s'il y avait mieux.

        Quant à la simplicité et la rapidité de la mise en oeuvre, c'est vite dit.
        En fait, les XML que je reçois sont susceptibles d'avoir une déclaration DOCTYPE ou pas. Donc c'est un peu chiant à gérer.

        Ne me demande pas pourquoi c'est comme ça, je n'ai pas la maitrise de cette partie là :-(

        • [^]Re: idée

          Posté par TImaniac (page perso, ) le 20/05/2005 à 07:32. (lien). Évalué à 2.

          ouahou, va falloir que t'introduise un if pour gérer les 2 cas, effectivement c'est peut être trop compliqué en fin de compte ;)

          • [^]Re: idée

            Posté par B r u n o (page perso, ) le 22/05/2005 à 16:55. (lien). Évalué à 1.

            Sinon, sur ce lien [http://java.sun.com/webservices/docs/1.0/tutorial/doc/JAXPSAX13.htm(...)] il semble qu'ils expliquent comment fournir un "schema" à ton parser. Et ils précisent qu'une DTD est considérée comme un schéma :

            There are multiple schema-definition languages, including RELAX NG, Schematron, and the W3C "XML Schema" standard. (Even a DTD qualifies as a "schema", although it is the only one that does not use XML syntax to describe schema constraints.) However, "XML Schema" presents us with a terminology challenge. While the phrase "XML Schema schema" would be precise, we'll use the phrase "XML Schema definition" to avoid the appearance of redundancy.



            Plus bas ils expliquent comment faire l'association :

            You can also specify the schema file in the application, using code like this:


            static final String JAXP_SCHEMA_SOURCE =
            "http://java.sun.com/xml/jaxp/properties/schemaSource(...)";

            ...
            SAXParser saxParser = spf.newSAXParser();
            ...
            saxParser.setProperty(JAXP_SCHEMA_SOURCE,
            new File(schemaSource));


            Il doit y avoir des options equivalentes pour un DOMParser. Il faut que ton implémentation du parseur supporte la propriété.

            Voila, en espérant que cela t'aide.

            Bon courage.

            • [^]Même problème

              Posté par ppost () le 06/06/2005 à 22:50. (lien). Évalué à 1.

              J'ai le même soucis, je souhaite valider un document XML en indiquant dynamiquement la DTD à utiliser.

              J'ai essayé la solution donnée ci dessus, mais j'obtiens un problème lors de l'appel de la méthode setProperty de la manière suivante :

              setProperty( "http://java.sun.com/xml/jaxp/properties/schemaSource", new File("monFichierDtd"));

              Je dois sûrement mal appeler cette méthode, mais je n'ai pas reçu à trouver de doc sur le net. Je ne sais pas exactement quelle propriété je dois initialiser...

              Avez vous de nouvelles pistes ?

              • [^]Re: Même problème

                Posté par figus () le 08/06/2005 à 08:36. (lien). Évalué à 1.

                Je n'ai pas essayé ce que propose B r u n o car c'est arrivé trop tard. Par contre je sais faire ce que tu recherches.

                C'est assez facile à faire, mais il y a une contrainte : ton XML doit avoir une déclaration DOCTYPE. Peu importe ce qu'elle contient, mais il doit y en avoir une.

                Voici donc ce que j'ai fait -- en espérant que ça corresponde à que tu cherches.

                Mon appli reçoit des XML validant différentes DTD. Je sais dire quelle DTD s'applique à tout XML reçu (c'est impératif pour la suite).

                Pour parvenir à tes fins, il faut implémenter un EntityResolver dans lequel tu associes dynamiquement la bonne DTD. L'EntityResolver (va voir la javadoc qui va bien) est utilisé par ton parser XML en phase "pré", c'est-à-dire avant même de parser ton XML. Le but étant d'instancier les entités présentes dans ton XML.

                Voici mon implémentation d'EntityResolver (que j'ai appelé DTDResolver) :


                public class DTDResolver implements EntityResolver {

                // the DTD file
                private String DTD = null;

                // constructor
                public DTDResolver(String DTDfile) {
                DTD = DTDfile;
                }

                public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
                // substitute the DTD
                // note it is correct behaviour to return null since this is the default fallback
                return new InputSource(new FileInputStream(DTD));
                }
                }

                A utiliser de cette manière (j'utilise JDOM donc tu pourrais avoir à l'adapter) :

                // create the XML parser with validation on
                SAXBuilder parser = new SAXBuilder(true);

                // specify the Entity Resolver
                parser.setEntityResolver(new DTDResolver(DTDfile));

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.java