如何防止 suds 通过网络获取 xml.xsd?

发布于 2024-12-06 06:42:47 字数 147 浏览 0 评论 0原文

我正在使用 Python 的 suds 库,它尝试通过网络获取 xml.xsd。不幸的是,w3c 服务器由于像我这样的其他程序而受到攻击,通常无法提供该文档。

如何拦截 suds 的 URL 获取以始终获取该文件的本地副本,即使无需第一次将其成功下载到长期缓存中?

I'm using Python's suds library which tries to fetch xml.xsd over the network. Unfortunately, the w3c server is hammered due to other programs like mine and cannot usually serve the document.

How do I intercept suds' URL fetching to always grab a local copy of this file, even without having to download it into a long-lived cache successfully the first time?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹿港巷口少年归 2024-12-13 06:42:47

获取 xml.xsd 的问题与“http://www.w3.org/XML/1998/namespace”命名空间有关,大多数 WSDL 都需要该命名空间。该命名空间默认映射到 http://www.w3.org/2001/xml.xsd< /a>.

您可以覆盖此名称空间的位置绑定以指向本地文件:

from suds.xsd.sxbasic import Import

file_url = 'file://<path to xml.xsd>'
Import.bind('http://www.w3.org/XML/1998/namespace', file_url)

The problem with fetching xml.xsd has to do with the "http://www.w3.org/XML/1998/namespace" namespace, which is required for most WSDLs. This namespace is mapped by default to http://www.w3.org/2001/xml.xsd.

You may override the location binding for this namespace to point to a local file:

from suds.xsd.sxbasic import Import

file_url = 'file://<path to xml.xsd>'
Import.bind('http://www.w3.org/XML/1998/namespace', file_url)
爱情眠于流年 2024-12-13 06:42:47

suds 库有一个 suds.store.DocumentStore 类,它在 uri 中保存捆绑的 XML ->文本词典。它可以像这样修补:

suds.store.DocumentStore.store['www.w3.org/2001/xml.xsd'] = \
    file('xml.xsd', 'r').read()

不幸的是,这不起作用,因为 DocumentStore 只接受对 suds:// 协议的请求。过了一小片猴子,你就可以开始做生意了。

也可以重写传递给 suds Client()Cache() 实例,但缓存基于 Python 的 hash() 处理数字 id 并且无法获取其内容的 URL。

The suds library has a class suds.store.DocumentStore that holds bundled XML in a uri -> text dictionary. It can be patched like so:

suds.store.DocumentStore.store['www.w3.org/2001/xml.xsd'] = \
    file('xml.xsd', 'r').read()

Unfortunately this doesn't work because DocumentStore only honors requests for the suds:// protocol. One monkey patch later and you're in business.

It would also be possible to override the Cache() instance passed to your suds Client(), but the cache deals with numeric ids based on Python's hash() and does not get the URLs of its contents.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文