Как с помощью Python можно обработать XML файл полученный из SOAP?
Имеется вот такой код
# coding: utf-8
from lxml import etree
s = """<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:PinTabrequestResponse xmlns:ns2="http://temenos.com/CardPinTabRequest"><Status><successIndicator>Success</successIndicator></Status><PINTABREQUESTType><gPINTABREQUESTDetailType><mPINTABREQUESTDetailType><CardNumber>5412644511582146</CardNumber><ContractType>Yes</ContractType><CardNumber2></CardNumber2><NameSurname>AIGA VOLKOVA</NameSurname><PersonalCode>231279-11291</PersonalCode><CustomerId>977052</CustomerId><UserNameSurname></UserNameSurname><UserPersonalCode></UserPersonalCode><UserCustomerId></UserCustomerId><Language>2</Language><Residence>LV</Residence><Street>ANNINMUIZAS BULVARIS 60-15</Street><KeyPhrase>LINDE-KIRРTEINE</KeyPhrase><Sector>6000</Sector><AccountOfficer>762</AccountOfficer><Sex>2</Sex><RemoteServices></RemoteServices><PasportNumber>LV5014329</PasportNumber><PassportExpire>20250203</PassportExpire><PhoneNumber></PhoneNumber><MobileNumber>+37128325585</MobileNumber><CustomerPhoneNumber>+37128325585</CustomerPhoneNumber><UserPhoneNumber></UserPhoneNumber><UserMobileNumber>+37128325585</UserMobileNumber><AddressStreet></AddressStreet><AddressCity></AddressCity><AddressCountry>LV</AddressCountry><AddressZipCode>LV-1029</AddressZipCode><CompanyName></CompanyName><EmbossName>AIGA VOLKOVA</EmbossName><BankProductId>1644</BankProductId><BankProductName></BankProductName><CardCurrency>EUR</CardCurrency><Kinship>RF-LAIMDOT</Kinship><AdditionalCard></AdditionalCard><BatchType>2</BatchType><BatchDate>20140603</BatchDate><ActiveFrom>20140601</ActiveFrom><ExpiryDate>20230430</ExpiryDate><CardCondition>8488</CardCondition><CardType></CardType><CardTypeName></CardTypeName><AgreementNumber>2417687</AgreementNumber><TanCards></TanCards><CardProductId>5584</CardProductId><CardProductName>Norekinu karte MC</CardProductName><FeePaid></FeePaid><StudentCode></StudentCode><AccountNumber>436122087</AccountNumber><AccountIban></AccountIban><AltAccountNumber>LV41PARX0009770520001</AltAccountNumber><AltAccountNumberCcy>EUR</AltAccountNumberCcy><AccountTitle>AIGA VOLKOVA</AccountTitle><JointHolderId>1367257</JointHolderId><JointHolderName>GJENSIDIGE,AKCINE DRAUDIMO BENDROVE</JointHolderName><AgentCode></AgentCode><SubAgentCode></SubAgentCode><AccountCondition>6510</AccountCondition><AccountCategory>1600</AccountCategory><WorkingPlace>PAREX APDROРINВРANA A/S</WorkingPlace><CardRegion></CardRegion><OpeningDate>20060525</OpeningDate><CardComments>PARF 170717</CardComments><RetailPlace>772</RetailPlace><RetailPlaceName></RetailPlaceName><AgentCustomerId>635636</AgentCustomerId><DaoAgentCode></DaoAgentCode><DeptAgentCode></DeptAgentCode><PostingRestrict></PostingRestrict><MarketingAction></MarketingAction><MarketingActionName></MarketingActionName><LimitAmount>682.98</LimitAmount><Narrative></Narrative><AcqCanal></AcqCanal><AcqCanalName></AcqCanalName><SchoolCode></SchoolCode><SchoolName></SchoolName><Xsmart></Xsmart><RevolvingRate>5</RevolvingRate><DebitInterest>28</DebitInterest><PfkName></PfkName><PfkDao></PfkDao><PfkWorkPhone></PfkWorkPhone><PfkMobilePhone></PfkMobilePhone><PfkEmail></PfkEmail><PfkBranch></PfkBranch><PfkBranchAddress></PfkBranchAddress><AkcijasNosaukums></AkcijasNosaukums><PinTabKey>826</PinTabKey><ErrorMessage></ErrorMessage><signature>b5732bf103011366990e7ee14453b89f7c8f151a7a928df97fc85f5c08a2ca5c</signature></mPINTABREQUESTDetailType></gPINTABREQUESTDetailType></PINTABREQUESTType></ns2:PinTabrequestResponse></S:Body></S:Envelope>""".encode('utf-8')
root = etree.XML(s)
for i in root.iter('mPINTABREQUESTDetailType'):
print(i.tag, i.text)
но на выходе я получаю только это
mPINTABREQUESTDetailType None
как я могу получить всю информацию?
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Можно выборочно искать теги, например через find:
...
for tag in root.iter('mPINTABREQUESTDetailType'):
card_number = tag.find('CardNumber').text
working_place = tag.find('WorkingPlace').text
print(card_number, working_place)
# 5412644511582146 PAREX APDROРINВРANA A/S
Или вытащить все теги в словарь, где ключом будет имея тега, а значением его текстовое содержимое:
...
name_by_value = dict()
for tag in root.iter('mPINTABREQUESTDetailType'):
for child in tag:
name_by_value[child.tag] = child.text
print(name_by_value)
print(name_by_value['CardNumber'], name_by_value['WorkingPlace'])
# {'CardNumber': '5412644511582146', 'ContractType': 'Yes', 'CardNumber2': None, ...
# 5412644511582146 PAREX APDROРINВРANA A/S