111 votes

Valider avec un schéma XML en Python

J'ai un fichier XML et un schéma XML dans un autre fichier et j'aimerais valider que mon fichier XML respecte le schéma. Comment puis-je faire cela en Python ?

Je préférerais quelque chose qui utilise la bibliothèque standard, mais je peux installer un paquet tiers si nécessaire.

62voto

Je suppose que vous voulez dire utiliser des fichiers XSD. Étonnamment, il n'y a pas beaucoup de bibliothèques XML en python qui supportent cela. lxml le fait cependant. Consultez Validation avec lxml . Cette page indique également comment utiliser lxml pour valider avec d'autres types de schémas.

1 votes

Lxml est du pur python ou pas ? (nécessite une compilation/installation ou vous pouvez simplement l'inclure dans vos scripts python)

10 votes

@Sorin : lxml est une enveloppe au-dessus de la bibliothèque C libxml2, et n'est donc pas purement Python.

3 votes

C'est exactement ce que je voulais souligner, cela peut ne pas convenir à tout le monde.

27voto

Steven Points 10243

Quant aux solutions "purement python", l'index des paquets en donne la liste :

  • pyxsd La description indique qu'il utilise xml.etree.cElementTree, qui n'est pas "pur python" (mais inclus dans stdlib), mais le code source indique qu'il se rabat sur xml.etree.ElementTree, donc cela compterait comme du pur python. Je ne l'ai pas utilisé, mais d'après la documentation, il fait de la validation de schéma.
  • minixsv : 'un validateur de schéma XML léger écrit en "pur" Python'. Cependant, la description dit "actuellement un sous-ensemble de la norme de schéma XML est supporté", donc cela peut ne pas être suffisant.
  • XSV qui, je pense, est utilisé pour le validateur xsd en ligne du W3C (il semble toujours utiliser l'ancien paquet pyxml, qui, je pense, n'est plus maintenu).

5 votes

Je préférerais PyXB à ceux-ci. La dernière mise à jour de pyxsd date de 2006, celle de minixsv de 2008, celle de XSV de 2007 pour autant que je sache. Ce n'est pas toujours la meilleure raison de considérer un paquet plutôt qu'un autre, mais je pense que c'est justifié dans ce cas.

2 votes

+1 pour PyXB. Je l'utilise dans Django pour valider le XML brut inséré dans la section Admin. Simple et facile à utiliser.

13voto

pabigot Points 356

Le paquet PyXB à http://pyxb.sourceforge.net/ génère des liaisons de validation pour Python à partir de documents de schéma XML. Il gère presque toutes les constructions de schémas et supporte plusieurs espaces de noms.

7voto

hinoglu Points 825

Lxml fournit etree.DTD

des tests sur http://lxml.de/api/lxml.tests.test_dtd-pysrc.html

...
root = etree.XML(_bytes("<b/>")) 
dtd = etree.DTD(BytesIO("<!ELEMENT b EMPTY>")) 
self.assert_(dtd.validate(root))

3voto

fulmicoton Points 5389

Si vous travaillez avec dtd, vous apprécierez peut-être ceci recette

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X