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:
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
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(); }
Et la je me prend la classique exception:
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(); }
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.
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'.
Toutes aides est la bienvenue.
Merci d'avance,
Olivier.
Partager