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 :

[XSD][Java]Valider un XML par rapport a un XSD


Sujet :

Valider XML

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [XSD][Java]Valider un XML par rapport a un XSD
    Bonjour,

    J'ai parcouru pendant pas mal de temps les forums tutoriaux et autres documents du site mais je n'arrive toujours pas à arriver à mes fins...

    Peut-être que quelqu'un pourra m'aider?

    Voilà ma problématique : je voudrais pouvoir valider à l'exécution de mon programme Java des fichiers XML par rapport à des fichiers XSD. Petite difficulté : les fichiers XML ne renseignent pas le schema qu'ils sont censés respecter.

    J'ai essayé pas mal de trucs (EntityResolver, les attributs et propriétés de SAX, ...) mais rien ne me permet d'arriver à mon but...

    J'utilise Xerces comme parser, pour info.

    Je mets ci dessous un bout de mon code mais il est sans doute erroné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    javax.xml.parsers.SAXParser parseur = fabrique.newSAXParser();
    parseur.setProperty(               "http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
    "http://www.toto.com/grs/xml/sip305");
     
    File fichier = new File("C:/temp/SIP305.xml");
    DefaultHandler handler = new DefaultHandler();
    parseur.parse(fichier, handler);
    Si quelqu'un peut m'apporter son aide ce serait super!!! Car cela fait 2 jours que je suis sur le problème et la lassitude commence à me gagner...

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Tu veux dire que tu ne sais pas quels schéma s'appliquent à quel fichiers XML ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Oui c'est à peu près cela.

    En fait, je reçois des fichiers XML correspondant à des fichiers XSD (que je connais dans mon application).
    Par contre, ces fihciers XML ne contiennent pas d'information par rapport au XSD qu'ils respectent. Je ne retrouve cette information qu'au moment de l'exécution de mon programme en fonction de la valeur d'un balise.
    A ce moment là, je sais (à l'exécution donc) quel Schema appliquer mais je n'arrive pas à coder la validation pour lui indiquer "en dur" le schema à appliquer...

    Merci de ton (votre) aide...

  4. #4
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Le site que tu m'as donné :

    http://www.oracle.com/technology/pub...xmlschema.html

    Est très bien fait... Et pour tout dire, je l'avais déjà trouvé ;-)

    Malheureusement, il parle de la validation de fichier XML qui renseignent le Schema auxquels ils se rapportent à l'intérieur du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="file://c:/Schemas/OracleCatalog.xsd"
    ...
    Or mon objectif est de valider des fichiers XML qui ne disent pas dans leur header le fichier xsd avec lequel ils doivent être validés...

    Merci quand même pour ton aide...

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    pour activer dans Xerces le support des schémas, il faut activer les fonctionnalités de validation du document et de support des schémas (désactivées par défaut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parseur.setFeature("http://xml.org/sax/features/validation", true);
    parseur.setFeature("http://apache.org/xml/features/validation/schema", true);
    D'autre part, as-tu vérifié :
    - qu'il ne manque pas l'extension .xsd à la fin de l'URL du schéma ?
    - que ta source XML ne comprend pas d'espace de noms ?

    Enfin, je te conseille d'utiliser JAXP plutôt que l'API de Xerces ; ton application gagnera en portabilité.

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Oui, j'ai bien activé le support des schémas...

    D'autre part, mon schema a bien l'extension .xsd et mon fichier XML est bien vierge (aucune en-tête à part la première ligne xml, et aucun espace de nom)...

    Par contre, maintenant, j'arrive à valider mais je dois retirer mes namespaces (targetNamespace et xmlns) de mon xsd pour que cela fonctionne...

    Voici ce que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    parser.setFeature("http://xml.org/sax/features/validation", true);
    parser.setFeature("http://apache.org/xml/features/validation/schema",true);
    parser.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
    "file:/C:/trav/jf/temp/SIP30_5.xsd");
    En utilisant la property, n'est-il pas possible de laisser mon xsd tel qu'il est (sans retirer targetNamespace et xmlns) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xs:schema xmlns="http://www.test.com/xml/sip305"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.test.com/xml/sip305"
        elementFormDefault="unqualified"
        attributeFormDefault="unqualified">
    	<xs:element name="FLUX">
    ...
    Merci encore pour le coup de main

  8. #8
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    oups...

    Il fallait lire "en utilisant la property http://apache.org/xml/properties/schema/external-schemaLocation"

    au lieu de :
    "en utilisant la property"...

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par sikapoch
    En utilisant la property, n'est-il pas possible de laisser mon xsd tel qu'il est (sans retirer targetNamespace et xmlns) :
    Il n'existe pas de propriété de Xerces qui permette de passer outre les espaces de nom déclarés dans le schéma, ça rendrait d'ailleurs le parsing très peu performant... Si ton schéma a été conçu pour valider un espace de nom bien précis, il faut soit lui fournir cet espace de nom (l'utiliser dans ta source XML), ou modifier le schéma.

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Donc, si je comprends bien :
    vu que mon fichier XML ne renseigne aucun namespace ni fichier xsd,
    mon fichier xsd ne doit pas utiliser de namespace (xmlns) ni targetNamespace ?

    Merci pour ton aide

  11. #11
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par sikapoch
    vu que mon fichier XML ne renseigne aucun namespace ni fichier xsd,
    mon fichier xsd ne doit pas utiliser de namespace (xmlns) ni targetNamespace ?
    Plus précisement, les noeuds de ton XML n'appartenant à aucun espace de noms, le schéma qui doit le valider ne doit pas en spécifier.

  12. #12
    Futur Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ok merci...

    Il me reste encore quelques problèmes mais il sont spécifiques à Java. Je suppose donc qu'il n'est pas besoin de les citer ici...

    Mais bon je tente quand même :

    J'arrive à valider mes fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SAXParser parser = new SAXParser();
    ...
    parser.setFeature("http://xml.org/sax/features/validation", true);
    parser.setFeature("http://apache.org/xml/features/validation/schema",true);
    parser.setProperty("http://apache.org/xml/properties/schema/external-noNamespaceSchemaLocation",
                                "file:/C:/.../toto.xsd");
    ...
    parser.parse("file:C:/.../toto.xml");
    ...
    Comment puis-je valider des XmlObject plutôt que de renseigner l'emplacement du fichier en local?

    Si ce n'est pas le bon endroit pour poser la question, je changerai le post...

Discussions similaires

  1. [XSD] Validation un xml par rapport à un xsd
    Par choixged dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 21/09/2011, 13h32
  2. [DOM] php4 : validation d'un fichier XML par rapport à un XSD
    Par nannous dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 25/02/2008, 09h43
  3. [DOM] Problème de validation XML par rapport à un Schéma XSD
    Par apisto dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 20/09/2006, 15h32
  4. [XSD][JAVA] Valider un XML avec un XSD schéma
    Par vad dans le forum Valider
    Réponses: 1
    Dernier message: 17/08/2005, 11h47
  5. Réponses: 3
    Dernier message: 27/01/2004, 16h15

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