Как проанализировать ответ XML и сохранить значение элемента в переменной? - PullRequest
0 голосов
/ 23 мая 2018

enter code here Я получаю XML-ответ от вызова API.

Мне нужно значение атрибута "testId" из этого ответа. Пожалуйста, помогите мне в этом.

   r=requests.get( myconfig.URL_webpagetest + "?url=" + testurl + "&f=xml&k=" + myconfig.apikey_webpagetest )

    xmltxt=r.content

    print (xmltxt)

    testId = XML (xmltxt).find("testId").text

    r=requests.get("http://www.webpagetest.org/testStatus.php?f=xml&test=" + testId )

xml response -

enter image description here

<?xml version="1.0" encoding="UTF-8"?>
<response>
<statusCode>200</statusCode>
<statusText>Ok</statusText>
<data>
<testId>180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</testId>
<ownerKey>dfc65d98de13c4770e528ef5b65e9629a52595e9</ownerKey>
<jsonUrl>http://www.webpagetest.org/jsonResult.php?test=180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</jsonUrl>
</data>
</response>

Отвечает следующая ошибка -

Трассировка (последний последний вызов): файл "/pagePerformance.py", строка 52, в testId = XML (xmltxt) .find("testId"). text AttributeError: объект 'NoneType' не имеет атрибута 'text'

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018
from lxml.etree import fromstring

string = '<?xml version="1.0" encoding="UTF-8"?> <response> <statusCode>200</statusCode> <statusText>Ok</statusText> <data><testId>180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</testId> <ownerKey>dfc65d98de13c4770e528ef5b65e9629a52595e9</ownerKey> <jsonUrl>http://www.webpagetest.org/jsonResult.php?test=180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</jsonUrl> </data> </response>'

response = fromstring(string.encode('utf-8'))
elm = response.xpath('/response/data/testId').pop()
testId = elm.text

Таким образом, вы можете искать любой элемент в xml из корневого / родительского элемента через XPATH.

Примечание: Мне не особенно нравится использовать метод pop для удаления элемента.из одного списка элементов.Так что, если у кого-то есть лучший способ сделать это, пожалуйста, дайте мне знать.До сих пор я думал:

1) elm = next (iter (response.xpath ('/ response / data / testId')))

2) просто оставить его в спискетак что его можно использовать как stararg

0 голосов
/ 26 сентября 2018

Я нашел эту статью на днях, когда она появилась в моей ленте, и она может удовлетворить ваши потребности.Я просмотрел его, но в целом пакет анализирует данные XML и преобразует теги / атрибуты / значения в словарь.Кроме того, автор указывает, что он также поддерживает структуру вложенности xml.

https://www.oreilly.com/learning/jxmlease-python-xml-conversion-data-structures

для вашего варианта использования.

>>> xml = '<?xml version="1.0" encoding="UTF-8"?> <response> <statusCode>200</statusCode> <statusText>Ok</statusText> <data> <testId>180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</testId> <ownerKey>dfc65d98de13c4770e528ef5b65e9629a52595e9</ownerKey> <jsonUrl>http://www.webpagetest.org/jsonResult.php?test=180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</jsonUrl> </data> </response>'

>>> root = jxmlease.parse(xml)
>>> testid = root['response']['data']['testId'].get_cdata()
>>> print(testid)
>>> '180523_YM_054fd7d84fd4ea7aed237f87289e0c7c'
0 голосов
/ 23 мая 2018

Используйте следующую команду для получения testId из ответа: -

import xml.etree.ElementTree as ET

response_xml_as_string = "xml response string from API"
responseXml = ET.fromstring(response_xml_as_string)
testId = responseXml.find('data').find('testId')
print testId.text
...