I started by converting XML to JSON.
I have a nested value I would like to find the index of in order to retrieve it's sibling dictionary. These elements are under the same parent Location
. The JSON below is abridged, there are many more Location
dictionaries.
For example, from providing a value of New York
to:
Location > LocationMetaData > LocationName
I'd like to retrieve:
Location > LocationData > TimeData > Period > DateTimeTo
and
Location > LocationData > TimeData > Element > ElementIndex
I'm stuck here, trying something along the lines of:
json_d['Root']['Location'][0]['LocationMetaData']['LocationName']
JSON
{
"Root":{
"Origin":{
"Firstname":"Guy",
"Lastname":"Man"
},
"Identification":{
"Title":"The Title",
"DateTime":"2022-05-26 09:00"
},
"Location":[
{
"LocationMetaData":{
"LocationId":"192",
"LocationName":"New York"
},
"LocationData":{
"TimeData":[
{
"Period":{
"DateTimeFrom":"2022-05-26 12:00",
"DateTimeTo":"2022-05-26 13:00"
},
"Element":{
"ElementValue":"V",
"ElementIndex":"9"
}
},
{
"Period":{
"DateTimeFrom":"2022-05-26 13:00",
"DateTimeTo":"2022-05-26 14:00"
},
"Element":{
"ElementValue":"V",
"ElementIndex":"8"
}
},
{
"Period":{
"DateTimeFrom":"2022-05-26 14:00",
"DateTimeTo":"2022-05-26 15:00"
},
"Element":{
"ElementValue":"H",
"ElementIndex":"6"
}
}
]
}
}
],
"Location":[
{
"LocationMetaData":{
"LocationId":"168",
"LocationName":"Chicago"
},
"LocationData":{
"TimeData":[
{
"Period":{
"DateTimeFrom":"2022-05-26 12:00",
"DateTimeTo":"2022-05-26 13:00"
},
"Element":{
"ElementValue":"V",
"ElementIndex":"9"
}
},
{
"Period":{
"DateTimeFrom":"2022-05-26 13:00",
"DateTimeTo":"2022-05-26 14:00"
},
"Element":{
"ElementValue":"V",
"ElementIndex":"8"
}
},
{
"Period":{
"DateTimeFrom":"2022-05-26 14:00",
"DateTimeTo":"2022-05-26 15:00"
},
"Element":{
"ElementValue":"H",
"ElementIndex":"6"
}
}
]
}
}
]
}
}
Python
#!/usr/bin/env python3
import xmltodict
import json
import requests
url = "https://example.com/file.xml"
xml = requests.get(url)
json_s = json.dumps(xmltodict.parse(xml.content), indent=2)
#print(json_s)
#dict
json_d = json.loads(json_s)
#need to find index by providing value of LocationName
json_d = json_d['Root']['Location'][0]
city = json_d['LocationMetaData']['LocationName'] #new york
count = 0
for key in json_d['LocationData']['TimeData']:
timeto = key['Root']['DateTimeTo']
indx = key['Element']['ElementIndex']
level = key['Element']['ElementValue']
level = {
'L': 'Low',
'M': 'Medium',
'H': 'High',
'V': 'Very High',
'E': 'Extreme'} [level]
print(f'{timeto}\t{indx} ({level})')
count = 1
if count == 15: break
CodePudding user response:
If json_d
is your parsed json file, you can try:
for location in json_d["Root"]["Location"]:
city = location["LocationMetaData"]["LocationName"]
date_time_to = []
element_idx = []
element_values = []
for td in location["LocationData"]["TimeData"]:
date_time_to.append(td["Period"]["DateTimeTo"])
element_idx.append(td["Element"]["ElementIndex"])
element_values.append(td["Element"]["ElementValue"])
print(city)
print("-" * 80)
for t, e, v in zip(date_time_to, element_idx, element_values):
print(f"{t} - {e} - {v}")
print()
Prints:
Chicago
--------------------------------------------------------------------------------
2022-05-26 13:00 - 9 - V
2022-05-26 14:00 - 8 - V
2022-05-26 15:00 - 6 - H