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?
Rene K. schrieb:> for y in tagchild:> if y.attributes['id'].value == "Identify Controller":> print(y.attributes['value'].value)>> Das kann ja so irgendwie nicht richtig sein.
Ist es nicht. y hat kein Attribut 'value'. Ich würde vorschlagen, etwas
aussagekräftigere Namen als x und y zu verwenden.
Rene K. schrieb:> 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?
Rolf M. schrieb:> Ist es nicht. y hat kein Attribut 'value'. Ich würde vorschlagen, etwas> aussagekräftigere Namen als x und y zu verwenden.
Ja das war nur ein Test, wegen der Variablen. Und, das war nur ein
Ausschnitt aus der XML Datei, das original ist ca. 2MB groß.
Rolf M. schrieb:> 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.
Rene K. schrieb:> 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:
Rene K. schrieb:> 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.
[1] https://pypi.org/project/beautifulsoup4/
[2] https://www.crummy.com/software/BeautifulSoup/
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.
Oliver schrieb:> Traditionell wird auch gerne das etree Element in Python verwendet,> unter der Annahme, dass dein XML den Name "bla.xml" hat,
Schick... aber mein Vorschlag wäre:
1
from argparse import ArgumentParser
2
import xml.etree.ElementTree as ET
3
4
def main():
5
parser = ArgumentParser(description='...')
6
parser.add_argument('filename', help='file to parse')
Ein T. schrieb:> Schick... aber mein Vorschlag wäre:
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.
Ein T. schrieb:> 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.
Oliver schrieb:> 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.
> Was ist Parsen?
Mathematiker haben da eine klare Definition.
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