Je génère des fichiers xml qui doivent être conformes à un fichier xsd qui m'a été donné. Quelle est la meilleure façon de vérifier leur conformité?
la source
Je génère des fichiers xml qui doivent être conformes à un fichier xsd qui m'a été donné. Quelle est la meilleure façon de vérifier leur conformité?
La bibliothèque d'exécution Java prend en charge la validation. La dernière fois que j'ai vérifié, c'était l'analyseur Apache Xerces sous les couvertures. Vous devriez probablement utiliser un javax.xml.validation.Validator .
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd:
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}
La constante de fabrique de schéma est la chaîne http://www.w3.org/2001/XMLSchema
qui définit les XSD. Le code ci-dessus valide un descripteur de déploiement WAR par rapport à l'URL, http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
mais vous pouvez tout aussi facilement valider par rapport à un fichier local.
Vous ne devez pas utiliser DOMParser pour valider un document (à moins que votre objectif ne soit de toute façon de créer un modèle d'objet de document). Cela commencera à créer des objets DOM lors de l'analyse du document, ce qui est inutile si vous ne les utilisez pas.
Voici comment le faire en utilisant Xerces2 . Un tutoriel pour cela, ici (inscription requise).
Attribution originale: copiée de façon flagrante à partir d' ici :
la source
Nous construisons notre projet en utilisant ant, afin que nous puissions utiliser la tâche schemavalidate pour vérifier nos fichiers de configuration:
Maintenant, les fichiers de configuration coquins échoueront dans notre build!
http://ant.apache.org/manual/Tasks/schemavalidate.html
la source
Puisque c'est une question populaire, je soulignerai que java peut également valider par rapport aux xsd "référencés", par exemple si le fichier .xml lui-même spécifie les XSD dans l'en-tête, en utilisant
xsi:SchemaLocation
ouxsi:noNamespaceSchemaLocation
(ou xsi pour des espaces de noms particuliers) ex :ou SchemaLocation (toujours une liste d'espaces de noms aux mappages xsd)
Les autres réponses fonctionnent également ici, car les fichiers .xsd sont "mappés" aux espaces de noms déclarés dans le fichier .xml, car ils déclarent un espace de noms, et si cela correspond à l'espace de noms dans le fichier .xml, vous êtes bon. Mais parfois c'est pratique d'avoir un résolveur personnalisé ...
À partir des javadocs: "Si vous créez un schéma sans spécifier d'URL, de fichier ou de source, le langage Java en crée un qui examine le document en cours de validation pour trouver le schéma qu'il doit utiliser. Par exemple:"
et cela fonctionne pour plusieurs espaces de noms, etc. Le problème avec cette approche est que
xmlsns:xsi
c'est probablement un emplacement réseau, donc il va par défaut s'éteindre et frapper le réseau avec chaque validation, pas toujours optimale.Voici un exemple qui valide un fichier XML par rapport aux références informatiques de n'importe quel XSD (même s'il doit les extraire du réseau):
Vous pouvez éviter de tirer les XSD référencés du réseau, même si les fichiers xml font référence aux URL, en spécifiant le xsd manuellement (voir d'autres réponses ici) ou en utilisant un résolveur de style "catalogue XML" . Spring peut également intercepter les demandes d'URL pour servir des fichiers locaux pour les validations. Ou vous pouvez définir le vôtre via setResourceResolver , par exemple:
Voir aussi ici pour un autre tutoriel.
Je crois que la valeur par défaut est d'utiliser l'analyse DOM, vous pouvez faire quelque chose de similaire avec l'analyseur SAX qui valide également
saxReader.setEntityResolver(your_resolver_here);
la source
setResourceResolver
mais au-delà, ouvrez peut-être une nouvelle question ...En utilisant Java 7, vous pouvez suivre la documentation fournie dans la description du package .
la source
parser.parse(new File("instance.xml"))
. L'validator
accepte unSource
, vous pouvez:validator.validate(new StreamSource(new File("instance.xml")))
.ErrorHandler
si vous avez besoin de faire une validation.Si vous avez une machine Linux, vous pouvez utiliser l'outil de ligne de commande gratuit SAXCount. J'ai trouvé cela très utile.
Il valide contre dtd et xsd. 5s pour un fichier de 50 Mo.
Dans Debian Squeeze, il se trouve dans le paquet "libxerces-c-samples".
La définition du dtd et du xsd doit être dans le xml! Vous ne pouvez pas les configurer séparément.
la source
xmllint --schema phone.xsd phone.xml
(d'après une réponse de 13ren)Une autre réponse: puisque vous avez dit que vous devez valider les fichiers que vous générez (écriture), vous voudrez peut-être valider le contenu pendant que vous écrivez, au lieu de d'abord écrire, puis relire pour validation. Vous pouvez probablement le faire avec l'API JDK pour la validation Xml, si vous utilisez un écrivain basé sur SAX: si c'est le cas, liez simplement le validateur en appelant 'Validator.validate (source, result)', où la source provient de votre écrivain, et le résultat est où la sortie doit aller.
Alternativement, si vous utilisez Stax pour écrire du contenu (ou une bibliothèque qui utilise ou peut utiliser stax), Woodstox peut également prendre en charge directement la validation lors de l'utilisation de XMLStreamWriter. Voici une entrée de blog montrant comment cela se fait:
la source
Si vous générez des fichiers XML par programme, vous souhaiterez peut-être consulter la bibliothèque XMLBeans . À l'aide d'un outil en ligne de commande, XMLBeans générera et conditionnera automatiquement un ensemble d'objets Java basé sur un XSD. Vous pouvez ensuite utiliser ces objets pour créer un document XML basé sur ce schéma.
Il prend en charge la validation de schéma et peut convertir des objets Java en document XML et vice-versa.
Castor et JAXB sont d'autres bibliothèques Java qui ont un objectif similaire à XMLBeans.
la source
Avec JAXB, vous pouvez utiliser le code ci-dessous:
la source
Vous recherchez un outil ou une bibliothèque?
En ce qui concerne les bibliothèques, la norme de facto est à peu près Xerces2, qui a à la fois des versions C ++ et Java .
Soyez averti cependant, c'est une solution lourde. Mais là encore, la validation de XML par rapport aux fichiers XSD est un problème assez lourd.
Quant à un outil pour le faire pour vous, XMLFox semble être une solution freeware décente, mais ne l'ayant pas utilisé personnellement, je ne peux pas le dire avec certitude.
la source
Valider par rapport aux schémas en ligne
Valider par rapport aux schémas locaux
Validation XML hors ligne avec Java
la source
À l'aide de Woodstox , configurez l'analyseur StAX pour valider par rapport à votre schéma et analyser le XML.
Si des exceptions sont interceptées, le XML n'est pas valide, sinon il est valide:
Remarque : Si vous devez valider plusieurs fichiers, vous devez essayer de réutiliser votre
XMLInputFactory
etXMLValidationSchema
afin de maximiser les performances.la source
J'ai dû valider un XML contre XSD une seule fois, j'ai donc essayé XMLFox. Je l'ai trouvé très déroutant et bizarre. Les instructions d'aide ne semblaient pas correspondre à l'interface.
J'ai fini par utiliser LiquidXML Studio 2008 (v6) qui était beaucoup plus facile à utiliser et plus immédiatement familier (l'interface utilisateur est très similaire à Visual Basic 2008 Express, que j'utilise fréquemment). L'inconvénient: la capacité de validation n'est pas dans la version gratuite, j'ai donc dû utiliser la version d'essai de 30 jours.
la source