¿Hay alguna manera, cuando analizo un documento XML usando lxml, de validar ese documento con su DTD utilizando un archivo de catálogo externo? Necesito poder trabajar con los atributos fijos definidos en la DTD de un documento.¿Utiliza un catálogo XML con el lxml de Python?
Respuesta
¿Puedes dar un ejemplo? De acuerdo con lxml validation docs, lxml puede manejar la validación DTD (especificada en el documento XML o externamente en el código) y los catálogos del sistema, que cubre la mayoría de los casos que se me ocurren.
f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
Parece que lxml no expone esta característica libxml2, grepping la única fuente se convierte en imagen algunas #defines para el tratamiento de errores:
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
Desde el catalog implementation in libxml2 page parece posible que el 'transparente' el manejo a través de la instalación en/etc/xml/catalogue aún puede funcionar en lxml, pero si necesita más, siempre puede abandonar lxml y usar los enlaces de python predeterminados, que sí exponen las funciones del catálogo.
Puede añadir el catálogo de la variable de entorno XML_CATALOG_FILES
:
os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'
Ver this thread. Tenga en cuenta que las entradas en XML_CATALOG_FILES
son URL separadas por espacios. Puede usar Python's pathname2url
y urljoin
(con file:
) para generar la URL a partir de una ruta de acceso.
- 1. Impresora XML bonita de Python con lxml
- 2. XML analizando con lxml y Python
- 3. Python Lxml: anexe un xml existente con datos nuevos
- 4. Uso de un catálogo XML con una biblioteca Java que utiliza JAXP internamente
- 5. Escribir el archivo xml usando la biblioteca lxml en Python
- 6. Python - Validación con varios esquemas usando lxml
- 7. Codificación en python con lxml: solución compleja
- 8. Analizar xml con lxml - extraer el valor del elemento
- 9. Python sax a lxml para 80 + GB XML
- 10. análisis de un archivo xml grande con Python - etree.parse error
- 11. Creando un doctype con el etree de lxml
- 12. Múltiples espacios de nombres XML en la etiqueta con LXML
- 13. cómo pasar un archivo xml a lxml para analizar?
- 14. lxml ¿Crear fragmento XML sin elemento raíz?
- 15. ¿Cómo debo manejar un XMLSyntaxError en el archivo lxml de Python al analizar un archivo XML de gran tamaño?
- 16. Instalación módulo lxml en Python
- 17. Python lxml y la entrada estándar
- 18. python [lxml] - limpieza de etiquetas html
- 19. Python XML Parsing
- 20. Clojure equivalente a la biblioteca lxml de Python?
- 21. python lxml en el motor de la aplicación?
- 22. Magento getUrl no funciona con el objeto catálogo/categoría?
- 23. ¿Cómo encontrar de forma recursiva una etiqueta XML utilizando LXML?
- 24. Beautifulsoup4 con lxml contra Beautifulsoup3
- 25. ¿Hay algún catálogo de patrones de metaprogramación para Python?
- 26. Setup.py: instalar lxml con Python2.6 en CentOS
- 27. Py2exe lxml woes
- 28. ¿Utiliza Python xmlrpclib con conectores de dominio Unix?
- 29. Problema al usar py2app con el paquete lxml
- 30. easy_install lxml en Python 2.7 en Windows