Преобразование атрибутов XML в список для использования параметров в функцию в Python

1

У меня есть xml запрос для получения данных из запроса wsdl, подобного этому;

<prod:insert>

   <key> my_key </Key>
   <signature> my_signature </signature>
   <variable>
      <code> my_code </code>
      <title> my_title </title>
   </variable>

</prod:insert>

Чтобы отправить этот запрос, я в основном использую list в python.

import zeep

sent_to_api =["my_key","my_signature",["my_code","my_title"]]

my_data = client.service.service_name(*sent_to_api)

Как видно выше, коды python, я просто использую значения внутри тегов и помещаю их в list. И эти коды работают нормально! Поэтому я могу получить данные из источника.

Однако, когда дело доходит до получения более сложного xml запроса, который включает атрибуты, я не смог передать значения в функцию.

Коды xml с attributes которые я хочу отправить, приведены ниже;

<prod:insert>
   <key> my_key </key>
   <signature> my_signature </signature>
   <variable>
      <code> my_code </code>
      <title> my_title </title>
      <specs>
         <spec name="X" value="15" />
         <spec name="Y" value="10.0T" />
      </specs>
   </variable>
</prod:insert> 

Я попробовал "список внутри списка", "dict inside list", "tupple inside list" и т.д. Но я не смог найти решение.

Как я могу поместить эти атрибуты в список, который будет использоваться в качестве параметров внутри функции?

Заранее спасибо !

Теги:
function
wsdl
zeep

1 ответ

1

... но я не мог найти решение

Это потому, что нет простого.

Простой вложенный список не может представлять собой полный XML-документ, который использует более одной "оси" (для свободного определения "ось"). В первом примере вы используете только родительскую/дочернюю ось, но во втором вы также используете ось "атрибут", что означает, что ваша структура данных имеет три измерения. Это не может быть представлено непосредственно как вложенные списки без некоторого сглаживания и включая некоторые метаданные в структуре вывода:

<prod:insert>
   <key> my_key </key>
   <signature> my_signature </signature>
   <variable>
      <code> my_code </code>
      <title> my_title </title>
      <specs>
         <spec name="X" value="15" />
         <spec name="Y" value="10.0T" />
      </specs>
   </variable>
</prod:insert> 

становится

[my_key, my_signature, [my_code, my_title, [ ["X", "15"], ["Y", "10.0T"] ] ]

Я предполагаю, что <specs> может содержать некоторое неизвестное число элементов <spec>.

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

Лучшее решение - использовать комбинацию вложенных диктонов и списков

{ key:my_key, 
  signature:my_signature, 
  [ // variable
    { code: my_code, 
      title:my_title, 
      [ // specs
        { name:X, value:15} 
        { name:Y, value:10.0T}
      ]
    }
  ]
}

Там более одного способа структурировать это. Я отклонил variable имен и specs поскольку они не добавляли семантики, но вы могли бы сделать их именованными объектами, если хотите.

  • 0
    Что касается вашего ответа, я начну с очень простого запроса, чтобы проверить точность предложенных вами настроек. XML, у которого нет дочернего <dev:Developer> <nick>test_user</nick> <password>PW</password> <lang>en</lang> </dev:Developer> ... <dev:Developer> <nick>test_user</nick> <password>PW</password> <lang>en</lang> </dev:Developer> .. Чтобы запустить это, Я отправил send_data = {'nick':'test_user', 'password' :'PW', 'lang':'en' } ... Но это не работает! Однако ['test_user','PW','en'] все еще работает ..
  • 0
    Кроме того, последние написанные вами коды (я имею в виду { key:my_key,... ) дают синтаксическую ошибку в PYTHON.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню