Zeep Python обработка пустых XML тегов в SOAP запросе API - PullRequest
0 голосов
/ 15 января 2020

Python 3,7 || Zeep 3.4.0

Поведение: Я работаю с API, в котором пустые теги XML используются для обозначения важной точки данных. WSDL определяет шесть возможных типов, и какой из шести конкретный элемент обозначается. Когда zeep анализирует XML, он обрабатывает <tag /> так же, как и отсутствующий тег, поэтому для данного ответа zeep перечисляет все шесть возможных типов как None type.

ожидаемое поведение:

  1. , что синтаксический анализ XML будет каким-то образом указывать на разницу между существующим пустым тегом и тегом, который определен в WSDL, но отсутствует.
  2. , что создание XML обеспечивает некоторый механизм для включения пустого тега как части элемента.

Пример:

Когда необработанный XML из API выглядит следующим образом:

<ns1:placeholder>
     <ns1:name>this is an instruction</ns1:name>
     <ns1:optional>true</ns1:optional>
     <ns1:instructions />
</ns1:placeholder>

Zeep интерпретирует этот ответ как:

'placeholder': [
     {
          'name': 'this is an instruction',
          'optional': True,
          'text': None,
          'longText': None,
          'instructions': None,
          'checkbox': None,
          'multipleChoice': None,
          'additionalRecipients': None
     }
]

и при преобразовании в xml с помощью zeep:

<ns1:placeholder>
     <ns1:name>this is an instruction</ns1:name>
     <ns1:optional>true</ns1:optional>
</ns1:placeholder>

Мне нужно, чтобы <ns1:instructions /> было прочитано как из ответа, так и в запрос.

Рассматриваемый WSDL выглядит следующим образом:

<complexType name="placeholderType">
     <choice>
          <sequence>
               <element name="name" type="string"/>
               <element name="optional" type="boolean"/>
               <choice>
                    <element name="text" type="mir3:textInputPlaceholderType" />
                    <element name="longText" type="mir3:textInputPlaceholderType" />    
                    <element name="instructions"><complexType/></element>
                    <element name="checkbox" type="mir3:checkboxPlaceholderType" />
                    <element name="multipleChoice" type="mir3:multipleChoicePlaceholderType" />
               </choice>                    
          </sequence>
          <element name="additionalRecipients" type="mir3:additionalRecipientsType"/>
     </choice>
</complexType>

перечисленных выше типов, некоторые из них не являются проблемами, поскольку, например, multipleChoicePlaceholderType содержит обязательные элементы, поэтому тег никогда не будет пустым когда присутствует. Но некоторые из типов, ie textInputPlaceholderType, имеют только дополнительные элементы, и поэтому могут присутствовать или не быть пустыми при их наличии. Неизбежная проблема - instructions, которая всегда пуста, если присутствует.

...