Beim Schreiben der Fortsetzung dieses Artikels wurden Tipps gegeben. Ich möchte ein Memorandum darüber erstellen, wie die hierarchische Struktur in Python ausgedrückt wird, wenn die Baumstruktur von XML verstanden wird.
#Bibliothek importieren
import urllib.request
import urllib.parse
import xml.etree.ElementTree as et
import xml.dom.minidom as md
url='http://api.openweathermap.org/data/2.5/forecast?' #Basis-URL-Einstellung
query = {
'id' : '1850144' ,
'APPID' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', #Der Appid, den du hast*1
'units' : 'metric',
'mode' : 'xml'}#Wertgruppe, die in der Abfrage festgelegt werden soll
url = url + urllib.parse.urlencode(query) #URL-Generierung anfordern
response = urllib.request.urlopen(url) #http Anfrage
root = et.fromstring(response.read()) #Speichern Sie den abgerufenen Inhalt in XML Element
for sub1 in root.iter('weatherdata'):
print("->",sub1.tag, sub1.attrib)
for sub2 in sub1:
print(" ->",sub2.tag, sub2.attrib)
for sub3 in sub2:
print(" ->",sub3.tag, sub3.attrib)
for sub4 in sub3:
print(" ->",sub4.tag, sub4.attrib)
-> weatherdata {}
-> location {}
-> name {}
-> type {}
-> country {}
-> timezone {}
-> location {'altitude': '0', 'latitude': '35.6895', 'longitude': '139.6917', 'geobase': 'geonames', 'geobaseid': '1850144'}
-> credit {}
-> meta {}
-> lastupdate {}
-> calctime {}
-> nextupdate {}
-> sun {'rise': '2017-07-08T19:33:18', 'set': '2017-07-09T09:59:30'}
-> forecast {}
-> time {'from': '2017-07-09T12:00:00', 'to': '2017-07-09T15:00:00'}
-> symbol {'number': '800', 'name': 'clear sky', 'var': '02n'}
-> precipitation {}
-> windDirection {'deg': '197.01', 'code': 'SSW', 'name': 'South-southwest'}
-> windSpeed {'mps': '4.32', 'name': 'Gentle Breeze'}
-> temperature {'unit': 'celsius', 'value': '23.07', 'min': '23.07', 'max': '23.44'}
-> pressure {'unit': 'hPa', 'value': '1019.84'}
-> humidity {'value': '97', 'unit': '%'}
-> clouds {'value': 'clear sky', 'all': '8', 'unit': '%'}
-> time {'from': '2017-07-09T15:00:00', 'to': '2017-07-09T18:00:00'}
(Kürzung)
-> time {'from': '2017-07-14T09:00:00', 'to': '2017-07-14T12:00:00'}
-> symbol {'number': '500', 'name': 'light rain', 'var': '10n'}
-> precipitation {'unit': '3h', 'value': '0.67', 'type': 'rain'}
-> windDirection {'deg': '347.003', 'code': 'NNW', 'name': 'North-northeast'}
-> windSpeed {'mps': '6.57', 'name': 'Moderate breeze'}
-> temperature {'unit': 'celsius', 'value': '24.1', 'min': '24.1', 'max': '24.1'}
-> pressure {'unit': 'hPa', 'value': '1012.9'}
-> humidity {'value': '98', 'unit': '%'}
-> clouds {'value': 'broken clouds', 'all': '76', 'unit': '%'}
Aber als ich dachte, es sei nicht elegant, kam mir die Idee, es rekursiv zu machen, und erstellte eine rekursive Funktion. Ich dachte darüber nach, die Anzeigemethode in die Verzeichnismethode zu ändern. Auf diese Weise können Sie die Tiefe und den vollständigen Pfad verfolgen. Darüber hinaus kann der Name des Stammelements mit root.tag abstrakt ausgedrückt werden, sodass er in verschiedenen XML-Dokumenten verwendet werden kann.
#Funktionen für die Wiederholung einstellen
def print_elements( element , depth , fullpath ):
line = '[' + str(depth) + '] ' + fullpath + '/' + element.tag + str(element.attrib)
print( line )
for sub in element:
print_elements( sub , depth + 1 , fullpath + '/' + element.tag )
#Bibliothek importieren
import urllib.request
import urllib.parse
import xml.etree.ElementTree as et
import xml.dom.minidom as md
url='http://api.openweathermap.org/data/2.5/forecast?' #Basis-URL-Einstellung
query = {
'id' : '1850144' ,
'APPID' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', #Der Appid, den du hast*1
'units' : 'metric',
'mode' : 'xml'}#Wertgruppe, die in der Abfrage festgelegt werden soll
url = url + urllib.parse.urlencode(query) #URL-Generierung anfordern
response = urllib.request.urlopen(url) #http Anfrage
root = et.fromstring(response.read()) #Speichern Sie den abgerufenen Inhalt in XML Element
for sub in root.iter(root.tag):
print_elements( sub , 1 , '')
[1] /weatherdata{}
[2] /weatherdata/location{}
[3] /weatherdata/location/name{}
[3] /weatherdata/location/type{}
[3] /weatherdata/location/country{}
[3] /weatherdata/location/timezone{}
[3] /weatherdata/location/location{'altitude': '0', 'latitude': '35.6895', 'longitude': '139.6917', 'geobase': 'geonames', 'geobaseid': '1850144'}
[2] /weatherdata/credit{}
[2] /weatherdata/meta{}
[3] /weatherdata/meta/lastupdate{}
[3] /weatherdata/meta/calctime{}
[3] /weatherdata/meta/nextupdate{}
[2] /weatherdata/sun{'rise': '2017-07-08T19:33:19', 'set': '2017-07-09T09:59:29'}
[2] /weatherdata/forecast{}
[3] /weatherdata/forecast/time{'from': '2017-07-09T15:00:00', 'to': '2017-07-09T18:00:00'}
[4] /weatherdata/forecast/time/symbol{'number': '500', 'name': 'light rain', 'var': '10n'}
[4] /weatherdata/forecast/time/precipitation{'unit': '3h', 'value': '0.0075', 'type': 'rain'}
[4] /weatherdata/forecast/time/windDirection{'deg': '204.001', 'code': 'SSW', 'name': 'South-southwest'}
[4] /weatherdata/forecast/time/windSpeed{'mps': '4.31', 'name': 'Gentle Breeze'}
[4] /weatherdata/forecast/time/temperature{'unit': 'celsius', 'value': '23.34', 'min': '22.9', 'max': '23.34'}
[4] /weatherdata/forecast/time/pressure{'unit': 'hPa', 'value': '1019.56'}
[4] /weatherdata/forecast/time/humidity{'value': '100', 'unit': '%'}
[4] /weatherdata/forecast/time/clouds{'value': 'scattered clouds', 'all': '32', 'unit': '%'}
[3] /weatherdata/forecast/time{'from': '2017-07-09T18:00:00', 'to': '2017-07-09T21:00:00'}
(Kürzung)
[3] /weatherdata/forecast/time{'from': '2017-07-14T12:00:00', 'to': '2017-07-14T15:00:00'}
[4] /weatherdata/forecast/time/symbol{'number': '500', 'name': 'light rain', 'var': '10n'}
[4] /weatherdata/forecast/time/precipitation{'unit': '3h', 'value': '0.27', 'type': 'rain'}
[4] /weatherdata/forecast/time/windDirection{'deg': '320.001', 'code': 'NW', 'name': 'Northwest'}
[4] /weatherdata/forecast/time/windSpeed{'mps': '5.11', 'name': 'Gentle Breeze'}
[4] /weatherdata/forecast/time/temperature{'unit': 'celsius', 'value': '24.35', 'min': '24.35', 'max': '24.35'}
[4] /weatherdata/forecast/time/pressure{'unit': 'hPa', 'value': '1013.6'}
[4] /weatherdata/forecast/time/humidity{'value': '96', 'unit': '%'}
[4] /weatherdata/forecast/time/clouds{'value': 'few clouds', 'all': '20', 'unit': '%'}
Nun, es scheint, dass es so gut gelaufen ist. Es fühlt sich gut an, das ganze Gefühl ohne zu zögern erfassen zu können.
Die Holzstruktur war extrem tief. Diese Notation kann gut sein, um das ganze Gefühl zu erfassen. Ein Zwischenausdruck zum Erfassen der Struktur. Nützlich, um zu organisieren, welche Elemente und welche Attribute Sie möchten. Diese rekursive Funktion kann (sollte) in anderen XML-Dokumenten verwendet werden.
Recommended Posts