Отображение данных XML с использованием Python - PullRequest
1 голос
/ 09 мая 2019

Попытка создать скрипт Python для отображения данных из сложного XML-файла, который меняется каждые 5-7 секунд. Ниже приведен пример XML-файла, с которым я работаю ...

<bsgame source="TAS Baseball/Softball" version="5.17.00" 
generated="4/9/2019">
<venue gameid="SB0409-1"
       visid="IUP-S" homeid="JOHN" visname="Indiana (PA)" 
homename="Seton Hill"
       date="4/9/2019" location="Greensburg, PA" 
stadium="" duration="" attend="0"
       leaguegame="N" start="3:00 PM" dhgame="1" 
schedinn="7"
       weather="sunny and warm">
<umpires></umpires>
<notes>
  <note text="Weather: sunny and warm"></note>
  <note text="Game: livegame"></note>
</notes>
<rules batters="9,9" usedh="Y"></rules>
</venue>
<team vh="V" id="IUP-S" name="Indiana (PA)" code="IUP-S">
<linescore line="0,0,0,0,1,1,3" runs="5" hits="9" 
 errs="2" lob="7">
  <lineinn inn="1" score="0"></lineinn>
  <lineinn inn="2" score="0"></lineinn>
  <lineinn inn="3" score="0"></lineinn>
  <lineinn inn="4" score="0"></lineinn>
  <lineinn inn="5" score="1"></lineinn>
  <lineinn inn="6" score="1"></lineinn>
  <lineinn inn="7" score="3"></lineinn>
</linescore>
<team vh="H" id="SHU-S" name="Seton Hill" code="SHU-S">
<linescore line="0,0,0,0,0,1,X" runs="1" hits="4" 
  errs="2" lob="3">
  <lineinn inn="1" score="0"></lineinn>
  <lineinn inn="2" score="0"></lineinn>
  <lineinn inn="3" score="0"></lineinn>
  <lineinn inn="4" score="0"></lineinn>
  <lineinn inn="5" score="0"></lineinn>
  <lineinn inn="6" score="1"></lineinn>
  <lineinn inn="7" score=""></lineinn>
</linescore>

Я заметил, что такие сервисы, как StretchInternet, конвертируют XML-файлы в Json для отображения данных. Я выяснил, как преобразовать XML в Json, используя xmltodict в Python.

 import json
 import xmltodict

 with open("/Volumes/GoogleDrive/My Drive/LIVE/XMLs/SB_Demo.xml", 'r') as f:
     xmlString = f.read()

 jsonString = json.dumps(xmltodict.parse(xmlString), indent=4)

 print("\nJSON output(output.json):")
 print(jsonString)

 with open("output.json", 'w') as f:
     f.write(jsonString)

Я нахожусь в тупике, куда идти отсюда. В конце концов, я хочу иметь возможность показывать общее количество RUNS (@runs) от обеих «команд» в видеопередаче. НО, я пошаговый парень. Шаг 1 ... как мне проанализировать этот XML с помощью xmltodict и отобразить только @runs для обеих «команд»?

1 Ответ

0 голосов
/ 13 мая 2019

Для начала, вы должны оставаться в соответствии с вашим цитированием (используйте "или")

Кроме того, в вашем xml отсутствует закрывающий тег </team> после каждого <linescore>

Что касается вашего вопроса - вы преобразуете свой XML-файл в строку JSON с json.dumps, что не будет полезным для того, что вы пытаетесь. Получите доступ к вашему объекту xmltodict как к Python dict

with open("YOUR_XML_FILE.xml", 'r') as f:
    xmlString = f.read()

xmlDict = xmltodict.parse(xmlString)

for team in xmlDict['bsgame']['team']:
    print(team['@name'], 'Runs :')
    print(team['linescore']['@runs'])

Что приводит к

Indiana (PA) Runs :
5
Seton Hill Runs :
1
...