Python zeep-绑定名称以点(.)开头时标记名称无效
我试图让zeep打开一个在名称开头有点绑定的WSDL,并得到一条ValueError:Invalid tag name'.USXMLWSSoapBinding'错误消息 WSDL将绑定名称定义为: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
<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)