2013-06-06 3 views
1

여러 개의 네임 스페이스를 사용하는 미리 정의 된 WSDL을 구현하는 중입니다. 나는 다음과 같은 코드를 사용하고여러 개의 네임 스페이스가있는 SOAP 요청

<?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'

동일한 요청 문서에서 여러 네임 스페이스를 올바르게 처리하려면 어떻게해야합니까?

답변

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> 

그렇다면 네임 스페이스를 신경 쓰지 않는 소프트 밸리데이터를 사용할 수 있습니다.