繁体   English   中英

使用带有 Python 的 lxml 的 XML 目录?

[英]Using an XML catalog with Python's lxml?

当我使用 lxml 解析 XML 文档时,有没有办法使用外部目录文件根据其 DTD 验证该文档? 我需要能够使用文档 DTD 中定义的固定属性。

您可以将目录添加到XML_CATALOG_FILES环境变量:

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

看到这个线程 请注意, XML_CATALOG_FILES中的条目是以空格分隔的 URL。 您可以使用 Python 的pathname2urlurljoin (使用file: )从路径名生成 URL。

你能给个例子吗? 根据lxml验证文档,lxml可以处理DTD验证(在XML文档中指定或在代码中外部指定)和系统目录,涵盖了我能想到的大多数情况。

f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")

似乎 lxml 没有公开这个 libxml2 功能,grepping 源只会出现一些用于错误处理的#defines:

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

libxml2 页面中目录实现来看,通过安装在 /etc/xml/catalog 中的“透明”处理似乎仍然可以在 lxml 中工作,但是如果您需要更多,您可以随时放弃 lxml 并使用默认的 python 绑定,这确实公开了目录功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM