Почему оператор не работает при разборе ElementTree? - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь проанализировать файл xml, используя ElementTree, который выглядит следующим образом:

<Game>
  <Event timestamp="2016-08-14T14:23:33.634" id="1713385925" 
         version="1471181110290" last_modified="2016-08-14T14:25:11" y="11.0" 
         x="89.7" outcome="0" team_id="148" player_id="51327" sec="8" min="23" 
         period_id="1" type_id="4" event_id="205">

    <Q id="733814222" qualifier_id="265"/>
    <Q id="481660420" qualifier_id="286"/>
    <Q id="813378778" qualifier_id="152"/>
    <Q id="570443899" qualifier_id="56" value="Right"/>
    <Q id="420312891" qualifier_id="233" value="248"/>
    <Q id="1186861264" qualifier_id="13"/>
  </Event>

  <Event timestamp="2016-08-14T14:23:33.634" id="1635888622" 
         version="1471181110289" last_modified="2016-08-14T14:25:11" y="89.0" 
         x="10.3" outcome="1" team_id="143" player_id="169007" sec="8" min="23" 
         period_id="1" type_id="4" event_id="248">

    <Q id="1871787686" qualifier_id="56" value="Back"/>
    <Q id="176295814" qualifier_id="13"/>
    <Q id="69346842" qualifier_id="233" value="205"/>
    <Q id="1588029344" qualifier_id="265"/>
    <Q id="559785299" qualifier_id="285"/>
    <Q id="380723313" qualifier_id="152"/>
  </Event>
</Game>

Код, который я использую, прост и работает, как и ожидалось. Однако все меняется, когда я пытаюсь добавить if condition к коду

import xml.etree.ElementTree as ET

root = ET.parse(r'C:\Users\ADMIN\Desktop\Abhishek\PSG - Copy\Sample.xml').getroot()

Games = root.getchildren()
for Game in Games:
    Events = Game.getchildren()
    for Event in Events:
        type_id = Event.attrib["type_id"]
        team_id = Event.attrib["team_id"]
        Qualifiers = Event.getchildren()
        for Qualifier in Qualifiers:
            id_ = Qualifier.attrib['id']
            if id_ == 142:
                print ("val")

Вот ошибка, которую он выдает:

Warning (from warnings module):
  File "C:\Users\ADMIN\AppData\Local\Programs\Python\Python37\PSGPossessionSequences.py", line 9
    Games = root.getchildren()
DeprecationWarning: This method will be removed in future versions.  Use 'list(elem)' or iteration over elem instead.

Warning (from warnings module):
  File "C:\Users\ADMIN\AppData\Local\Programs\Python\Python37\PSGPossessionSequences.py", line 11
    Events = Game.getchildren()
DeprecationWarning: This method will be removed in future versions.  Use 'list(elem)' or iteration over elem instead.

Warning (from warnings module):
  File "C:\Users\ADMIN\AppData\Local\Programs\Python\Python37\PSGPossessionSequences.py", line 15
    Qualifiers = Event.getchildren()
DeprecationWarning: This method will be removed in future versions.  Use 'list(elem)' or iteration over elem instead.

Я попытался удалить if statement, и это прекрасно работает. Однако мне нужно установить условие для вызова всех id_ с определенным значением. Я пытался использовать "142", а также 142, но проблема сохраняется. Почему именно это происходит?

1 Ответ

1 голос
/ 27 апреля 2019

Ошибки, которые вы видите, являются не ошибками, а предупреждениями .Вы можете игнорировать их, заставить замолчать или исправить свой код, не используя .get_children();вместо этого вы можете выполнять итерацию непосредственно по каждому элементу XML:

root = ET.parse(r'C:\Users\ADMIN\Desktop\Abhishek\PSG - Copy\Sample.xml').getroot()

for Game in root:
    for Event in Game:
        # ...
        for Qualifier in Event:

Тест if не работает, поскольку атрибуты XML представляют собой строки , текст, а не целочисленные значения.Проверьте строку:

if id_ == "142":
    print("val")

Возможно, вы захотите использовать XPath-запросы вместо зацикливания всего.Базовая реализация ElementTree, которая поставляется с Python, немного ограничена.Вы бы получили гораздо более мощную реализацию, если бы вы установили библиотеку lxml , это Поддержка XPath намного лучше:

from lxml import etree as ET

document = ET.parse(r'C:\Users\ADMIN\Desktop\Abhishek\PSG - Copy\Sample.xml')
root = document.getroot()

qualifier = root.xpath(".//Event/Q[@id='142']")[0]
event = qualifier.getparent()
type_id = event.attrib["type_id"]
team_id = event.attrib["team_id"]
...