在Python lxml中使用XML目录?
有没有办法在使用lxml解析XML文档时,利用一个外部目录文件来验证这个文档是否符合它的DTD?我需要能够处理文档的DTD中定义的固定属性。
3 个回答
0
看起来lxml这个库并没有提供libxml2的一些功能,查找源代码只发现了一些关于错误处理的定义:
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自带的绑定,这样就能使用目录功能了。
1
你能给个例子吗?根据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")
9
你可以把目录添加到 XML_CATALOG_FILES
这个环境变量里:
os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'
可以参考 这个讨论串。需要注意的是,XML_CATALOG_FILES
里的条目是用空格分开的网址。你可以使用 Python 的 pathname2url
和 urljoin
(加上 file:
)来从文件路径生成网址。