[PYTHON] Rekursive Funktion, die die XML-Baumstruktur anzeigt [Hinweis]

Was willst du tun

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.

Umgebung

Hintergrund

    1. Die von OpenWeatherMap erhaltene XML-Struktur hat ein maximales Konzept für den 4. Stock, und ich möchte die Anweisungen für ElementTree beim Extrahieren von Temperatur- / Feuchtigkeitsdaten klarstellen.
  1. Ich möchte wissen, wie man dafür XML in einer Baumstruktur anzeigt.
    1. Es scheint, dass es gut funktioniert hat, wenn ich eine Wiederholung angewendet habe, also habe ich ein Memorandum gemacht.

Der Code, den ich am Anfang geschrieben habe

#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)

Das Ergebnis des Codes, den ich zuerst geschrieben habe

-> 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': '%'}

Code

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 , '')

Ergebnis

[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.

Zusammenfassung

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.

Die Seite, die ich als Referenz verwendet habe

Ergebnisbildschirm des Jupyter-Notebooks

木構造をディレクトリの様に表示.PNG

Recommended Posts

Rekursive Funktion, die die XML-Baumstruktur anzeigt [Hinweis]
So lösen Sie die rekursive Funktion, die abc115-D gelöst hat
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Rekursive Funktion
Beachten Sie, dass sich die Spezifikationen von Pandas loc geändert haben.
Diejenige, die den Fortschrittsbalken in Python anzeigt
Ein Shell-Programm, das eine Fibonacci-Sequenz anzeigt