Создание SOAP-запроса через Zeep с переменным количеством тегов XML - PullRequest
0 голосов
/ 11 января 2019

Все, я использую Zeep для подключения к CUCM для выполнения массовых транзакций AXL. Некоторые из объектов, которые мне нужно изменить, принимают переменное количество тегов XML. Например:

Я хочу добавить объект (вызывающий пространство поиска), который может иметь переменное число разделов, связанных с ним. Согласно WSDL:


    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.cisco.com/AXL/API/11.5">
       <soapenv:Header/>
       <soapenv:Body>
          <ns:addCss sequence="?">
             <css>
                <!--Optional:-->
                <description>?</description>
                <!--Optional:-->
                <members>
                   <!--Zero or more repetitions:--> <------------------------------------------
                   <member>
                      <routePartitionName uuid="?">?</routePartitionName>
                      <index>?</index>
                   </member>
                </members>
                <!--Optional:-->
                <partitionUsage>General</partitionUsage>
                <name>?</name>
             </css>
          </ns:addCss>
       </soapenv:Body>
    </soapenv:Envelope>

Я могу легко написать фиксированное количество членов:


    result = service.addCss({
        'name': 'SampleCSS',
        'description': 'Sample CSS Description',
        'members': {
            'member': [
                {'routePartitionName':{
                    '_value_1':None, 'uuid':'{07614566-ADC4-1ABB-3EB3-C08650E11CBE}'},
                    'index':1},
                {'routePartitionName': 'Auto Register','index': 2},
                {'routePartitionName': 'DNS External', 'index':3},
                {'routePartitionName':{
                    '_value_1':'On Cluster', 'uuid':'{F7FF933E-2B63-25DB-11AF-1DDDC8F9A52E}'},
                    'index':4},
            ]}
         })
    print (result)
    print(type(result))
    res = result['return']
    print("\n\n", res)

Однако мне трудно писать сценарии для переменного числа членов

Мои пользователи хранятся в словаре:


    CSSes = {
        'Test1': ['Test1','Test1','07614566-ADC4-1ABB-3EB3-C08650E11CBE','Staging',1],
        'Test2': ['Test2','Test2','F7FF933E-2B63-25DB-11AF-1DDDC8F9A52E', 'On Cluster',1]
    }

Если я добавляю несколько CSS, и у каждого разное количество разделов (членов), как мне это сделать?

Я смог придумать только то, что каждому CSS присвоено одинаковое количество разделов:

for css in CSSes:
    result = service.addCss({
        'name': CSSes[css][0],
        'description': CSSes[css][1],
        'members': {
            'member': [
                {'routePartitionName':{
                        '_value_1':CSSes[css][3], 'uuid':CSSes[css][1]},
                        'index':CSSes[css][4]}
        ]}
    })

1 Ответ

0 голосов
/ 12 января 2019

Я не уверен на 100%, что понимаю ваш сценарий (в основном на основе предоставленных фрагментов), но с учетом этого набора данных, где один создаваемый CSS имеет 2 раздела, а другой - 3:

CSSs = [
    {
        'name': 'CSS1',
        'description': 'CSS1 description',
        'members': [
            {
                'name': 'Partition1',
                'index': 1
            },
            {
                'name': 'Partition2',
                'index': 2
            }
        ]
    },
    {
        'name': 'CSS2',
        'description': 'CSS2 description',
        'members': [
            {
                'name': 'Partition1',
                'index': 1
            },
            {
                'name': 'Partition2',
                'index': 2
            },
            {
                'name': 'Partition3',
                'index': 3
            }
        ]
    }
]

Мне удалось заставить это работать, динамически добавляя участников, например так:

for css in CSSs:
    css_data = {
        'name': css['name'],
        'description': css['description'],
        'members': {
            'member': []
        }
    }
    for memb in css['members']:
        css_data['members']['member'].append(
            {
                'routePartitionName': memb['name'],
                'index': memb['index']
            }
        )
    css_resp = service.addCss(css_data)
...