将XML目录与Python的lxml一起使用?
时间:2020-03-05 18:39:56 来源:igfitidea点击:
当我使用lxml解析XML文档时,有没有一种方法可以使用外部目录文件根据其DTD验证该文档?我需要能够处理文档DTD中定义的固定属性。
解决方案
回答
你能给个例子吗?根据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绑定,确实公开了目录功能。