【发布时间】:2011-09-21 13:23:46
【问题描述】:
我正在使用 Python 的 suds 库,它试图通过网络获取 xml.xsd。不幸的是,w3c 服务器由于像我这样的其他程序而受到重创,通常无法提供文档。
如何拦截 suds 的 URL 获取以始终获取此文件的本地副本,即使无需第一次成功将其下载到长期缓存中?
【问题讨论】:
我正在使用 Python 的 suds 库,它试图通过网络获取 xml.xsd。不幸的是,w3c 服务器由于像我这样的其他程序而受到重创,通常无法提供文档。
如何拦截 suds 的 URL 获取以始终获取此文件的本地副本,即使无需第一次成功将其下载到长期缓存中?
【问题讨论】:
获取 xml.xsd 的问题与大多数 WSDL 所需的“http://www.w3.org/XML/1998/namespace”命名空间有关。这个命名空间默认映射到http://www.w3.org/2001/xml.xsd。
您可以覆盖此命名空间的位置绑定以指向本地文件:
from suds.xsd.sxbasic import Import
file_url = 'file://<path to xml.xsd>'
Import.bind('http://www.w3.org/XML/1998/namespace', file_url)
【讨论】:
suds 库有一个 suds.store.DocumentStore 类,它将捆绑的 XML 保存在 uri -> 文本字典中。可以这样打补丁:
suds.store.DocumentStore.store['www.w3.org/2001/xml.xsd'] = \
file('xml.xsd', 'r').read()
不幸的是,这不起作用,因为DocumentStore 只接受suds:// 协议的请求。一个猴子补丁之后,你就开始做生意了。
也可以覆盖传递给您的 suds Client() 的 Cache() 实例,但缓存处理基于 Python 的 hash() 的数字 id,并且不会获取其内容的 URL。
【讨论】: