Получение xml мыльного ответа вместо необработанных данных - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь получить мыльный ответ и прочитать несколько тегов, а затем поместить ключ и значения в словарь.

Лучше было бы, если бы я мог использовать сгенерированный ответ напрямую и предварительно выполнить с ним операции regd. Но так как я не смог этого сделать, я попытался сохранить ответ в XML-файле, а затем использовать его для операций.

Моя проблема в том, что сгенерированный ответ находится в необработанном виде. Как решить эту проблему.

Example: <medical:totEeCnt val="2" />
          <medical:totMbrCnt val="2" />
          <medical:totDepCnt val="0" />


def soapTest():
    request = """<soapenv:Envelope.......
    auth = HTTPBasicAuth('', '')
        headers = {'content-type': 'application/soap+xml', 'SOAPAction': "", 'Host': 'bfx-b2b....com'}
        url = "https://bfx-b2b....com/B2BWEB/services/IProductPort"
        response = requests.post(url, data=request, headers=headers, auth=auth, verify=True)

        # Open local file
        fd = os.open('planRates.xml', os.O_RDWR|os.O_CREAT)

        # Convert response object into string
        response_str = str(response.content)

        # Write response to the file
        os.write(fd, response_str)

        # Close the file
        os.close(fd)

        tree = ET.parse('planRates.xml')
        root = tree.getroot()
        dict = {}

        print root
        for plan in root.findall('.//{http://services.b2b.../types/rates/dental}dentPln'):  # type: object

            plan_id = plan.get('cd')
            print plan

            print plan_id

            for rtGroup in plan.findall('.//{http://services.b2b....com/types/rates/dental}censRtGrp'):

                #print rtGroup
                for amt in rtGroup.findall('.//{http://services.b2b....com/types/rates/dental}totAnnPrem'):
                    # print amt
                    print amt.get('val')
                    amount =  amt.get('val')
                    dict[plan_id] = amount

                print dict

Обновление-: Я сделал несколько вещей, что я не могу понять, это то, что используя это, далее работают операции,

     tree = ET.parse('data/planRates.xml')
        root = tree.getroot()
        dict = {}
        print tree
        print root
for plan in root.findall(..

вывод -

<xml.etree.ElementTree.ElementTree object at 0x100d7b910>
<Element '{http://schemas.xmlsoap.org/soap/envelope/}Envelope' at 0x101500450>

Но после использования это не работает

    tree = ET.fromstring(response.text)
    print tree
for plan in tree.findall(..

выход -:

<Element '{http://schemas.xmlsoap.org/soap/envelope/}Envelope' at 0x10d624910>

В основном я использую только один и тот же объект.

1 Ответ

0 голосов
/ 28 августа 2018

Предположим, вы получите требуемый ответ как правильный объект xml:

rt = resp.text.encode('utf-8')

# printed rt is something like:
'<soap:Envelope xmlns:soap="http://...">
 <soap:Envelope
 <AirShoppingRS xmlns="http://www.iata.org/IATA/EDIST" Version="16.1">
 <Document>...</soap:Envelope</soap:Envelope>'

# striping soapEnv
startTag = '<AirShoppingRS '
endTag = '</AirShoppingRS>'
trimmed = rt[rt.find(startTag): rt.find(endTag) + len(endTag)]

# parsing
from lxml import etree as et
root = et.fromstring(trimmed)

С этим корневым элементом вы можете использовать метод find, xpath или любой другой.
Очевидно, вам нужно изменить начальный и конечный теги, чтобы извлечь правильный ответ из ответа, но вы поняли идею, верно?

...