У меня есть 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" и т.д. Но я не смог найти решение.
Как я могу поместить эти атрибуты в список, который будет использоваться в качестве параметров внутри функции?
Заранее спасибо !
... но я не мог найти решение
Это потому, что нет простого.
Простой вложенный список не может представлять собой полный 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
поскольку они не добавляли семантики, но вы могли бы сделать их именованными объектами, если хотите.
<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']
все еще работает ..{ key:my_key,...
) дают синтаксическую ошибку в PYTHON.