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 :

[DOM] - Valider un org.w3c.dom.Document construit programmatiquement avec un XSD


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut [DOM] - Valider un org.w3c.dom.Document construit programmatiquement avec un XSD
    Bonjour la communauté Java,

    Voila le problème sur lequel je me tape la tête sur le clavier depuis plusieurs jour.
    D'un côté je créé un document XML de cet manière:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
        try {
          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
          factory.setNamespaceAware(true);
     
          Source schemaFile = new StreamSource(new File("data/toto.xsd"));
     
          SchemaFactory sfactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
     
          Schema schema = sfactory.newSchema(schemaFile);
     
          factory.setSchema(schema);
     
          factory.setValidating(true);
     
          DocumentBuilder builder = factory.newDocumentBuilder();
     
          outputDocument = builder.newDocument();
     
          outputRoot = outputDocument.createElement("Toto");
     
          String xmlnsUri = "http://www.w3.org/2000/xmlns/";
          String xsiUri   = "http://www.w3.org/2001/XMLSchema-instance";
     
          Attr xsi      = outputDocument.createAttributeNS(xmlnsUri, "xmlns:xsi"                    );
          Attr location = outputDocument.createAttributeNS(xsiUri  , "xsi:noNamespaceSchemaLocation");
     
          xsi     .setValue("http://www.w3.org/2001/XMLSchema-instance");
          location.setValue("toto.xsd");
     
          outputRoot.setAttributeNodeNS(xsi     );
          outputRoot.setAttributeNodeNS(location);
     
          outputDocument.appendChild(outputRoot);
        } catch (ParserConfigurationException e) {
          e.printStackTrace();
        } catch (SAXException e) {
          e.printStackTrace();
        }
    De l'autre je valide, après remplissage du DOM, avec ce 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
     
        try {
          SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
     
          Source schemaFile = new StreamSource(new File("data/toto.xsd"));
     
          Schema schema = factory.newSchema(schemaFile);
     
          Validator validator = schema.newValidator();
     
          // status.getOutputDocument() retourne outputDocument précédemment créé 
          validator.validate(new DOMSource(status.getOutputDocument()));
        } catch (SAXException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
    Et la je me prend la classique exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cvc-elt.1: Impossible de trouver la d?claration de l'?l?ment 'Toto'.
    Mais la où ça devient intéressant, c'est que si je prend mon DOM et que je le dump dans un fichier en utilisant javax.xml.transform.Transformer. Et que ensuite je charge ce fichier dans un DOM et que je le valide avec exactement le même code, la ça marche.

    Toutes aides est la bienvenue.

    Merci d'avance,
    Olivier.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Attr xsi = outputDocument.createAttributeNS(xmlnsUri, "xmlns:xsi");
    Un truc comme ça devrait méchamment faire conflit avec la gestion normale des namespaces.

    On ne doit pas déclarer les namespaces en "ajoutant un attribut qui le déclare". L'implémentation de Document est censée s'en charger toute seule.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    C'est ce que je me suis dis aussi mais si j'enlève le namespace devant le nom de mes attributs, je prend un exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.w3c.dom.DOMException: NAMESPACE_ERR: La tentative de cr‚ation ou de modification de l'objet n'est pas conforme … la syntaxe des espaces de noms.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je m'en doute bien, mais ce sont les xmlns:* qu'il ne faut pas mettre. Ce ne sont pas des attributs, ce sont des déclarations de namespace. Ce n'est pas à toi de les gérer, donc.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 23
    Par défaut
    Justement c'est ça que je dis, quand j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Attr xsi = outputDocument.createAttributeNS(xmlnsUri, "xsi");
    C'est la que je me mange l'exception.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pour l'amour du ciel, vire cette ligne. Je dois le dire en quelle langue que tu fais un truc que tu es pas censé faire ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/09/2008, 12h59
  2. Passage de org.w3c.dom.document à XML
    Par Ikare dans le forum Flex
    Réponses: 2
    Dernier message: 03/06/2008, 18h07
  3. [DOM] org.w3c.dom.Document toujours vide
    Par LGnord dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 05/12/2007, 13h45
  4. Créer un org.w3c.dom.Document depuis une String
    Par BouB dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 22/06/2007, 16h02
  5. [DOM] Récupérer contenu d'un objet de type org.w3c.dom.Document dans une chaine de caractèr
    Par danyboy85 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 18/01/2007, 10h38

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