【问题标题】:Spyne- How to get element from SOAPSpyne-如何从 SOAP 中获取元素
【发布时间】:2014-05-30 07:34:39
【问题描述】:

我是第一次使用 SPYNE。我想为 TR069 服务写一个服务器。

我收到如下消息:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cwmp="urn:dslforum-org:cwmp-1-0">
<soap-env:Header>
<cwmp:ID soap-env:mustUnderstand="1">984890494</cwmp:ID>
</soap-env:Header>
<soap-env:Body>
<cwmp:Inform>
<DeviceId>
<Manufacturer>xxxx</Manufacturer>
<OUI>xxxxxx</OUI>
<ProductClass>x-xxxx-xx</ProductClass>
<SerialNumber>xxxxxxxxxxxxx</SerialNumber>
</DeviceId>
<Event xsi:type="soap-enc:Array" soap-enc:arrayType="cwmp:EventStruct[1]">
<EventStruct>
<EventCode>2 PERIODIC</EventCode>
<CommandKey/>
</EventStruct>
</Event>
<MaxEnvelopes>1</MaxEnvelopes>
<CurrentTime>2014-05-21T10:47:37+08:00</CurrentTime>
<RetryCount>56</RetryCount>
<ParameterList xsi:type="soap-enc:Array" soap-enc:arrayType="cwmp:ParameterValueStruct[10]">
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceSummary</Name>
<Value xsi:type="xsd:string"/>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>
<Value xsi:type="xsd:string">1.0</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.HardwareVersion</Name>
<Value xsi:type="xsd:string">3FE55918ABAA</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion</Name>
<Value xsi:type="xsd:string">3FE55935ADEA19</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode</Name>
<Value xsi:type="xsd:string">123</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.ManagementServer.ConnectionRequestURL</Name>
<Value xsi:type="xsd:string">http://x.x.x.x:7547/</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.ManagementServer.ParameterKey</Name>
<Value xsi:type="xsd:string">3</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANIPConnection.1.ExternalIPAddress</Name>
<Value xsi:type="xsd:string">10.18.92.182</Value>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANIPConnection.1.MACAddress</Name>
<Value xsi:type="xsd:string"/>
</ParameterValueStruct>
<ParameterValueStruct>
<Name>InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username</Name>
<Value xsi:type="xsd:string">rock3</Value>
</ParameterValueStruct>
</ParameterList>
</cwmp:Inform>
</soap-env:Body>
</soap-env:Envelope>

我的代码如下:

class DeviceId(ComplexModel):
  __namespace__ = "urn:dslforum-org:cwmp-1-0"
  Manufacturer = String
  OUI          = String
  ProductClass = String
  SerialNumber = String

class EventStruct(ComplexModel):
  __namespace__ = "urn:dslforum-org:cwmp-1-0"
  EventCode   = String
  CommandKey  = String

class Event(ComplexModel):
  __namespace__ = "urn:dslforum-org:cwmp-1-0"
  EventStruct = EventStruct

class ParameterValueStruct(ComplexModel):
  __namespace__ = "urn:dslforum-org:cwmp-1-0"
  Name  = String
  Value = String

class ParameterList(ComplexModel):
  __namespace__ = "urn:dslforum-org:cwmp-1-0"
  ParameterValueStruct = ParameterValueStruct

class CWMP(ServiceBase):
  @srpc(DeviceId, Event, Integer, String, Integer, Array(ParameterList), _returns=Iterable(Unicode))
  def Inform(DeviceId, Event, MaxEnvelopes, CurrentTime, RetryCount, ParameterList):
    pList = []
    for i in ParameterList:
      print i.ParameterValueStruct
      pList.append(i.ParameterValueStruct.Name)
    print DeviceId
    print Event
    print Event.EventStruct.EventCode
    print MaxEnvelopes
    print CurrentTime
    ...

正常获取除ParameterList之外的所有变量

(Pdb) type(i)
<class '__main__.ParameterList'>
(Pdb) type(i.ParameterValueStruct)
<type 'NoneType'>
(Pdb) print i
ParameterList()
(Pdb) print i.ParameterValueStruct
None

有人知道如何在 ParameterValueStruct 中获取所有名称/值吗?

【问题讨论】:

    标签: xml soap spyne


    【解决方案1】:

    这是我修复的:

    1. 手动定义包装对象时不需要 Array()
    2. Spyne 不支持soap:enc attrs。
    3. 如果您想使用 lxml 验证,您需要为 &lt;cwmp:Inform&gt; 的子标签提供适当的命名空间。
    4. 如果您想控制元素的顺序,最好使用 _type_info 表示法

    代码:

    class DeviceId(ComplexModel):
      __namespace__ = "urn:dslforum-org:cwmp-1-0"
      _type_info = [
        ('Manufacturer', String),
        ('OUI',          String),
        ('ProductClass', String),
        ('SerialNumber', String),
      ]
    
    class EventStruct(ComplexModel):
      __namespace__ = "urn:dslforum-org:cwmp-1-0"
      EventCode   = String
      CommandKey  = String
    
    class Event(ComplexModel):
      __namespace__ = "urn:dslforum-org:cwmp-1-0"
      EventStruct = EventStruct.customize(max_occurs='unbounded')
    
    class ParameterValueStruct(ComplexModel):
      __namespace__ = "urn:dslforum-org:cwmp-1-0"
      Name  = String
      Value = String
    
    class ParameterList(ComplexModel):
      __namespace__ = "urn:dslforum-org:cwmp-1-0"
      ParameterValueStruct = ParameterValueStruct.customize(max_occurs='unbounded')
    
    class CWMP(ServiceBase):
      @srpc(DeviceId, Event, Integer, String, Integer, ParameterList, _returns=Iterable(Unicode))
      def Inform(DeviceId, Event, MaxEnvelopes, CurrentTime, RetryCount, ParameterList):
        pList = []
        for i in ParameterList.ParameterValueStruct:
          print i
          pList.append(i.Name)
        print DeviceId
        print Event
        print Event.EventStruct[0].EventCode
        print MaxEnvelopes
        print CurrentTime
    
    
    application = Application([CWMP], 'urn:dslforum-org:cwmp-1-0',
                in_protocol=Soap11(validator='lxml'),
                out_protocol=Soap11()
            )
    

    请求:

    <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
                       xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding"
                       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                       xmlns:cwmp="urn:dslforum-org:cwmp-1-0">
        <soap-env:Header>
            <cwmp:ID soap-env:mustUnderstand="1">984890494</cwmp:ID>
        </soap-env:Header>
        <soap-env:Body>
            <cwmp:Inform xmlns="urn:dslforum-org:cwmp-1-0">
                <DeviceId>
                    <Manufacturer>xxxx</Manufacturer>
                    <OUI>xxxxxx</OUI>
                    <ProductClass>x-xxxx-xx</ProductClass>
                    <SerialNumber>xxxxxxxxxxxxx</SerialNumber>
                </DeviceId>
                <Event>
                    <EventStruct>
                        <EventCode>2 PERIODIC</EventCode>
                        <CommandKey/>
                    </EventStruct>
                </Event>
                <MaxEnvelopes>1</MaxEnvelopes>
                <CurrentTime>2014-05-21T10:47:37+08:00</CurrentTime>
                <RetryCount>56</RetryCount>
                <ParameterList>
                    <ParameterValueStruct>
                        <Name>InternetGatewayDevice.DeviceSummary</Name>
                        <Value xsi:type="xsd:string"/>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>InternetGatewayDevice.DeviceInfo.SpecVersion</Name>
                        <Value xsi:type="xsd:string">1.0</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>InternetGatewayDevice.DeviceInfo.HardwareVersion
                        </Name>
                        <Value xsi:type="xsd:string">3FE55918ABAA</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>InternetGatewayDevice.DeviceInfo.SoftwareVersion
                        </Name>
                        <Value xsi:type="xsd:string">3FE55935ADEA19</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>InternetGatewayDevice.DeviceInfo.ProvisioningCode
                        </Name>
                        <Value xsi:type="xsd:string">123</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>
                            InternetGatewayDevice.ManagementServer.ConnectionRequestURL
                        </Name>
                        <Value xsi:type="xsd:string">http://x.x.x.x:7547/</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>InternetGatewayDevice.ManagementServer.ParameterKey
                        </Name>
                        <Value xsi:type="xsd:string">3</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>
                            InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANIPConnection.1.ExternalIPAddress
                        </Name>
                        <Value xsi:type="xsd:string">10.18.92.182</Value>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>
                            InternetGatewayDevice.WANDevice.1.WANConnectionDevice.2.WANIPConnection.1.MACAddress
                        </Name>
                        <Value xsi:type="xsd:string"/>
                    </ParameterValueStruct>
                    <ParameterValueStruct>
                        <Name>
                            InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1.Username
                        </Name>
                        <Value xsi:type="xsd:string">rock3</Value>
                    </ParameterValueStruct>
                </ParameterList>
            </cwmp:Inform>
        </soap-env:Body>
    </soap-env:Envelope>
    

    【讨论】:

    • 它很有用。谢谢。如何设置 的子标签?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多