2009-10-22 4 views
0

je dois valider le fichier XML par rapport à un schéma XML afin que les informations de schéma est prise à partir du XML.Obtenir des informations de schéma XML à partir lors de la validation en Java

J'ai document XML qui définit son espace de noms. Comme ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<myelement xmlns="mynamespace"> 

</myelement> 

L'emplacement du schéma est pas dans le document que je dois donc dire au validateur où est le schéma d'espace de nom donné. En ce moment, je le fais de la manière suivante:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder parser = dbf.newDocumentBuilder(); 
Document document = parser.parse(new File("mydocument.xml")); 
String namespace = document.getChildNodes().item(0).getNamespaceURI(); 
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Source schemaFile = new StreamSource(new File(namespace + ".xsd")); 
Schema schema = factory.newSchema(schemaFile); 
Validator validator = schema.newValidator(); 
validator.setErrorHandler(new MyErrorHandler()); 
validator.validate(new DOMSource(document)); 

De cette façon, cela fonctionne, mais il a deux problèmes:

1) Il est un peu maladroit que je dois analyser le document manuellement d'abord et créer le schéma Bien que théoriquement, le validateur dispose de toutes les informations nécessaires pour le faire automatiquement.

2) Si je valide objet de document, je ne reçois pas les numéros de ligne correcte des erreurs. Pour obtenir les numéros de ligne corrects, je devrais analyser le même document deux fois (d'abord pour obtenir l'espace de noms et ensuite pour valider).

Quelqu'un sait-il une meilleure solution?

Est-il possible de dire que l'analyseur namespace1 correspond à Schema1.xsd, namespace2 à Schema2.xsd etc. avant l'analyse syntaxique? Ou puis-je écrire un type de rappel que l'analyseur peut utiliser pour demander le schéma (par exemple, je peux donner LSResourceResolver à SchemaFactory)?

Répondre

0

Actuellement, votre analyseur n'a aucun moyen de valider votre document par rapport à votre schéma car le schéma n'est pas disponible (et l'analyseur n'est même pas configuré pour valider votre document). Pour ce faire automatiquement, je pense qu'il ya deux options:

  1. modifier votre XML pour contenir l'attribut xsi: schemaLocation (pas sûr si cela est pris en charge du tout bien)

  2. enregistrez le schéma de votre espace de noms:

code:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Source schemaFile = new StreamSource(new File(namespace + ".xsd")); 
Schema schema = factory.newSchema(schemaFile); 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(true); 
dbf.setSchema(schema); 
+0

1. Il est possible de faire fonctionner si l'attribut schemaLocation est présent, mais dans mon cas, il est pas présent et je ne peux pas forcer à utiliser cet attribut. Je dois être capable de valider le document quand seul l'espace de noms est donné. 2. De cette façon, cela fonctionne mais il y a mon problème. Je ne sais pas quel schéma utiliser avant d'avoir jeté un coup d'oeil dans le document XML. Ce que je suis à la recherche est une façon de dire que l'analyseur namespace1 correspond à Schema1.xsd, namespace2 à Schema2.xsd etc. avant l'analyse syntaxique ou une option d'écrire une sorte de rappel qui l'analyseur peut utiliser pour demander le schéma . – martsraits

Questions connexes