Outil de validation de schéma XML (XSD)? [fermé]

266

Au bureau, nous écrivons actuellement une application qui va générer des fichiers XML sur un schéma qui nous a été donné. Nous avons le schéma dans un fichier .XSD.

Existe-t-il des outils ou des bibliothèques que nous pouvons utiliser pour des tests automatisés afin de vérifier que le XML généré correspond au schéma?

Nous préférerions des outils gratuits appropriés à une utilisation commerciale, bien que nous ne regroupions pas le vérificateur de schéma, il ne doit donc être utilisable par les développeurs que pendant le développement.

Notre langage de développement est C ++ si cela fait une différence, bien que je ne pense pas qu'il devrait comme nous pourrions générer le fichier xml et ensuite faire la validation en appelant un programme distinct dans le test.

Jason Dagit
la source
132
J'adore combien de ces questions "non constructives" sont les meilleurs résultats de recherche Google des choses que je recherche et les réponses sont utiles
matt freake
1
Je comprends d'où ça vient avec le pas constructif. Honnêtement, bien que ce soit une excellente question et les débats / arguments finissent parfois par donner de bonnes réponses
Matt
22
c'est le cas exact où les administrateurs sont contre-productifs
anon58192932
Cela vaut peut-être la peine d'examiner une question similaire dans le contexte de l' outil de construction Maven .
Alberto
Essayez codverter.com/src/xmltoxsd
jonathana

Réponses:

239

Après quelques recherches, je pense que la meilleure réponse est Xerces , car il implémente tout XSD, est multiplateforme et largement utilisé. J'ai créé un petit projet Java sur github pour valider à partir de la ligne de commande en utilisant l'analyseur JRE par défaut, qui est normalement Xerces. Cela peut être utilisé sur Windows / Mac / Linux.

Il existe également une version C ++ de Xerces disponible si vous préférez l'utiliser. L' utilitaire StdInParse peut être utilisé pour l'appeler à partir de la ligne de commande. En outre, un commentateur ci-dessous pointe vers cet utilitaire d'encapsulation plus complet .

Vous pouvez également utiliser xmllint, qui fait partie de libxml . Vous l'avez peut-être déjà installé. Exemple d'utilisation:

xmllint --noout --schema XSD_FILE XML_FILE

Un problème est que libxml n'implémente pas toutes les spécifications, vous pouvez donc rencontrer des problèmes :(

Alternativement, si vous êtes sous Windows, vous pouvez utiliser msxml , mais vous aurez besoin d'une sorte de wrapper pour l'appeler, comme celui de l'interface graphique décrit dans cet article DDJ . Cependant, il semble que la plupart des gens sous Windows utilisent un éditeur XML, tel que Notepad ++ (comme décrit dans la réponse de Nate ) ou XML Notepad 2007 comme suggéré par SteveC (il existe également plusieurs éditeurs commerciaux que je ne mentionnerai pas ici).

Enfin, vous constaterez que différents programmes donneront malheureusement des résultats différents. Cela est largement dû à la complexité de la spécification XSD. Vous voudrez peut-être tester votre schéma avec plusieurs outils.

MISE À JOUR : J'ai développé cela dans un article de blog .

Adrian Mouat
la source
1
J'ai trouvé ce qui suit utile: jmvanel.free.fr/xsd/README.html
Matthew Hegarty
Un exemple d'utilisation de StdinParse (sous linux) peut être utile: StdInParse -n -s -f -v = always <XML_FILE. XML_FILE doit inclure l'emplacement du schéma. Pour moi, cela donne des résultats plus complets que xmllint.
helcim
3
Existe-t-il un moyen de demander à un programme d'utiliser xsi: schemaLocation au lieu d'alimenter tous les XSD manuellement?
Gabor Garami
@GaborGarami Pas pour le moment, mais c'est une demande de fonctionnalité: github.com/amouat/xsd-validator/issues/5
Adrian Mouat
1
xmllintn'est pas compatible avec les expressions rationnelles XML, malheureusement, donc certaines expressions rationnelles XML valides ne le traverseront pas
Sergey Bushmanov
112

Il existe un plugin pour Notepad ++ appelé XML Tools qui offre une vérification et une validation XML par rapport à un XSD.

Vous pouvez voir comment l'utiliser ici .

Nate
la source
5
-1, ce plugin est
pénible
2
J'ai testé avec npp 5.8.6, XMLTools 2.3.1 unicode beta2 r805, cela fonctionne très bien.
Palani
5
Super plugin. Consultez Notepad ++ XmlTools Not Installation pour obtenir de l'aide sur l'installation.
ladenedge
16
Et avec la version 5.8.7, le Plugin Manager de Notepad ++ ("Plugins / Plugin Manager") rend le processus d'installation automatique.
Alimenté
1
@FranzEbner J'ai eu ce même problème. Si le fichier XMLlui - même fait référence à un XSDfichier, par exemple xsi:noNamespaceSchemaLocation="file.xsd", alors XML Tools essaiera de l'utiliser au lieu de vous donner une boîte de dialogue "set".
theblang
22

xmlstarlet est un outil en ligne de commande qui fera cela et plus encore:

$ xmlstarlet val --help
Boîte à outils XMLStarlet: valider les documents XML
Utilisation: xmlstarlet val <options> [<xml-file-or-uri> ...]
où <options>
  -w ou - bien formé - valide uniquement la bonne forme (par défaut)
  -d ou --dtd <dtd-file> - validation par rapport à la DTD
  -s ou --xsd <xsd-file> - validation par rapport au schéma XSD
  -E ou --embed - valider en utilisant la DTD intégrée
  -r ou --relaxng <rng-file> - validation par rapport au schéma Relax-NG
  -e ou --err - affiche les messages d'erreur détaillés sur stderr
  -b ou --list-bad - liste uniquement les fichiers qui ne valident pas
  -g ou --list-good - liste uniquement les fichiers qui valident
  -q ou --quiet - ne répertorie pas les fichiers (retourne le code de résultat uniquement)

REMARQUE: les schémas XML ne sont pas encore entièrement pris en charge en raison de leur incomplet
      prise en charge dans libxml2 (voir http://xmlsoft.org)

XMLStarlet est une boîte à outils en ligne de commande pour interroger / éditer / vérifier / transformer
Documents XML (pour plus d'informations, voir http://xmlstar.sourceforge.net/)

Dans votre cas, l'utilisation serait dans le sens de:

xmlstarlet val --xsd your_schema.xsd your_file.xml
Charles Duffy
la source
3
Savez-vous à quel point l'avertissement est sérieux concernant le fait de ne pas prendre en charge complètement les schémas xml?
Jason Dagit
2
A en juger par d'autres réponses, xmlstarlet est un peu faible sur son implémentation xsd.
Jason Dagit,
3
Étant donné que xmlstarlet utilise simplement libxml2 sous le capot, il est probablement plus facile d'utiliser simplement xmllint qui est fourni avec libxml2 et expliqué dans la réponse acceptée.
Adrian Mouat
@JasonDagit, ... c'est exactement aussi faible que xmllint - ils utilisent la même implémentation de bibliothèque.
Charles Duffy
Le modèle de contenu n'est pas déterministe. :-(
Greg
16

Pour Windows, il existe le Bloc-notes XML gratuit 2007 . Vous pouvez sélectionner des XSD pour valider

MISE À JOUR: encore mieux, utilisez Notepad ++ avec le plugin XML Tools

SteveC
la source
3

J'utilise Xerces:

http://xerces.apache.org/xerces-c/

John
la source
1
Ont-ils une ligne de commande qui peut être utilisée à partir d'une console pour vérifier la validation d'un fichier XSLT par rapport au XSD de XSLT 2.0?
Alexis Wilke
Oui, vous pouvez installer un outil CLI avec sudo apt install libxerces-c-samplespuis vérifier le document avec StdInParse -v=always -n -s < document.xml.
jgrocha
2

J'apprends juste le schéma. J'utilise RELAX NG et j'utilise xmllint pour valider. Je suis frustré par les erreurs provenant de xmlllint. Je souhaite qu'ils soient un peu plus informatifs.

S'il y a un mauvais attribut dans le XML, alors xmllint vous indique le nom de l'attribut non pris en charge. Mais s'il vous manque un attribut dans le XML, vous obtenez simplement un message indiquant que l'élément ne peut pas être validé.

Je travaille sur du XML très compliqué avec des règles très compliquées, et je suis nouveau dans ce domaine, donc la recherche de l'attribut manquant prend beaucoup de temps.

Mise à jour: je viens de trouver un outil java que j'aime beaucoup. Il peut être exécuté à partir de la ligne de commande comme xmllint et il prend en charge RELAX NG: https://msv.dev.java.net/

Pengo
la source
2

Un éditeur XML pour une validation XML simple et rapide est disponible sur http://www.xml-buddy.com

Il vous suffit d'exécuter le programme d'installation et après cela, vous pouvez valider vos fichiers XML avec une application de bureau facile à utiliser ou la ligne de commande. De plus, vous bénéficiez également d'une assistance pour Schematron et RelaxNG. La validation par lots est également prise en charge ...

Mise à jour 13/01/2012: L'outil de ligne de commande est gratuit à utiliser et utilise Xerces comme analyseur XML.

Clemens
la source
1

IntelliJ IDEA est un excellent outil visuel pour valider et générer XSD à partir de XML, intuitif et simple.

jacktrade
la source
1

Vous pouvez connecter votre schéma XML à Intellisense de Microsoft Visual Studio. Cette option vous offre à la fois une validation en temps réel ET une saisie semi-automatique, ce qui est tout simplement génial.

J'ai ce scénario exact en cours d'exécution sur ma copie gratuite de Microsoft Visual C ++ 2010 Express.

AaronDanielson
la source
0

J'ai tendance à utiliser xsd de Microsoft pour générer le xsd à partir d'un fichier .NET. J'analyse également des sections du xml en utilisant xmlstarlet. Le dernier outil gratuit qui vous serait utile est altovaxml, qui est disponible à cette URL: http://www.altova.com/download_components.html .

Cela me permet d'analyser tous les fichiers xml en sélectionnant le xsd à utiliser en analysant le xml.

# Function:
#    verifyschemas - Will validate all xml files in a configuration directory against the schemas in the passed in directory
# Parameters:
#    The directory where the schema *.xsd files are located.  Must be using dos pathing like: VerifySchemas "c:\\XMLSchemas\\"
# Requirements:
#    Must be in the directory where the configuration files are located
#
verifyschemas()
{
    for FILENAME in $(find . -name '*.xml' -print0 | xargs -0)
    do
        local SchemaFile=$1$(getconfignamefromxml $FILENAME).xsd
        altovaxml /validate $FILENAME /schema $SchemaFile > ~/temp.txt 2> /dev/null
        if [ $? -ne 0 ]; then
            printf "Failed to verify: "
            cat ~/temp.txt | tail -1 | tr -d '\r'
            printf "    - $FILENAME with $SchemaFile\n"
        fi
    done
}

Pour générer le xml j'utilise: xsd DOTNET.dll / type: CFGCLASS & renommer schema0.xsd CFGCLASS.xsd

Pour obtenir le nom xsd que j'utilise: xmlstarlet sel -t -m / XXX / * -v nom-local () $ 1 | sed 's / $ //'

Cela me permet de récupérer le bon XSD en utilisant une balise d'élément dans le fichier xml.

Le résultat net est que je peux appeler une fonction bash pour analyser tous les fichiers XML et les vérifier. Même s'ils se trouvent dans plusieurs sous-répertoires.

Andrew Stern
la source