Разбор имен атрибутов XML - PullRequest
0 голосов
/ 25 апреля 2018

Python, в настоящее время используется 2.7, но может легко измениться на последний и самый лучший.

Необходимо проанализировать этот XML и вернуть значение INT, содержащееся в элементе. Это не мой XML. Это происходит из части программного обеспечения уровня предприятия.

<counters>
<item name="stats/counters/session/responsetime" type="int">1047</item>
<item name="stats/counters/session/responsecount" type="int">7423</item>
<item name="stats/counters/init/inittime" type="int">36339</item>
<item name="stats/counters/init/fetchtime" type="int">8097</item>
<item name="stats/connectionsetups" type="int">579</item>
<item name="stats/activesessions" type="int">4294967289</item>
<item name="stats/activeconnections" type="int">0</item>
</counters>

Код:

import xml.etree.ElementTree as ET
import xml

def _getstats():
 resp = requests.get(urlStats)

 #Writing XML to disk. This makes parsing it MUCH easier.
 with open('stats_10.xml', 'wb') as f:
    f.write(resp.content)
    f.close()

tree = ET.parse('stats_10.xml')
root = tree.getroot()

active = root.find('stats/activesessions')

print active

Возвращение всегда Нет. Я использую ElementTree. Прочитайте документацию (https://docs.python.org/3.0/library/xml.etree.elementtree.html) и многие страницы StackOF.

Я думаю, проблема в том, что парсер не понимает косую черту.

Попытка извлечь по имени, используя «active = int (root ['stats / activesessions'])» вместо корневого поиска, который возвращает эту ошибку:

TypeError: list indices must be integers, not str

Также пробовал xmltodict, но это было еще хуже, чем при использовании ElementTree. Ошибка всегда будет такова: «индексы списка должны быть целыми числами».

Наконец, это динамический XML-документ. Индексирование по ROW не является опцией, потому что на холостом ходу программа возвращает, например, 10 строк, а при нагрузке - 15, при этом дополнительные строки смешиваются с другими строками. Я должен тянуть по имени ребенка.

Заранее благодарю за любую помощь!

Сложение:

Я могу запустить итерацию по XML и вытащить значение. Однако, как указано выше, XML изменится, и число строк увеличится, что приведет к потере моих индексов.

active = root[5].text
print active

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Это, очевидно, я не понимаю XML и как он структурирован. Добавил это в мой код, и я получил искомое возвращаемое значение.

for item in root.findall("./item[@name='system/starttime']"):
starttime = int(item.text)
0 голосов
/ 25 апреля 2018

Я полагаю, что метод find ищет имя тега, а не значение атрибута.Вам нужно найти тег элемента, проверить, имеет ли он атрибут name, а затем проверить, равен ли атрибут «stats / activesessions».Если это условие выполнено, вы можете прочитать значение тега элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...