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.