Existe-t-il un moyen, lorsque j'analyse un document XML en utilisant lxml, de valider ce document par rapport à sa DTD en utilisant un fichier de catalogue externe? Je dois être capable de travailler les attributs fixes définis dans la DTD d'un document.Utiliser un catalogue XML avec lxml de Python?
Répondre
Pouvez-vous donner un exemple? Selon le lxml validation docs, lxml peut gérer la validation DTD (spécifiée dans le document XML ou en externe dans le code) et les catalogues système, ce qui couvre la plupart des cas auxquels je peux penser.
f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
Il semble que lxml ne pas exposer cette fonctionnalité libxml2, grepper la source ne tourne que quelques #defines pour la gestion des erreurs:
C:\Dev>grep -ir --include=*.px[id] catalog lxml-2.1.1/src | sed -r "s/\s+/ /g"
lxml-2.1.1/src/lxml/dtd.pxi: catalog.
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_FROM_CATALOG = 20 # The Catalog module
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_WAR_CATALOG_PI = 93 # 93
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_MISSING_ATTR = 1650
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_ENTRY_BROKEN = 1651 # 1651
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_PREFER_VALUE = 1652 # 1652
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_NOT_CATALOG = 1653 # 1653
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_RECURSION = 1654 # 1654
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG=20
lxml-2.1.1/src/lxml/xmlerror.pxi:WAR_CATALOG_PI=93
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_MISSING_ATTR=1650
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_ENTRY_BROKEN=1651
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_PREFER_VALUE=1652
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_NOT_CATALOG=1653
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_RECURSION=1654
De l'catalog implementation in libxml2 page il semble possible que la « transparence » la manipulation par l'installation dans/etc/xml/catalog peut encore fonctionner dans lxml, mais si vous avez besoin de plus, vous pouvez toujours abandonner lxml et utiliser les bindings python par défaut, qui exposent les fonctions du catalogue.
Vous pouvez ajouter le catalogue à la variable d'environnement XML_CATALOG_FILES
:
os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'
Voir this thread. Notez que les entrées dans XML_CATALOG_FILES
sont des URL séparées par des espaces. Vous pouvez utiliser les codes pathname2url
et urljoin
de Python (avec file:
) pour générer l'URL à partir d'un chemin d'accès.