[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:
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:
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:
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.