Как создать dict для заполнения вложенного элемента сложного выбора из WSDL с помощью zeep в Python 3 - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь использовать Zeep для взаимодействия с правительственным интерфейсом SOAP для загрузки / отправки подробностей экспорта, используя Python v3.4 и Zeep v3.4.0. У меня есть wsdl сайта, который ссылается на многие xsd, и я пытаюсь заполнить глобальный комплексный тип ("ExportDetailsType"), который объявляет несколько других элементов сложного выбора ("dumpPorts" и "transitionCountries"), вложенных в него, которые не объявленыв любом другом xsd или глобально. Как правильно построить свой словарь Python для заполнения этих необъявленных вложенных элементов сложного выбора?

Согласно справке Zeep, я пытался создать объект, (https://python -zeep.readthedocs.io / en / master / datastructures.html # creation-objects )но я не могу найти их напрямую через client.get_type ('ns?: dumpPorts') ', поскольку вложенные типы сложных элементов, "dumpPorts" и "transitionCountries" существуют только внутри сложного типа (ns4: "ExportDetailsType").

Соответствующими частями wsdl являются ...

Prefixes:
     xsd: http://www.w3.org/2001/XMLSchema
     ns8: http://ag.gov/exp/CopyExSoap_1.0
     ns7: http://ag.gov/exp/WithdrawalExSoap_1.0
     ns4: http://ag.gov/exp/OrderExSoap_1.0
     ns1: http://ag.gov/exp/common/Ex/CommonTypes_1.0
     ns3: http://ag.gov/exp/common/CommonTypes_1.0
     ns0: http://ag.gov/exp/LodgeExSoap_1.0
     ns5: http://ag.gov/exp/AmendExSoap_1.0
     ns6: http://ag.gov/exp/ValidateExSoap_1.0
     ns2: http://ag.gov/exp/common/EnumTypes_1.0

Global elements:
     ns4:OrderEx(identification: ns1:ExSubmissionIdentificationType, exportDetails: ns1:ExportDetailsType, certificateDetails: ns1:CertificateDetailsType, productLines: ns1:ProductLinesType, manufacturers: ns1:ManufacturerDetailsType, attachments: ns3:AttachmentsType, additionalTexts: ns1:AdditionalTextsType, euTransit: ns1:EUTransitType)
...**other Global elements listed truncated for brevity.**

Global types:
     ns1:ExportDetailsType(commodityType: ns3:CommodityType, priority: ns3:Priority, departureDate: xsd:date, transportDetails: ns1:TransportDetailsType, destinationCity: ns3:CityType, dischargePorts: {({[dischargePort: ns3:PortType]} | {removeExistingSet: xsd:boolean})}, destinationCountry: ns3:CountryType, transitCountries: {({[transitCountry: ns3:CountryType]} | {removeExistingSet: xsd:boolean})}, 
...**other Global types listed truncated for brevity. There is no global types for dischargePorts or transitCountries**

Bindings:
     Soap11Binding: {http://ag.gov/exp/service/Exsubmission}ExSubmissionSOAPBinding

Service: ExSubmissionService
     Port: ExSubmissionPort (Soap11Binding: {http://ag.gov/exp/service/Exsubmission}ExSubmissionSOAPBinding)
         Operations:
            OrderEx(identification: ns1:ExSubmissionIdentificationType, exportDetails: ns1:ExportDetailsType, certificateDetails: ns1:CertificateDetailsType, productLines: ns1:ProductLinesType, manufacturers: ns1:ManufacturerDetailsType, attachments: ns3:AttachmentsType, additionalTexts: ns1:AdditionalTextsType, euTransit: ns1:EUTransitType) -> ExResponseDetails: ns1:ExResponseDetailsType, validationNotices: ns3:ValidationNoticesType, ExLinesResponse: ns1:ExLinesResponseType, ExResponseType: ns2:ExResponseType


Файл ns1: http://ag.gov/exp/common/Ex/CommonTypes_1.0 xsd содержит глобальный тип "ExportDetailsType", который содержит сложные элементы "dumpPorts" и "transitionCountries. "...

<xsd:complexType name="ExportDetailsType">
    <xsd:annotation>
        <xsd:documentation>This type consists of elements which constitute the export related information for a Ex record.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:sequence>
        <!-- <xsd:element name="inspectionProcess" type="rct:InspectionProcessType" minOccurs="0" /> -->
        <xsd:element name="commodityType" type="ct:CommodityType" />
        <xsd:element name="priority" type="ct:Priority" minOccurs="0" nillable="true" />
        <xsd:element name="departureDate" type="xsd:date" minOccurs="0" />
        <xsd:element name="transportDetails" type="rct:TransportDetailsType" minOccurs="0" />
        <xsd:element name="destinationCity" type="ct:CityType" minOccurs="0" nillable="true" />

        <xsd:element name="dischargePorts" minOccurs="0">
            <xsd:complexType>
                <xsd:choice minOccurs="0">
                    <xsd:sequence maxOccurs="3">
                        <xsd:element name="dischargePort" type="ct:PortType" />
                    </xsd:sequence>
                    <xsd:sequence maxOccurs="1">
                        <xsd:element name="removeExistingSet" type="xsd:boolean" default="false" />
                    </xsd:sequence>
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>
        <xsd:element name="destinationCountry" type="ct:CountryType" />
        <xsd:element name="transitCountries" minOccurs="0">
            <xsd:annotation>
                <xsd:documentation>Wrapper element which contains multiple sets of transit countries. Alternatively allows the
                    deletion of the existing transit countries through an amend service call by applying removeExistingSet with a
                    value of 'true'.
                </xsd:documentation>
            </xsd:annotation>
            <xsd:complexType>
                <xsd:choice minOccurs="0">
                    <xsd:sequence maxOccurs="4">
                        <xsd:element name="transitCountry" type="ct:CountryType" />
                    </xsd:sequence>
                    <xsd:sequence maxOccurs="1">
                        <xsd:element name="removeExistingSet" type="xsd:boolean" default="false" />
                    </xsd:sequence>
                </xsd:choice>
            </xsd:complexType>
        </xsd:element>

SoapUI создает следующий XML ...

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ord="http://ag.gov/exp/OrderExSoap_1.0" xmlns:com="http://ag.gov/exp/common/CommonTypes_1.0" xmlns:com1="http://ag.gov/exp/common/exp/CommonTypes_1.0">
   <soapenv:Header/>
   <soapenv:Body>
      <ord:OrderEx>
         <!--Optional:-->
         <ord:identification>
            <com:ExNumber>?</com:ExNumber>
            <com1:lastAmendDateTime>?</com1:lastAmendDateTime>
         </ord:identification>
         <ord:exportDetails>
            <com1:commodityType>?</com1:commodityType>
            <!--Optional:-->
            <com1:priority>?</com1:priority>
            <!--Optional:-->
            <com1:departureDate>?</com1:departureDate>
            <!--Optional:-->
            <com1:transportDetails>
               <!--Optional:-->
               <com1:transportMode>?</com1:transportMode>
               <!--Optional:-->
               <com1:voyageOrFlightNumber>?</com1:voyageOrFlightNumber>
               <!--Optional:-->
               <com1:vesselName>?</com1:vesselName>
               <!--Optional:-->
               <com1:shippingCompany>?</com1:shippingCompany>
               <!--Optional:-->
               <com1:storeTransportTemperature unit="?">?</com1:storeTransportTemperature>
               <!--Optional:-->
               <com1:transferInformation>?</com1:transferInformation>
               <!--Optional:-->
               <com1:vesselHoldSeals>
                  <!--Optional:-->
                  <com1:sealStartNumber>?</com1:sealStartNumber>
                  <!--Optional:-->
                  <com1:sealEndNumber>?</com1:sealEndNumber>
               </com1:vesselHoldSeals>
            </com1:transportDetails>
            <!--Optional:-->
            <com1:destinationCity>?</com1:destinationCity>
            <!--Optional:-->
            <com1:dischargePorts>
               <!--You have a CHOICE of the next 2 items at this level-->
               <com1:dischargePort>?</com1:dischargePort>
               <com1:removeExistingSet>false</com1:removeExistingSet>
            </com1:dischargePorts>
            <com1:destinationCountry>?</com1:destinationCountry>
            <!--Optional:-->
            <com1:transitCountries>
               <!--You have a CHOICE of the next 2 items at this level-->
               <com1:transitCountry>?</com1:transitCountry>
               <com1:removeExistingSet>false</com1:removeExistingSet>
            </com1:transitCountries>
...**truncated for brevity.**

На основе глобальных типов, объявленных в wdsl, над которыми указано

dischargePorts: {({[dischargePort: ns3:PortType]} | {removeExistingSet: xsd:boolean})},

Я создал этот Python dict ...

EXP_ORDR = {
    'identification': xsd.SkipValue, 
    'exportDetails' : {
              'commodityType' : 'D',
              'priority' : xsd.SkipValue,
              'departureDate' : '2019-08-30T01:01:01',
              'transportDetails' : {
                          'transportMode' : 'S',
                          'voyageOrFlightNumber' : 'N101',
                          'vesselName' : 'NOVA 100',
                          'shippingCompany' : 'MSC',
                          'storeTransportTemperature' : xsd.SkipValue,
                          'transferInformation' : xsd.SkipValue,
                          'vesselHoldSeals' : {
                                        'sealStartNumber' : 'ABCD',
                                        'sealEndNumber' : 'EDFG'
                          }
              },  
              'destinationCity' : 'DELHI',
              'dischargePorts' : {
                              'dischargePort' : 'INDEL',
#                              'removeExistingSet' : 'false'
              },
              'destinationCountry' : 'IN',
              'transitCountries' : {
                                  'transitCountry' : 'SG',
                                  'removeExistingSet' : 'false'
              }
       },
       'productLines' : [{
                 'productLine' : {
                       'lineNumber' : '1',
                       'productDetails' : {'productType' : 'BUT',
                                           'category' : 'DM',
                                           'packType' : 'BB',
                                           'preservationType' : 'F',
                       }
                 }
       }]

}

node = client.create_message(client.service, 'OrderEx', **EX_ORDR) 
tree = ET.ElementTree(node)
tree.write('c:/EX_test_ORDR.xml',pretty_print=True)
#--------------------------------------------------------------------------
exit(0) # exit completely

Что дает мне эту ошибку, когда я пытаюсь создать сообщение для отправки на правительственный веб-сайт ...

File "m:\Python\Python35-32\lib\site-packages\zeep\xsd\valueobjects.py", line
231, in _process_signature
    xsd_type.signature(standalone=False)))
TypeError: {http://ag.gov/exp/common/exp/CommonTypes_1.0}discharg
ePorts() got an unexpected keyword argument 'dischargePort'. Signature: `({[disc
hargePort: {http://agriculture.gov.au/nexdoc/common/CommonTypes_1.0}PortType]} |
 {removeExistingSet: xsd:boolean})`
...