2

我正在实现一些使用多个命名空间的预定义 WSDL。为简单起见,我的请求类似于:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
  </soapenv:Header>                                                                                                                                                      
  <soapenv:Body>
<a:Foo xmlns:a="www.example.com/schema/a" AttrA="a1" AttrB="b2">
    <b:Baz xmlns:b="www.example.com/schema/b" AttrC="c3"/>
  <a:Bar>blah</a:Bar>
</a:Foo>
  </soapenv:Body>
</soapenv:Envelope>

我一直在使用如下代码:

from spyne.model.primitive import Unicode
from spyne.model.complex import Iterable, XmlAttribute, ComplexModel, ComplexModelMeta, ComplexModelBase
from spyne.service import ServiceBase
from spyne.protocol.soap import Soap11
from spyne.application import Application
from spyne.decorator import srpc, rpc

class BazBase(ComplexModelBase):
    __namespace__ = "www.example.com/schema/b"
    __metaclass__ = ComplexModelMeta

class Baz(BazBase):
    Thing = Unicode
    AttrC = XmlAttribute(Unicode)

class FooService(ServiceBase):
    __namespace__ = "www.example.com/schema/a"

    @rpc(XmlAttribute(Unicode), XmlAttribute(Unicode), Baz, Unicode, _returns=Iterable(Unicode))
    def Foo(ctx, AttrA, AttrB, Baz, Bar):
        yield 'Hello, %s' % Bar 

app = Application([FooService],                                                                                                                                          
    "www.example.com/schema/a",
    in_protocol=Soap11(validator='lxml'),
    out_protocol=Soap11(),
)

解析事物,但我得到:

<?xml version='1.0' encoding='utf-8'?>
<senv:Envelope xmlns:senv="schemas.xmlsoap.org/soap/envelope/">
  <senv:Body>
    <senv:Fault>
      <faultcode>senv:Client.SchemaValidationError</faultcode>
      <faultstring>
      &lt;string&gt;:1:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT:
      Element '{www.example.com/schema/b}Baz': This element
      is not expected. Expected is one of (
      {www.example.com/schema/a}Baz,
      {www.example.com/schema/a}Bar ).</faultstring>
      <faultactor></faultactor>
    </senv:Fault>
  </senv:Body>
</senv:Envelope>

作为回应。

我试过使用 schema_tag 参数,但我放在那里的任何东西似乎都不起作用,出现像“ValueError:未处理的 schema_tag / 类型组合”这样的错误。或“ValueError:InvalidTagName”

我需要做什么才能正确处理同一个请求文档中的多个命名空间?

4

1 回答 1

0

据我所知,Spyne 在那里做的事情是正确的,但请求是不正确的。子元素始终位于父元素的命名空间下。这些元素的子元素可以在自己的命名空间中。

<a:Foo xmlns:a="www.example.com/schema/a" AttrA="a1" AttrB="b2">
    <a:Baz xmlns:b="www.example.com/schema/b" AttrC="c3"/>
    <a:Bar>blah</a:Bar>
</a:Foo>

也就是说,您可以只使用不关心名称空间的软验证器。

于 2013-07-18T19:00:25.620 回答