Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python zeep-绑定名称以点(.)开头时标记名称无效_Python_Soap_Wsdl_Zeep - Fatal编程技术网

Python zeep-绑定名称以点(.)开头时标记名称无效

Python zeep-绑定名称以点(.)开头时标记名称无效,python,soap,wsdl,zeep,Python,Soap,Wsdl,Zeep,我试图让zeep打开一个在名称开头有点绑定的WSDL,并得到一条ValueError:Invalid tag name'.USXMLWSSoapBinding'错误消息 WSDL将绑定名称定义为: <wsdl:binding name=".USXMLWSSoapBinding" type="impl:USXMLWS"> TL;博士 Zeep用于解析wsdl。以点开头的绑定名称似乎不完全符合XML。如果无法更改绑定名称,则可以通过编辑lib\site packages\zeep\ut

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

WSDL将绑定名称定义为:

<wsdl:binding name=".USXMLWSSoapBinding" type="impl:USXMLWS">
TL;博士 Zeep用于解析wsdl。以点开头的绑定名称似乎不完全符合XML。如果无法更改绑定名称,则可以通过编辑
lib\site packages\zeep\utils.py
来解决此问题

例如:

注意,这可能会产生意外的副作用;这对我很有效,但我没有做太多的测试,YMMV。您可以通过测试特定子字符串的值,或者在
qname\u attr
中进行更改,并为“name”测试attr\u name,使其更具选择性

再详细一点 我最近遇到了一个类似的东西,绑定名中有“/”

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

我不确定这些w3.org引用是否是最新的,但它们是我搜索时发现的:

绑定组件的属性如下所示:

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

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

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


您可以通过
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 webservice。

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

...
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(':')
    ...
 {name} REQUIRED. An xs:QName
 ...
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
[4]          NCName    ::=    Name - (Char* ':' Char*) /* An XML Name, minus the ":" */
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)