10

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

4

3 回答 3

8

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

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

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

于 2011-12-05T20:54:36.420 回答
1

Can you give an example? According to the lxml validation docs, lxml can handle DTD validation (specified in the XML doc or externally in code) and system catalogs, which covers most cases I can think of.

f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
于 2008-08-16T07:57:53.657 回答
0

似乎 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 绑定,它确实公开了目录功能。

于 2008-08-30T18:10:33.757 回答