2010-02-25 1 views
0
나는이 클라이언트 여기

목록 매개 변수를 SOAPpy의 배열이 아닌 여러 개의 링크 이름이 지정된 요소로 전달하려면 어떻게해야합니까?

oamCmdStruct = SOAPpy.structType() 
    oamCmdStruct._addItem('m-strName','set-log-level') 
    oamCmdStruct._addItem('m-argVector', logLevel) 
    oamCmdStruct._addItem('m-argVector', loggerName) 
    self.serverConnection.executeCommand({'in-cmd':oamCmdStruct} 

에 대한 파이썬에서 내 코드는 다음과 WSDL

<complexType name="OAMCommand"> 
    <sequence> 
    <element name="m-strName" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    <element name="m-argVector" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> 
    </sequence> 
    </complexType> 

이있는 웹 노예에 요소의 여러 인스턴스를 전달하려고

내가 얻을 출력 SOAPpy에서 웹 서비스에 의해 거부되면 2m-argVector 요소에 대한 배열을 만듭니다.

<xsd:in-cmd> 
    <m-strName xsi:type="xsd:string">set-log-level</m-strName> 
    <m-argVector SOAP-ENC:arrayType="xsd:string[2]" xsi:type="SOAP-ENC:Array"> 
    <item>WARN_LOG_LEVEL</item> 
    <item>netborder</item> 
    </m-argVector> 
</xsd:in-cmd> 

다음은 다른 클라이언트가 보내는 출력입니다. 배열이 없습니다. 이름이 같은 두 개의 요소 만 있습니다.

<SoapOAM:executeCommand> 
     <in-cmd> 
     <m-strName>set-log-level</m-strName> 
     <m-argVector>ERROR_LOG_LEVEL</m-argVector> 
     <m-argVector>netborder.media</m-argVector> 
     </in-cmd> 
    </SoapOAM:executeCommand> 

어떻게 위의 같은 XML 출력을 생성하는 내 SOAPpy 코드를 수정할 수 있습니까? 편집

: 나는 파이썬

oamCmdStruct = SOAPpy.structType(data = {"m-strName":"set-log-level", 
               "m-argVector": logLevel, 
               "m-argVector": loggerName}) 

에 다음 코드를 시도하지만이 SOAPpy에서 XML 출력

<xsd:in-cmd> 
    <m-strName xsi:type="xsd:string">set-log-level</m-strName> 
    <m-argVector xsi:type="xsd:string">loggerName</m-argVector> 
</xsd:in-cmd> 

처럼 보였다 있으며 logLevel의 값이 loggerName 덮어 대신 생성됩니다 것입니다 이 개 항목 ...

답변

0

몇 가지 다른 librairies (비눗물, soaplib)를 시도 후, 나는 마침내 SOAPpy 코드로 파고.

내 SOAP 요청에서 배열을 제거하기 위해, 나는 SOAPpy 라이브러리의 SOAPBuilder 클래스의 dump_list() 기능을 수정했습니다.

# COMMENT: We dont want arrays in SOAP-XML so I commented out the following lines 
# if typed: 
# self.out.append(
#  '<%s %sarrayType="%s[%d]" %stype="%sArray"%s%s%s%s%s%s>\n' % 
#  (tag, ens, t, len(data), ins, ens, ndecl, edecl, idecl, 
#   self.genroot(ns_map), id, a)) 

#if typed: 
# try: elemsname = obj._elemsname 
# except: elemsname = "item" 
#else: 
elemsname = tag 

for i in data: 
    self.dump(i, elemsname, not same_type, ns_map) 

#if typed: self.out.append('</%s>\n' % tag) 

이렇게 변경하면 SOAP SOAP 요청에 대해 다음과 같은 출력이 표시됩니다.

<SOAP-ENV:Body> 
<ns1:executeCommand xmlns:ns1="urn:SoapOAM"> 
<xsd:in-cmd> 
<m-strName xsi:type="xsd:string">set-log-level</m-strName> 
<m-argVector>ERROR_LOG_LEVEL</m-argVector> 
<m-argVector>netborder</m-argVector> 
</xsd:in-cmd> 
</ns1:executeCommand> 
</SOAP-ENV:Body> 
+0

더 우아한 해결책은이 코드를 모두 주석 처리하는 대신 ** typed ** 값을 0으로 설정하는 것입니다. –

관련 문제