Поиск значения в XML на основе тега не абсолютной позиции - PullRequest
0 голосов
/ 04 февраля 2019

РЕДАКТИРОВАТЬ: В конечном итоге, я хочу, чтобы вывод в статической позиции и найти элемент должен быть таким же.В настоящее время я могу получить значение, используя статическую позицию в массиве, однако при поиске по тегу я не получаю никаких результатов.

Я новичок в работе с Python и XML, и яударившись о кирпичную стену и надеясь, что кто-то сможет предложить какое-то понимание.Мне было поручено работать с API в одном из наших приложений, чтобы вводить некоторые пользовательские поля на основе данных, полученных через XML из другого приложения.Частично это включает использование указанного API для поиска внутреннего идентификатора на основе общего идентификатора, и значение, которое мне нужно для продолжения процесса, отправляется обратно через API в виде данных XML.Я могу получить значение, если укажу абсолютное местоположение тега / значения XML, но когда я пытаюсь выполнить поиск по имени тега, я возвращаюсь с мусором.Я не уверен, что я делаю неправильно.Я пытался использовать etree.find, etree.findall, etree.findtext, и ни один из них, похоже, не работает.Ниже приведен пример (с некоторыми изменениями для защиты невинных) того, что я пытался сделать, а также пример XML-данных, которые API возвращает при поиске.

Python-скрипт для запроса API:

import requests
import xml.etree.ElementTree as ET


    PSExpData = s.get(URLpostvars, verify=False)

PSOrderXML = ET.fromstring(PSExpData.text)
PSOrderID = PSOrderXML[0][0].text

OrderIDElement = PSOrderXML.findtext("OrderID", namespaces="http://vendor.com/commissure/webservices/explorer/2010/06")
print (PSExpData.text)
print (f"Order ID from static position: {PSOrderID}")
print (f"Order ID from find element: {OrderIDElement}")

Пример возвращаемых данных XML

<ArrayOfOrderData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://vendor.com/commissure/webservices/explorer/2010/06">
    <OrderData>
        <OrderID>15397</OrderID>
        <ReportID>0</ReportID>
        <Accession>T0000000</Accession>
        <Site>SITE</Site>
        <OrderDate>0001-01-01T00:00:00</OrderDate>
        <Procedures>IMG3022</Procedures>
        <Status>Scheduled</Status>
        <Patient>LASTNAME, FIRSTNAME</Patient>
    </OrderData>
</ArrayOfOrderData>

Что говорит Python, когда я пытаюсь сделать выше ... когда я закомментирую строку 30, а также строку печати,он отлично работает со статическим положением:

Traceback (most recent call last):
  File "findorder.py", line 30, in <module>
    OrderIDElement = PSOrderXML.findtext("OrderID", namespaces="http://vendor.com/commissure/webservices/explorer/2010/06")
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/etree/ElementPath.py", line 320, in findtext
    elem = next(iterfind(elem, path, namespaces))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/etree/ElementPath.py", line 268, in iterfind
    else tuple(sorted(namespaces.items())))
AttributeError: 'str' object has no attribute 'items'

Я несколько раз повторял это и не знал, в чем дело.Я не уверен, может ли это быть как-то связано с тем фактом, что я возвращаю XML в качестве ответа HTTP, и мне нужно обрабатывать вещи иначе, но любая помощь будет принята с благодарностью.

...