Usando um catálogo de XML com lxml do Python?

votos
7

Existe uma maneira, quando eu analisar um documento XML usando lxml, para validar esse documento contra a sua DTD usando um arquivo de catálogo externo? Eu preciso ser capaz de trabalhar os atributos fixos definidos no DTD de um documento.

Publicado 15/08/2008 em 19:42
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Você pode adicionar o catálogo para a XML_CATALOG_FILESvariável de ambiente:

os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'

Veja esta discussão . Note-se que as entradas na XML_CATALOG_FILESsão URLs separados por espaços. Você pode usar Python pathname2urle urljoin(com file:) para gerar a URL de um caminho.

Respondeu 05/12/2011 em 21:54
fonte usuário

votos
1

Você pode dar um exemplo? De acordo com os documentos de validação lxml , lxml pode lidar com a validação DTD (especificado no documento XML ou externamente no código) e catálogos do sistema, que abrange a maioria dos casos que posso pensar.

f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
Respondeu 16/08/2008 em 08:57
fonte usuário

votos
0

Parece que lxml não expõe esse recurso libxml2, grepping a única fonte transforma-se alguns # define para o tratamento de erros:

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

A partir da aplicação de catálogo na página libxml2 parece possível que o 'transparente' manipulação por meio da instalação em / etc / xml / catálogo pode ainda trabalhar em lxml, mas se precisar de mais do que você sempre pode abandonar lxml e usar os vínculos python padrão, que exponha as funções de catálogo.

Respondeu 30/08/2008 em 19:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more