2008-08-15 31 views
7

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

1

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") 
0

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.

6

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.