Bonjour,
Après de longues recherches sur Internet je ne réussis toujours pas à résoudre mon souci alors je tente ma chance ici ! Mon problème est le suivant :

J'ai un programme java qui génère un fichier XML à partir d'informations en base de données. Jusque là pas de problème.
Dans la base de données se trouve une liste de fichiers XSD permettant de valider la structure de mon fichier XML validé. Ces fichiers XSD s'appellent les uns, les autres par le biais de la balise <xs:include schemaLocation="blabla.xsd"/>

Le problème est que lors de la validation du fichier XML avec un schema créé à partir de tous mes morceaux de XSD, le parser me renvoie une erreur du style :
"cvc-elt.1: Cannot find the declaration of element 'ELEMENT_ROOT_DE_MON_XML'."

Je précise que la validation se passe correctement quand je vais récupérer mes fichiers XSD directement sur le disque dur.

Mon code est actuellement celui-ci :
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
private Schema createSchema(FichiersXsd fichierXSDDeValidation)
            throws IOException, SAXException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
 
        List<FichiersXsd> listeXSD = listerRecursivementFichiersXsd(fichierXSDDeValidation);
        FichiersXsd[] tabXSD = listeXSD.toArray(new FichiersXsd[listeXSD.size()]);
        SAXSource[] tabSources = new SAXSource[tabXSD.length];
        for (int i = 0; i < tabXSD.length; i++) {
            tabSources[i] = new SAXSource(new InputSource(new ByteArrayInputStream(tabXSD[i].getContenuXsd().getBytes())));
        }
        ClasspathResourceResolver resolver = new ClasspathResourceResolver();
        resolver.setTabXSD(tabXSD);
        factory.setResourceResolver(resolver);
        return factory.newSchema(tabSources);
    }
La fonction listerRecursivementFichiersXsd sert à créer un tableau contenant tous les "morceaux" de XSD nécessaire pour reconstituer le XSD global.

avec un ResourceResolver de ce type :

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
private class ClasspathResourceResolver implements LSResourceResolver {
 
        private DOMImplementationLS domImplementationLS;
 
        private ClasspathResourceResolver() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
            System.setProperty(DOMImplementationRegistry.PROPERTY, "org.apache.xerces.dom.DOMImplementationSourceImpl");
            DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
            domImplementationLS = (DOMImplementationLS) registry.getDOMImplementation("LS");
        }
 
        @Override
        public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId,
                String baseURI) {
            LSInput lsInput = domImplementationLS.createLSInput();
            InputStream is = null;
            for (FichiersXsd fichier : tabXSD) {
                if (fichier.getNomXsd().equals(systemId)) {
                    is = new ByteArrayInputStream(fichier.getContenuXsd().getBytes());
                    lsInput.setByteStream(is);
                    lsInput.setEncoding("UTF-8");
                    break;
                }
            }
            return lsInput;
        }
        private FichiersXsd[] tabXSD;
 
        public void setTabXSD(FichiersXsd[] tab) {
            tabXSD = tab;
        }
Mon code effectuant la validation est le suivant :

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
public boolean doValidation(Document documentAValider, FichiersXsd fichierXSD) {
        try {
 
            SAXParserFactory factory = SAXParserFactory.newInstance();
            factory.setNamespaceAware(true);
            Schema schema = createSchema(fichierXSD);
 
            factory.setSchema(schema);
            SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(new InputSource(new ByteArrayInputStream(XMLUtils.xmlToString(documentAValider).getBytes())), new SaxHandler());
 
            System.out.println("Validation OK");
            return true;
        } catch (Exception ex) {
            System.err.println("Problème lors de la validation");
            ex.printStackTrace();
        }
        return false;
    }
Si vous pouviez éclairer ma lanterne, ce serait génial