2010-11-26 35 views
2

J'ai du code Java qui valide le XML par rapport à un XSD. J'utilise une version modifiée du gestionnaire d'erreurs trouvé ici: http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html pour attraper et enregistrer toutes les exceptions lors de la validation.Traduction des exceptions SAX

Les erreurs sont très laconiques, ils ressemblent à ceci:

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.myschema.com/schema":txn} 

D'autres messages tels que

http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:attributes&{"http://www.myschema.com/schema":sequence} 

sont encore plus énigmatiques.

Existe-t-il un moyen facile d'obtenir un message clair et intelligible à partir de SAX expliquant ce qui s'est passé ici? Je pense que dans la première erreur, il attendait txn et à la place trouvé l'élément cID. MAIS ... Je ne connais pas toutes les erreurs possibles qui pourraient être générées par SAX, donc je préfère ne pas essayer de créer manuellement une table de traduction.

Les utilisateurs éventuels de cette sortie sont pour la plupart non techniques, je dois donc pouvoir générer des messages simples et clairs tels que "l'élément txn était hors séquence".

Si elle aide, voici le code (plus ou moins) qui est utilisé pour la validation:

Source schema1 = new StreamSource(new File("resources/schema1.xsd")); 
Source schema2 = new StreamSource(new File("resources/schema2.xsd")); 
Source[] sources = {schema1,schema2}; 
validator = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(sources).newValidator(); 
ErrorHandler lenient = new ForgivingErrorHandler(); 
validator.setErrorHandler(lenient); 

Ailleurs ...

StreamSource xmlSource = new StreamSource(new StringReader(XMLData)); 
try 
{ 
    validator.validate(xmlSource); 
} 
catch (SAXException e) 
{ 
    logger.error("XML Validation Error: ",e); 
} 

Répondre

0

Eh bien, il semble que je devais ajouter xsi:schemaLocation="http://www.mycompany.com/schema resources/schema1.xsd " au Document XML, car s:http://www.mycompany.com/schema est l'espace de noms par défaut: xmlns="s:http://www.mycompany.com/schema". Bien sûr, je n'ai pas accès à modifier l'outil qui génère le XML, donc le hack laid suivant était nécessaire:

xmlDataStr = xmlDataStr.replace("<rootNode ", "<rootNode xsi:schemaLocation=\"http://www.mycompany.com/schema resources/schema1.xsd \" "); 

... Bien sûr, maintenant que je reçois des erreurs doubles de validation! A une claire et intelligible tels que:

 
cvc-complex-type.2.4.a: Invalid content was found starting with element 's:cID'. One of '{"http://www.mycompany.ca/schema":tdr}' is expected. 

immédiatement suivie par:

 
http://www.w3.org/TR/xml-schema-1#cvc-complex-type.2.4.a?s:cID&{"http://www.mycompany.com/schema":tdr} 

La double erreur est gênant, mais au moins le premier est utilisable ...