У меня есть рабочий сценарий Python для извлечения одной переменной из файла csv, который заменяет одно значение в сценарии {0}, затем запускает вызов soapAPI, а затем я хочу собрать soap Выходные данные ответа двух значений из ответ Soap в файл CSV.
Вот типичный Soap ответ после запуска моего скрипта ..
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns6:GetDeviceParameterValuesResponse xmlns:ns2="http://twowire.com/dmc/apps/nbiws/base/v1_0" xmlns:ns3="http://twowire.com/dmc/apps/nbiws/auditmgmt/v1_0" xmlns:ns4="http://twowire.com/dmc/apps/nbiws/configurationmgmt/v1_0" xmlns:ns5="http://twowire.com/dmc/apps/nbiws/devicediagnostics/v1_0" xmlns:ns6="http://twowire.com/dmc/apps/nbiws/devicemgmt/v1_0" xmlns:ns7="http://twowire.com/dmc/apps/nbiws/groupmgmt/v1_0" xmlns:ns8="http://twowire.com/dmc/apps/nbiws/subscribermgmt/v1_0" xmlns:ns9="http://twowire.com/dmc/apps/nbiws/workflowmgmt/v1_0">
<ns6:parameterValue>
<ns2:name>InternetGatewayDevice.DeviceInfo.UpTime</ns2:name>
<ns2:value>3414</ns2:value>
</ns6:parameterValue>
</ns6:GetDeviceParameterValuesResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Я хочу, чтобы оба следующих значения отображались в CSV name -> InternetGatewayDevice.DeviceInfo.UpTime (столбец A) значение -> 3414 (столбец B)
Я считаю, что у меня проблема с процессом convert xml to python dict (просто могу не понимаю)
Я получаю сгенерированный файл csv, но без данных, кроме изображение сгенерированного файла csv
Вот рабочий Python SoapAPI Скрипт
#!/usr/bin/env python
import requests
import csv
import getopt
import sys
import time
import xml.etree.ElementTree as ET
import xmltodict
from lxml import objectify
xml_string = """<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns6:GetDeviceParameterValuesResponse xmlns:ns2="http://twowire.com/dmc/apps/nbiws/base/v1_0" xmlns:ns3="http://twowire.com/dmc/apps/nbiws/auditmgmt/v1_0" xmlns:ns4="http://twowire.com/dmc/apps/nbiws/configurationmgmt/v1_0" xmlns:ns5="http://twowire.com/dmc/apps/nbiws/devicediagnostics/v1_0" xmlns:ns6="http://twowire.com/dmc/apps/nbiws/devicemgmt/v1_0" xmlns:ns7="http://twowire.com/dmc/apps/nbiws/groupmgmt/v1_0" xmlns:ns8="http://twowire.com/dmc/apps/nbiws/subscribermgmt/v1_0" xmlns:ns9="http://twowire.com/dmc/apps/nbiws/workflowmgmt/v1_0"><ns6:parameterValue><ns2:name>InternetGatewayDevice.DeviceSummary</ns2:name><ns2:value>InternetGatewayDevice:1.4[](Baseline:1,Time:1,IPPing:1,CaptivePortal:1,TraceRoute:1,EthernetLAN:1,WiFiLAN:1,DeviceAssociation:2),VoiceService:1.0[1](Baseline:1)</ns2:value></ns6:parameterValue></ns6:GetDeviceParameterValuesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>"""
xml_object = objectify.fromstring(xml_string)
print xml_object.__dict__
def read_run(url, csv_file):
csv_reader = csv.reader(open(csv_file))
for row in csv_reader:
print row
if len(row) == 1:
serial_number = row[0]
GetParameterValues_element(url, serial_number)
elif len(row) == 1:
print ' [serial_number] format provided, associate element with specified subscriber'
serial_number = row[0]
GetParameterValues_element(url, serial_number)
else:
print 'Invalid csv file provided'
print 'Only support below format'
print 'serial_number'
sys.exit(0)
print 'Complete All GPV.'
def GetParameterValues_element(url, serial_number):
request = u"""<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:v1="http://twowire.com/dmc/apps/nbiws/devicemgmt/v1_0"
xmlns:v11="http://twowire.com/dmc/apps/nbiws/base/v1_0"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>unHERE</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pwHERE</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<v1:GetDeviceParameterValuesRequest>
<v1:deviceSelector xsi:type="v11:SerialNumberAndOUIDeviceSelector" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<v11:serialNumber>184795206106368</v11:serialNumber>
<v11:oui>0000C5</v11:oui>
</v1:deviceSelector>
<!--1 or more repetitions:-->
<v1:parameterName>{0}</v1:parameterName>
<v1:timeout>
<v11:value>5</v11:value>
<v11:units>MINUTES</v11:units>
</v1:timeout>
</v1:GetDeviceParameterValuesRequest>
</soapenv:Body>
</soapenv:Envelope>""".format(serial_number)
soap_request(url, request)
def soap_request(url, request):
encoded_request = request.encode('utf-8')
headers = {'Content-Type': 'text/xml'}
response = requests.post(url=url, headers=headers, data=encoded_request, verify=False)
#print response.content
print response.content
write_csv(response.content)
def write_csv(data):
field_names = ["name"]
with open("testoutput.csv", "w") as f:
writer = csv.DictWriter(f, field_names)
collected_items = [
{
"name": "value",
},
]
# Write a header row
writer.writerow({x: x for x in field_names})
for item_property_dict in collected_items:
writer.writerow(item_property_dict)
if __name__ == '__main__':
opts, args = getopt.getopt(sys.argv[1:], 'hu:f:', ['url=', 'file=', 'help'])
sample_file = 'sample.csv'
soap_url = 'http://poc5.servername.online/dmc-nbiws/'
for k, v in opts:
if k in ['-h', '--help']:
print 'Usage :'
print '-h or --help\t Display script usage'
print '-u or --url\t The URL of Soap request, if it is not provided, using szeco142 by default'
print """-f or --file\t Sample data file, must be a csv file,
if it is not provided, using /opt/sample.csv by default"""
sys.exit(0)
if k in ['-u', '--url']:
soap_url = v
if k in ['-f', '--file']:
sample_file = v
print soap_url
print sample_file
read_run(soap_url, sample_file)
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns6:GetDeviceParameterValuesResponse xmlns:ns2="http://twowire.com/dmc/apps/nbiws/base/v1_0" xmlns:ns3="http://twowire.com/dmc/apps/nbiws/auditmgmt/v1_0" xmlns:ns4="http://twowire.com/dmc/apps/nbiws/configurationmgmt/v1_0" xmlns:ns5="http://twowire.com/dmc/apps/nbiws/devicediagnostics/v1_0" xmlns:ns6="http://twowire.com/dmc/apps/nbiws/devicemgmt/v1_0" xmlns:ns7="http://twowire.com/dmc/apps/nbiws/groupmgmt/v1_0" xmlns:ns8="http://twowire.com/dmc/apps/nbiws/subscribermgmt/v1_0" xmlns:ns9="http://twowire.com/dmc/apps/nbiws/workflowmgmt/v1_0">
<ns6:parameterValue>
<ns2:name>InternetGatewayDevice.DeviceInfo.UpTime</ns2:name>
<ns2:value>76689</ns2:value>
</ns6:parameterValue>
<ns6:parameterValue>
<ns2:name>InternetGatewayDevice.DeviceInfo.MemoryStatus.Total</ns2:name>
<ns2:value>484420</ns2:value>
</ns6:parameterValue>
<ns6:parameterValue>
<ns2:name>InternetGatewayDevice.DeviceInfo.FirstUseDate</ns2:name>
<ns2:value>1970-01-01T00:09:43Z</ns2:value>
</ns6:parameterValue>
</ns6:GetDeviceParameterValuesResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Когда я запускаю следующую команду через pprint, я получаю следующую ошибку «Traceback (последний вызов последним): Файл« ./test_soap.py », строка 27 , в pprint (xml_object ['SOAP -ENV: Envelope'] ['SOAP -ENV: Body'] ['ns6: GetDeviceParameterValuesResponse'] ['ns6: parameterValue'] ['ns2: name']) TypeError : индексы списка должны быть целыми числами, а не str "
, потому что у меня есть несколько параметров, возвращаемых с одинаковыми тегами ns2 и ns6
введите здесь описание изображения