2011-08-10 6 views
7

J'ai deux fichiers xsd pour valider un fichier XML. Mais le problème est que mon code ne prend qu'un xsd. Comment utiliser d'autres xsd dans le code suivant? Je n'ai pas idée de l'endroit où je devrais placer/appeler le 2ème fichier xsd.Validation XML - Utilisation de plusieurs fichiers xsd

   private void validate(File xmlF,File xsd1,File xsd2) { 
        try { 
         url = new URL(xsd.toURI().toString());// xsd1 
        } catch (MalformedURLException e) { 
         e.printStackTrace(); 
        } 


        source = new StreamSource(xml); // xml 
        try { 
         System.out.println(url); 
         schema = schemaFactory.newSchema(url); 
        } catch (SAXException e) { 
         e.printStackTrace(); 
        } 
        validator = schema.newValidator(); 
        System.out.println(xml); 
        try { 
         validator.validate(source); 
        } catch (SAXException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
+4

Avez-vous déjà essayé ['newSchema (Source [])'] (http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/SchemaFactory.html#newSchema (javax.xml .transform.Source []))? –

+0

Oui. J'ai essayé de cette façon. Cela ne fonctionne pas, probablement parce que Source [] est utilisé pour xml. Nous ne pouvons pas transcrire xsd en source. – freepublicview

+2

Comme pour la question précédente concernant ce projet de validation XML, je voudrais vous indiquer [SSCCE] (http://sscce.org/). Votre extrait de code est loin d'être complet car vous définissez des variables en dehors de cette méthode, etc. Mettre l'attention sur la façon dont vous posez votre question, nous aide à vous aider. – Wivani

Répondre

20

Beaucoup de résultats lors de la recherche sur SO ou Google. L'un d'eux est this question, où l'auteur a trouvé sa propre solution et indique le code suivant pour ajouter plusieurs XSD de la validateur:

Schema schema = factory().newSchema(new Source[] { 
    new StreamSource(stream("foo.xsd")), 
    new StreamSource(stream("Alpha.xsd")), 
    new StreamSource(stream("Mercury.xsd")), 
}); 

Cependant, lorsque l'on travaille directement avec InputStream sur StreamSource, le résolveur ne peut pas charger tous les fichiers XSD référencés. Si, par exemple, le fichier xsd1 importe ou inclut un troisième fichier (qui n'est pas xsd2), la création de schéma échouera. Vous devez définir l'identifiant système (setSystemId) ou (encore mieux) utiliser le constructeur StreamSource(File f).

ajusté à votre code exemple:

try { 
    schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    schema = schemaFactory.newSchema(new Source[] { 
    new StreamSource(xsd1), new StreamSource(xsd2) 
    }); 
} catch (SAXException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Note:

Si vous travaillez avec des ressources classpath, je préfère le constructeur StreamSource(String systemId) (plutôt que de créer un File):

new StreamSource(getClass().getClassLoader().getResource("a.xsd").toExternalForm()); 
+0

C'est une excellente solution. merci – freepublicview

+0

C'est exactement la même chose que ma question ci-dessus. –

+3

C'est la même solution que celle que vous avez proposée dans votre commentaire. C'est pourquoi j'ai upvoted votre commentaire. OP a eu du mal à le mettre en place; J'ai eu le code prêt dans mon Eclipse de répondre à sa question précédente et l'ai simplement ajusté pour montrer comment utiliser Source []. Pas de rancune, j'espère? – Wivani