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

时间:2017-05-24 12:01:59

标签: python soap wsdl zeep

我正在尝试使用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')

2 个答案:

答案 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)

TL; DR

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中。