if y.attributes['id'].value == "Identify Controller":
12
print(y.attributes['value'].value)
Das kann ja so irgendwie nicht richtig sein. Mit firstChild komme ich auch nicht weiter, da gibt er mir keine Daten zurück. Kann man das nicht irgendwie in ein Array parsen damit ich leichteren Zugriff darauf habe?
Du meinst so wie du es in den Ebenen darüber schon machst? Warum sollte
das nicht gehen?
Da es sich um viele weitere Ebenen nach unten verschachtelt. Stellenweise bis zu 7 Ebenen. Da wird der Code, die Schleifen und die Abfragen schon extrem unübersichtlich.
Da es sich um viele weitere Ebenen nach unten verschachtelt.
Stellenweise bis zu 7 Ebenen. Da wird der Code, die Schleifen und die
Abfragen schon extrem unübersichtlich.
So ist das bei XML öfter mal. Du musst ja nicht alles in einer einzigen Funktion bearbeiten, sondern kannst das auf mehrere Funktionen verteilen. So bleibt jede für sich gesehen übersichtlich.
So hast du dann beispielsweise eine Funktion extractMetaProperties, der du dein Element übergibst, und die dann über alle MetaProperty-Elemente darin iteriert und dir die daraus extrahierten Daten als Python-Objekt oder Liste zurückgibt.
Super, ja das mit den einzelnen Funktionen ist natürlich so ne Sache wie mit den Bäumen und den Wald. :-D
Ich habe es nun wie folgt, und kann sie so auch relativ leicht parsen, ich kann mir ja dann auch die üblichen Verdächtigen in eine Separate Funktion übergeben. z.b. string GetDirectVal(Device, MetaStructure, MetaProperty). Das mache ich aber heute nimmer :-D
1
from xml.dom import minidom
2
3
XMLOut = minidom.parse("ADUReport.xml")
4
5
# Device
6
# |
7
# -> MetaStructure
8
# |
9
# -> MetaProperty
10
# |
11
# -> MetaPropertyStructure
12
# |
13
# -> MetaStructure (without ID)
14
# |
15
# -> MetaProperty (multi)
16
17
18
19
# ----------------- Sub Functions
20
21
def GetDevice(Parent, deviceName):
22
device = []
23
SubDevice = Parent.getElementsByTagName('Device')
24
for x in SubDevice:
25
if x.hasAttribute('deviceType'):
26
if x.attributes['deviceType'].value == deviceName:
Super, ja das mit den einzelnen Funktionen ist natürlich so ne Sache wie
mit den Bäumen und den Wald. :-D
Das Modul bs4 [1,2] wird zwar meistens zum Parsen und Auseinanderpflücken von HTML benutzt, kommt aber auch mit XML prima klar und hat den Vorteil, daß es dort sehr leistungsfähige Suchfunktionen für die Inhalte gibt.
Traditionell wird auch gerne das etree Element in Python verwendet, unter der Annahme, dass dein XML den Name "bla.xml" hat, sollte folgender Code dir ein Hinweis geben, wie man xml parsen könnte.
Auch fein, aber das Beispiel ist auf das Wesentliche reduziert. Es fehlt auch noch ein wenig Fehlerbehandlung, wenn die Datei nicht da ist oder nicht erwarteten Inhalt hat.
from argparse import ArgumentParser
import xml.etree.ElementTree as ET
Wenn man pedantisch ist, könnte man hier anmerken, dass es gelebte Praxis ist, erst Import und dann from zu verwenden, aber das ist nicht durch Pep8 abgedeckt, sondern mehr sowas wie ein Gentlemans-Agreement unter Entwicklern und daher keine wirkliche Kritik.
Auch fein, aber das Beispiel ist auf das Wesentliche reduziert. Es fehlt
auch noch ein wenig Fehlerbehandlung, wenn die Datei nicht da ist oder
nicht erwarteten Inhalt hat.
Dann gibt es eine Exception, und das Programm steigt mit Fehlermeldung und Traceback aus...
Wenn man pedantisch ist, könnte man hier anmerken, dass es gelebte
Praxis ist, erst Import und dann from zu verwenden, aber das ist nicht
durch Pep8 abgedeckt, sondern mehr sowas wie ein Gentlemans-Agreement
unter Entwicklern und daher keine wirkliche Kritik.
Ja, manche Entwickler halten das so, und ich auch -- allerdings mit einer anderen Regel: bei mir wird zuerst aus den Standardmodulen inkludiert, die Python mitliefert, danach wird aus externen Modulen inkludiert, die etwa mit pip oder Poetry installiert wurden, zuletzt kommen dann Includes aus meinen eigenen, selbstimplementierten Modulen. Die Include-Blöcke werden dabei mit Leerzeilen getrennt, so daß man sofort und auf den ersten Blick sieht, woher welcher Import stammt. Innerhalb der Blöcke befolge ich dann die genannte Regel, plus natürlich: niemals "from bla import *".
Wie kann ich da am dümmsten durch die einzelnen MetaStructures bei
Device parsen?
Bei XML musst du nicht unbedingt DOM nehmen. Gibt auch Libraries wie xmltodict, die normale Python Objekte liefern. Aber schon alleine dass es dutzende davon gibt, zeigt - die sind auch nicht wesentlich besser als DOM.
Scannen ist, wenn du ein Wort oder ein Zeichen nach dem anderen abarbeiten kannst.
Parsen ist, wenn du Rekursion brauchst. Wenn du z.B. zuerst alle <MetaProperty> Elemente parsen musst, bevor du das <ADUReport>...</ADUReport> abarbeiten kannst