我正在使用来自python的LXML来验证具有匹配XSD的XML。
该XSD导入了第二个“通用” XSD,其中包括一些通用定义。
问题是这些XSD在本地不作为文件存在。它们只是我在内存中保留的缓冲区,但是当XSD保留它<import>
或<redefine>
它在文件系统的当前目录中寻找导入的文件时。
有没有办法使它不这样做?也许提前提供进口的XSD?
LXML使用libxml2和libxslt进行解析。
导入的XSD文件的打开源自libxml2代码的深入内部,并且不经过python的文件处理,因此,覆盖open()
无效。似乎libxml2没有任何工具为其提供文件解析器。它只是fopen()
直接调用。
因此,解决方案可能需要更高的级别,或者覆盖名称空间或类似的名称?
与其通过open()/fopen()
覆盖或更改源名称空间来解决问题,不如考虑使用XML Catalogs或自定义URI解析器。
XML目录使您可以控制:
您可以在此处阅读如何将XML目录与libxml2一起使用。
虽然XML目录将不直接支持基于内存的XSD,但您可能能够找到比低级方法更好的替代open()/fopen()
方法。
但是,更有希望的方法可能是编写自定义URI解析器。lxml文档中提供了一个示例自定义URI解析器:
>>> from lxml import etree
>>> class DTDResolver(etree.Resolver):
... def resolve(self, url, id, context):
... print("Resolving URL '%s'" % url)
... return self.resolve_string(
... '<!ENTITY myentity "[resolved text: %s]">' % url, context)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句