我正在尝试使用swep打开一个在名称开头绑定了点的WSDL并得到一个ValueError:无效的标记名称'.USXMLWSSoapBinding'错误消息。
WSDL将绑定名称定义为:
<wsdl:binding name=".USXMLWSSoapBinding" type="impl:USXMLWS">
我可以让它与其他语言和库一起使用,但python和zeep似乎不同意我:
python -mzeep <wsdl>
或
import zeep
client = zeep.Client('https://example.com/service.wsdl')
答案 0 :(得分:1)
您可以通过unittest.mock
修补Zeep的崩溃行为
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的人也会在同一问题上迷路。
答案 1 :(得分:0)
Zeep使用lxml来解析wsdl。以点开头的绑定名称似乎严格不符合XML。如果您无法更改绑定名称,则可以按照https://github.com/mvantellingen/python-zeep/issues/594
的方式编辑lib\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。您可以通过测试特定子字符串的 value 或更改qname_attr
并测试 attr_name 的“ name”来使其更具选择性。
最近,我遇到了一个绑定名称中带有'/'的类似内容。
我对SOAP和/或XML知之甚少,但据我所知,绑定名称是 QName ,它由可选的前缀和 localpart (以:分隔)。前缀和localpart是 NCNames ; NCName 是不带':'的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,具有一组有限的初始字符。]不允许的名称初始字符包括数字,变音符号,句号和连字符。
What is an xs:NCName type and when should it be used?
NCName的实际限制 NCName不能包含几个符号字符,例如:,@, $,%,&,/,+ 、、、;,空格字符或其他括号。 此外, NCName不能以数字,点或减号开头 字符,尽管它们稍后可以出现在NCName中。