Eujene
@Eujene
Айти или не айти?

Как распарсить данный soap?

Здравствуйте.

Коллеги, есть вот такой soap файл (его часть):

<ns0:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:ns1="http://schemas.sitels.ru/marti/contextheaders"
              xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
              xmlns:ns3="http://schemas.sitels.ru/FORIS/IL/PortType/CustomerInformation"
              xmlns:ns5="http://schemas.sitels.ru/FORIS/IL/DomainModel/Crm"
              xmlns:ns6="http://schemas.sitels.ru/FORIS/IL/DomainModel"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns0:Header>
        <ns1:MartiExecutionContext>
            <ns2:KeyValueOfstringstring>
                <ns2:Key>last-called-actual-server</ns2:Key>
                <ns2:Value>a08-il03</ns2:Value>
            </ns2:KeyValueOfstringstring>
            <ns2:KeyValueOfstringstring>
                <ns2:Key>last-call-server-ms</ns2:Key>
                <ns2:Value>98</ns2:Value>
            </ns2:KeyValueOfstringstring>
        </ns1:MartiExecutionContext>
    </ns0:Header>
    <ns0:Body>
        <ns3:GetPaymentListByAccountNumberResponse>
            <ns3:GetPaymentListByAccountNumberResult>
                <ns3:AccountId xsi:nil="true"/>
                <ns3:AccountNumber>text</ns3:AccountNumber>

******


Я пытаюсь его распарсить, выделив элемент AccountNumber:
from xml.etree import ElementTree as ET

url = "url"

tree = ET.parse('bparser/xml_templates/payments.xml')
pl = ET.tostring(tree.getroot())

payload = '{}'.format(pl)
headers = {
    'Accept-Encoding': "gzip,deflate",
    'Content-Type': "text/xml",
   '***':'***',
}

response = requests.request("POST", url, data=payload, headers=headers)

dom = ET.fromstring(response.content)
dom_str = ET.tostring(dom,  encoding='utf-8')

namespaces = {'xmlns:ns0':"http://schemas.xmlsoap.org/soap/envelope/",
              'xmlns:ns1':"http://schemas.sitels.ru/marti/contextheaders",
              'xmlns:ns2':"http://schemas.microsoft.com/2003/10/Serialization/Arrays",
              'xmlns:ns3':"http://schemas.sitels.ru/FORIS/IL/PortType/CustomerInformation",
              'xmlns:ns5':"http://schemas.sitels.ru/FORIS/IL/DomainModel/Crm",
              'xmlns:ns6':"http://schemas.sitels.ru/FORIS/IL/DomainModel",
              'xmlns:xsi':"http://www.w3.org/2001/XMLSchema-instance"}

names = dom.findall('ns0:Body' 'ns3:GetPaymentListByAccountNumberResponse' 'ns3:GetPaymentListByAccountNumberResult''ns3:AccountNumber', namespaces)


При таких значениях выходит следующая ошибка:

SyntaxError: prefix 'ns0' not found in prefix map

Если убрать префиксы, то выводится пустой список.
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
@Jolt
Если я правильно понял, и вам надо выделить text из последней строки, то как-то так:
from re import findall
pattern = r'''<ns3:AccountNumber>(.*)</ns3:AccountNumber>'''
result = findall(pattern, text)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы