在Python的lxml中使用XML目录?

时间:2008-08-15 18:42:21

标签: python xml lxml

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

3 个答案:

答案 0 :(得分:7)

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

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

this thread。请注意,XML_CATALOG_FILES中的条目是以空格分隔的网址。您可以使用Python的pathname2urlurljoin(使用file:)从路径名生成网址。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

似乎lxml没有公开这个libxml2功能,grepping the source只会出现一些#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

catalog implementation in libxml2 page开始,/ etc / xml / catalog中的'透明'处理可能仍然可以在lxml中运行,但如果你需要更多,你可以随时放弃lxml并使用默认值python绑定,它公开了目录函数。