python lxml:从缓冲区导入XSD?

我正在使用python中的LXML来验证具有匹配XSD的XML.
XSD导入第二个“通用”XSD,其中包含一些常见的定义.
问题是这些XSD在本地不存在为文件.它们只是我在内存中保存的缓冲区,但是当XSD执行< import>时或者<重新定义>它在文件系统的当前目录中查找导入的文件.

有没有办法让它不那样做?也许提前提供进口的XSD?

LXML使用libxml2和libxslt进行解析.
导入的XSD文件的打开源自深层内部的libxml2代码,并且不通过python的文件处理,因此只是覆盖open()不起作用.似乎libxml2没有任何工具可以为它提供文件解析器.它只是直接调用fopen().

所以解决方案可能需要处于更高级别,可能会覆盖命名空间或类似的东西?

解决方法:

不要通过open()/ fopen()覆盖或更改源名称空间来解决问题,而应考虑使用XML目录或自定义URI解析程序.

XML Catalogs允许您控制:

>将外部实体的公共标识符和/或系统标识符映射到URI引用.
>将资源的URI引用(命名空间名称,样式表,图像等)映射到另一个URI引用.

您可以阅读如何将XML目录与libxml2 here一起使用.

虽然XML Catalog不会直接支持基于内存的XSD,但您可能能够找到比低级open()/ fopen()方法更好的覆盖方法.

但是,更有希望的方法可能是编写自定义URI解析器.自定义URI解析器的示例是provided in the lxml documentation

>>> 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)
上一篇:Python : 爬虫--解析网页


下一篇:python – 使用lxml删除xml节点