3

我试图让 zeep 打开一个 WSDL,该 WSDL 在名称的开头带有点绑定,并得到一个 ValueError: Invalid tag name '.USXMLWSSoapBinding' 错误消息。

WSDL 将绑定名称定义为:

<wsdl:binding name=".USXMLWSSoapBinding" type="impl:USXMLWS">

我可以让它与其他语言和库一起使用,但 python 和 zeep 似乎不同意我的看法:

python -mzeep <wsdl>

或者

import zeep
client = zeep.Client('https://example.com/service.wsdl')
4

2 回答 2

2

您可以通过修补 Zeep 的崩溃行为unittest.mock

from unittest import mock
from zeep import Client

def my_as_qname(value, nsmap, target_namespace=None):
    value = value.strip()

    if '/' in value:  # This is my fix for slash in value
        value = value.replace('/', '-')

    # More stuff that i removed in this snippet


with mock.patch('zeep.utils.as_qname', side_effect=my_as_qname):
   client = Client(wsdl)

就我而言,失败的 WSDL 是法国邮局 « La Poste » 新的 Colissimo Web 服务。 https://ws.colissimo.fr/sls-ws/SlsServiceWS/2.0?wsdl

我想其他尝试使用 Zeep 的人也会遇到同样的问题。

于 2019-06-27T12:54:37.957 回答
1

TL;博士

Zeep 使用lxml来解析 wsdl。以点开头的绑定名称似乎不严格符合 XML。如果您无法更改绑定名称,您可以通过按照为https://github.com/mvantellingen/python-zeep/issues/594lib\site-packages\zeep\utils.py所做的内容进行编辑来解决此问题

例如:

...
def qname_attr(node, attr_name, target_namespace=None):
    value = node.get(attr_name)
    if value is not None:
        return as_qname(value, node.nsmap, target_namespace)


def as_qname(value, nsmap, target_namespace=None):
    """Convert the given value to a QName"""
    value = value.strip()  # some xsd's contain leading/trailing spaces
   #KLUDGE for bindingnames that start with '.'
    if value.startswith('.'):
        print("Stripping leading '.' from:", value)
        value = value.lstrip('.') 
    if ':' in value:
        prefix, local = value.split(':')
    ...

请注意,这可能会产生意想不到的副作用;这对我有用,但我没有做太多测试,YMMV。您可以通过测试特定子字符串的值来使其更具选择性,或者也可以更改qname_attr并测试“名称”的attr_name

更详细一点

我最近遇到了类似的东西,其绑定名称中包含“/”。

我对 SOAP 和/或 XML 知之甚少,但据我所知,绑定名称是一个QName,它由一个可选前缀和一个localpart(由 : 分隔)组成。前缀和 localpart 是NCNamesNCName是没有“:”的XML名称Name是一个Nmtoken 具有一组受限的初始字符,包括句号(点)。

我不确定这些 w3.org 参考是否是最新的,但它们是我搜索时出现的参考:

https://www.w3.org/TR/wsdl20/#component-Binding

Binding组件的属性如下:

 {name} REQUIRED. An xs:QName
 ...

https://www.w3.org/TR/xml-names/#ns-qualnames

Qualified Names
In XML documents conforming to this specification, some names (constructs corresponding 
to the nonterminal Name) MUST be given as qualified names, defined as follows:

Qualified Name
[7]         QName           ::=    PrefixedName | UnprefixedName
[8]         PrefixedName    ::=    Prefix ':' LocalPart
[9]         UnprefixedName  ::=    LocalPart
[10]        Prefix          ::=    NCName
[11]        LocalPart       ::=    NCName

https://www.w3.org/TR/xml-names/#NT-NCName

[4]          NCName    ::=    Name - (Char* ':' Char*) /* An XML Name, minus the ":" */

https://www.w3.org/TR/REC-xml/#NT-Name

名称是具有一组受限初始字符的 Nmtoken。] 名称中不允许使用的初始字符包括数字、变音符号、句号和连字符。

什么是 xs:NCName 类型以及何时应该使用它?

NCName 的实际限制 NCName 的实际限制是它不能包含多个符号字符,如:、@、$、%、&、/、+、、、;、空白字符或不同的括号。此外,NCName 不能以数字、或减号字符开头,尽管它们可以稍后出现在 NCName 中。

于 2018-11-02T14:20:26.503 回答