Я пытаюсь использовать 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})`