#python #xml #elementtree #xml-namespaces
Вопрос:
Файл в следующем формате (я сократил данные как можно больше, так как это очень большой файл). Это прогноз погоды на ближайшие 274 часа в сыром виде:
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<kml:kml xmlns:dwd="https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:xal="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<kml:Document>
<kml:ExtendedData>
<dwd:ProductDefinition>
... #Several more Values
<dwd:ForecastTimeSteps>
<dwd:TimeStep>2021-07-22T10:00:00.000Z</dwd:TimeStep>
... #247 Values
</dwd:ForecastTimeSteps>
</dwd:ProductDefinition>
</kml:ExtendedData>
<kml:Placemark>
<kml:name>K2932</kml:name>
<kml:description>TUTTLINGEN</kml:description>
<kml:ExtendedData>
<dwd:Forecast dwd:elementName="PPPP">
<dwd:value>###247 PPPP-Values according to the Time above###.</dwd:value>
</dwd:Forecast>
<dwd:Forecast dwd:elementName="E_PPP">
<dwd:value>###247 E_PP-Values according to the Time above###</dwd:value>
</dwd:Forecast>
... ### Many more of there Elements
<dwd:Forecast dwd:elementName="RR1c">
<dwd:value>###247 RR1c-Values according to the Time above###</dwd:value>
</dwd:Forecast>
</kml:ExtendedData>
</kml:Placemark>
</kml:Document>
</kml:kml>
Мне нужно получить значения RR1C. Это мой подход:
from xml.etree import ElementTree as etree
dwd = '{https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd}'
with open('./tmp/forecast/MOSMIX_L_2021072209_K2932.kml', 'rt') as f:
root = etree.parse(f)
root.find('.//{0}Forecast'.format(dwd)).attrib['{0}elementName'.format(dwd)]
Выход[]: ‘PPPP’
Я не знаю, как перейти к «RR1c», а там и к самим «значениям». Кто-нибудь?
Комментарии:
1. Я не знаю ElementTree, но на уровне XPath это просто
//dwd:Forecast [@dwd:elementName="RR1c"]
.
Ответ №1:
Как отметил Майкл Кей в комментарии, это можно было бы сделать с помощью XPath. Вот пример:
from xml.etree import ElementTree as etree
# declare namespaces map
ns = {
'dwd' : 'https://opendata.dwd.de/weather/lib/pointforecast_dwd_extension_V1_0.xsd'
}
with open('./tmp/forecast/MOSMIX_L_2021072209_K2932.kml', 'rt') as f:
root = etree.parse(f)
# retrieve value using xpath (returns list of elements matching criteria)
forecasts = root.findall('.//dwd:Forecast[@dwd:elementName="RR1c"]/dwd:value', ns)
# print text of the first element found
print(forecasts[0].text)