From 9afa082cd202937f0c5ceedd8a72843dc0289819 Mon Sep 17 00:00:00 2001 From: gitea Date: Wed, 1 Dec 2021 17:36:48 +0100 Subject: [PATCH] xmlt_tool.py xml baustelle --- utils/xmlt_tool.py | 462 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 462 insertions(+) create mode 100644 utils/xmlt_tool.py diff --git a/utils/xmlt_tool.py b/utils/xmlt_tool.py new file mode 100644 index 0000000..fed6ed3 --- /dev/null +++ b/utils/xmlt_tool.py @@ -0,0 +1,462 @@ +import dpath.util +import json +import yaml +import re +import datetime +from tools.reader import fcts as reader +""" +Register-Meldung erstellen +""" +class register(): + def __init__(self): + self.absender = Absender() + self.vrfelder = Vrfelder() + pass + + def schreibeRegister(self, content, regAdr): + ausgabe = {} + content["vrfelder"] = self.vrfelder + content["absender"] = self.absender.keys[regAdr] + # + ausgabe = self.schreibeProtokoll(ausgabe, content) + print( "ausgabe vorher: " + str( ausgabe)) + ausgabe = self.schreibeAbsender(ausgabe, content, regAdr) + print("ausgabe vorher: "+str(ausgabe)) + ausgabe = self.schreibeEmpfaenger(ausgabe, content) + print("ausgabe vorher: "+str(ausgabe)) + ausgabe = self.schreibeMetadaten(ausgabe, content) + print("ausgabe vorher: "+str(ausgabe)) + ausgabe = self.schreibeSegmentkopf(ausgabe, content) + print("ausgabe vorher: "+str(ausgabe)) + ausgabe["nachricht"]["datensegment"] = [] + for row in content["tabelle"]["person"]["_data"]: + print ("foreach row") + print (row) + satz = {} + satz = self.schreibeSegmentsatz(satz, content, row["_lfdNR"]) + # print("ausgabe vorher: "+str(ausgabe)) + ausgabe["nachricht"]["datensegment"].append(satz["datensegment"]) + return ausgabe + + """ Fuellt und ordnet Protokollknoten ein""" + def schreibeProtokoll(self, ausgabe, content): + ausgabe["protokoll"] = self.setProtokoll(content)["protokoll"] + return ausgabe + + def setProtokoll(self, content): + ausgabe = {} + d = datetime.datetime.now() + ausgabe = fcts.setMerkmal(ausgabe, '/protokoll/dokumentinstanz/datum', d.strftime("%Y%m%d")) + ausgabe = fcts.setMerkmal(ausgabe, '/protokoll/dokumentinstanz/uhrzeit', d.strftime("%H%M%S")) + ausgabe = fcts.setMerkmal(ausgabe, '/protokoll/dokumentinstanz/anwendung/anwendungsname', "Anwendungsname") + ausgabe = fcts.setMerkmal(ausgabe, '/protokoll/dokumentinstanz/anwendung/version', "Version") + ausgabe = fcts.setMerkmal(ausgabe, '/protokoll/dokumentinstanz/anwendung/hersteller', "StBA") + ausgabe = fcts.setMerkmal(ausgabe, '/protokoll/dokumentinstanz/ressourceID[@klasse="SDFMETA"]', "--RessourceID") + return ausgabe + + """ Fuellt und ordnet Absenderknoten ein""" + def schreibeAbsender(self, ausgabe, content, regAdr): + ausgabe["absender"] = self.setAbsender(content, regAdr) + return ausgabe + + def setAbsender(self, content, regAdr): + ausgabe = {} + for feld in Absender.FELDER: + ausgabe = fcts.setMerkmalContent(ausgabe, content, 0, feld) + return ausgabe + + """ Fuellt und ordnet Empfaengerknoten ein""" + def schreibeEmpfaenger(self, ausgabe, content): + ausgabe["empfaenger"] = self.setEmpfaenger(content)["empfaenger"] + return ausgabe + + def setEmpfaenger(self, content): + ausgabe = {} + ausgabe = fcts.setMerkmal(ausgabe, '/empfaenger/kennung[@klasse="STAID"]', '99') + return ausgabe + + """ Fuellt und ordnet Metadatenknoten ein""" + def schreibeMetadaten(self, ausgabe, content): + nachricht = self.setMetadaten(content) + for knoten in nachricht: + if knoten != "datensegment": + ausgabe[knoten] = nachricht[knoten] + return ausgabe + + def setMetadaten(self, content): + ausgabe = {} + d = datetime.datetime.now() + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/erhebung/kennung[@klasse="ERHID"]', 'ERHEBUNG_KENNUNG') + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/erhebung/ressource[@klasse="SDFMETA"]', 'ERHEBUNG_RESSOURCE_1') + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/erhebung/ressource[@klasse="SDF-ERZEUGUNG"]', 'ERHEBUNG_RESSOURCE_2') + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/berichtszeitraum/jahr', d.strftime("%Y")) + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/berichtsempfaenger/kennung[@klasse ="STAID"]', 'BERICHTSEMPFÄNGER_KENNUNG') + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/datenattribute/attribute::dezimalzeichen', 'DEZIMAL_ZEICHEN') + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/datenattribute/attribute::tausender-trennzeichen', 'TAUSENDER_TRENNZEICHEN') + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/hmm[@name="BerichtseinheitID"]/wert', 'BERICHTSEINHEIT_ID') + return ausgabe + + def schreibeSegmentkopf(self, ausgabe, content, ): + ausgabe = fcts.setMerkmal(ausgabe, '/nachricht/datensegment/meldungsID', 'MELDUNGS_ID') + return ausgabe + + def schreibeSegmentsatz(self, ausgabe, content, index): + for feld in Person.FELDER: + ausgabe = fcts.setMerkmalContent(ausgabe, content, index, feld) + return ausgabe + + +class Absender(): + FELDER = ("ABSENDER_KENNUNG", "ABSENDER_IDENTITÄT", "ABSENDER_TELEFON", "ABSENDER_EMAIL", "ABSENDER_FAX", "ABSENDER_URL", "BERICHTSEINHEIT_ID", "REGNAME") + + def __init__(self): + content = reader.readCsv("testdaten/allgemein/absender.csv", "keys") + self.keys = content["tabelle"]["absender"]["_keys"] + +class Vrfelder(): + def __init__(self): + with open(r'src/config/vrFelder.yml') as file: + content = yaml.full_load(file) + self.conf = content + + def getVrfeld(self, feld): + print("gerVrfeld "+feld) + if feld in self.conf["config"]: + print("gerVrfeld treffer"+feld) + return self.conf["config"][feld] + pass + +class Anschrift(): + FELDER = ("GEMSCHL", "HNR", "HNR_BUCHST", "HNR_TEILNR", "HNR_UNST", "ORTSTEIL", "ORTSTEIL_POST", "PLZ", "STOCKNR_WHG", "STR", "STRSCHL", "WOHNORT", "ZUSATZ") + +class Person(): + FELDER = ("IDNR", "DR", "FAMNAME", "FAMNAME_AE", "FAMNAME_BEST", "FAMNAME_ZUS", "FAMNAME_VOR", "FAMNAME_UNST", "GEB_DAT", "GEBNAME", "GEBNAME_BEST1", "GEBNAME_BEST2", "GEBNAME_UNST", "GEBSTAAT", "GEB_ORT", "GESCHLECHT", "STAATSANG", "VORNAME", "VORNAME_AE") + +""" +Werkzeuge, um Register-Merkmale zu erstellen, setzen, ... +""" +class fcts: + #+MULTI_NODE = ("mm", "hmm", "omm", "erhebung") + MULTI_NODE = ("erhebung") + #+ARRAY_NODE = ("satz", "ressource") + ARRAY_NODE = ("mm", "hmm", "omm", "satz", "ressource") + + def get + + def addMerkmal(baum, pfad, index, wert, ids=[]): + """ + Eingabe: + baum inklusive Elternknoten + pfad kompletter Pfad von Wurzel bis Blatt + index auf den Pfad + wert einzutragender Wert + Verarbeitung + basis der zu bearbeitende Knotenname extrahiert von Attributen + elem zu bearbeitender Knoten + zu betrachtende Fälle: + a: basis intendiert ein Array: + b: basis intendiert ein Dictionary: + c: basis ist ein einfacher Knoten + Weiter zu betrachten hinsichtlich Komplexität des Knotens + .a einfacher Knoten + .b Knoten mit Attribut als Blatt (anode+bnode) oder mit Unterknoten (nur anode) + Weiter zu betrachten hinsichtlich Pfadposition + ..a: Blatt - Wert eintragen und + ..b: im Pfad - weiterer rekursiver Aufruf + Ausgabe: + baum inklusive Elternknoten + """ + logdebug = 3 # Schalter zur Debug-Einstellung innerhalb der Funktion + if logdebug >= 1: print("--- addMerkmal "+pfad+" "+str(index)+" "+wert) + if logdebug >= 3: print("--- addMerkmal "+str(baum)) + + # # # # # # # # # # # # # # # # # # # # + # basis der zu bearbeitende Knotenname extrahiert von Attributen + # elem zu bearbeitender Knoten + elem = {} + a = pfad.strip('/').split('/') + anode = None # optional fuer Attribute + bnode = None # optional fuer direkte Wertzuordnung #text + basis = "" # Knotenname - ohne Attribute + + if ("[@" in a[index]): + if logdebug >= 1: print("0b") + basis = a[index][0:a[index].find("[@")] + attribs = a[index][a[index].find("[@")+1:a[index].find("]")] + aname = attribs[0:attribs.find("=")] + aval = attribs[attribs.find("=")+2:-1] + if logdebug >= 3 : print("0b "+basis+" : "+aname+" = "+aval) + aarr = [aname , aval] + anode = {} + anode[aname] = aval + if (index == len(a)-1): + barr = ["#text", wert] + bnode = {} + bnode["#text"] = wert + if logdebug >= 3 : print("0b "+basis+" "+str(anode)+" "+str(bnode)) + else: + basis = a[index] + if logdebug >= 3 : print("0b "+basis+" "+str(anode)+" "+str(bnode)) + if (basis in baum): + elem[basis] = baum[basis] + nindex = index+1 + if logdebug >= 1: print("1 "+a[index]+" "+wert+" "+str(baum)) + + # # # # # # # # # # # # # # # # # # # # + # zu betrachtende Fälle: + # a: basis intendiert ein Array: + # b: basis intendiert ein Dictionary: + # c: basis ist ein einfacher Knoten + # Weiter zu betrachten + # .a: Blatt - Wert eintragen und + # .b: im Pfad - weiterer rekursiver Aufruf + # # # Fall a : Array + if (basis in fcts.ARRAY_NODE): + if logdebug >= 1: print("a: ARRAY "+a[index-1]+"-"+basis+" "+str(baum)) + if (basis in baum): + if (isinstance(baum[basis], dict)): + print ("200 dict vorhanden") + if (len(baum[basis].keys()) <1): + elem[basis] = [] + elem[basis].append({}) + if (isinstance(baum[basis], list)): + print ("201 array vorhanden") + elem[basis] = baum[basis] + else: + print ("203 neues array") + elem[basis] = [] + elem[basis].append({}) + xnode = {} + if (anode ): + xnode = {} # Komplexitaetsfaelle in xnode setzen + if (anode): + if logdebug >= 3: print("a-b "+basis+" "+str(anode)) + ##elem[basis].append(anode) + if (not aarr[0] in elem[basis]): #+ + if logdebug >= 3: print("a-b "+basis+" anode ergaenzt "+str(anode)) + #-elem[basis].append(anode) + elem[basis][0][aarr[0]] = aarr[1] + xnode = anode + if (bnode): + if logdebug >= 3: print("-->a-b-a> kompl. Blatt "+basis+" "+str(bnode)) + #-elem[basis].append(bnode) + elem[basis][0][barr[0]] = barr[1] + baum[basis] = elem[basis] + if logdebug >= 3: print("<--a-b-a< kompl. Blatt "+basis+" "+str(elem)) + return baum + if logdebug >= 3: print("-->a-b-b> kompl. Pfad "+basis+" "+str(nindex)) + if ("[@" in a[nindex]): + subnode = a[nindex][0:a[nindex].find("[@")] + else: + subnode = a[nindex] + if not subnode in elem[basis][0]: + elem[basis][0][subnode] = {} + #+elem[basis].append(fcts.addMerkmal(xnode, pfad, nindex, wert)) + elem[basis][0][subnode] = fcts.addMerkmal(elem[basis][0][subnode], pfad, nindex, wert) + baum[basis] = elem[basis] + if logdebug >= 3: print("<--a-b-b< kompl. Pfad "+basis+""+str(baum)) + return baum ## + ##### Fall 3ab ## Dict + elif (basis in fcts.MULTI_NODE): + if logdebug >= 1: print("b: DICT "+basis) + if (not basis in baum): + print ("elem angelegt") + elem[basis] = {} + if (anode ): + if logdebug >= 3: print("b-b "+basis+" "+str(anode)) + elem[basis][aarr[0]] = aarr[1] + if (bnode): + elem[basis][barr[0]] = barr[1] + baum[basis] = elem[basis] + #elem[basis].append(bnode) + if logdebug >= 3: print("<<--b-b-a< kompl. Blatt "+basis+" "+str(index)+" "+str(elem)) + return baum + if ("[@" in a[index+1]): + subbasis = a[index+1][0:a[index+1].find("[@")] + if logdebug >= 3: print("-->b-b-b> kompl. Pfad "+basis+" "+str(index)+" "+str(elem)) + elem[basis] = fcts.addMerkmal(elem[basis], pfad, nindex, wert) + baum[basis] = elem[basis] + if logdebug >= 3: print("<--b-b-b< kompl. Pfad "+basis+" "+str(index)+" "+str(baum)) + return baum + else: + subbasis = a[index+1] + if logdebug >= 3: print("-->b-a-b> einf. Pfad "+basis+" "+str(index)+" "+str(elem)) + elem[basis][subbasis] = fcts.addMerkmal({}, pfad, nindex, wert) + baum[basis] = elem[basis] + if logdebug >= 3: print("<--b-a-b< einf. Pfad "+basis+" "+str(index)+" "+str(elem)) + return baum + # baum[basis] = elem[basis] + return baum[basis] + ###### Fall einfach + vorhanden + else: + if (basis in baum): + elem[basis] = baum[basis] + else: + elem[basis] = {} + if logdebug >= 1: print("c: EINFACH "+a[index-1]+"-"+basis+" "+str(baum)) + if (1 == len(a)-index): + if logdebug >= 3 : print("3b "+basis+" "+str(anode)+" "+str(bnode)) + if (anode): + elem[basis] = {} + elem[basis][aarr[0]] = aarr[1] + if logdebug >= 3 : print("3b1") + if (bnode): + elem[basis][barr[0]] = barr[1] + baum[basis] = elem[basis] + if logdebug >= 3 : print("<<-- c-b-a kompl. Blatt "+basis+" "+str(baum)) + return baum + elem[basis] = {} + elem[basis] = wert + baum[basis] = elem[basis] + if logdebug >= 3 : print("<<-- c-a-a einf. Blatt "+basis+" "+str(anode)+" "+str(baum)) + return baum + if (anode): + if logdebug >= 3: print("-->c-b-b> kompl. Pfad "+basis+" "+nindex) + elem[basis] = fcts.addMerkmal(elem[basis], pfad, nindex, wert) + baum[basis] = elem[basis] + if logdebug >= 3: print("<--c-b-b< kompl. Pfad "+basis+" "+nindex+" "+str(baum)) + return baum[basis][basis] ## + if logdebug >= 3: print("-->c-a-b> einf. Pfad "+basis) + baum[basis] = fcts.addMerkmal(elem[basis], pfad, nindex, wert) + if logdebug >= 3: print("<--c-a-b< einf. Pfad "+basis+" "+str(index)+" "+str(baum)) + return baum + + # ----------------------------------------- + def setMerkmal(baum, pfad, wert): + logdebug = 3 # Schalter zur Debug-Einstellung innerhalb der Funktion + if logdebug >= 1: print("----------------------------------------- setMerkmal ---------------------") + if logdebug >= 1: print("setMerkmal "+pfad+" "+wert) + #MULTI_NODE = ("mm", "hmm", "omm", "ressource") + elem = baum + if logdebug >= 2 : print ("setMerkmal "+pfad+" "+wert) + a = pfad.strip('/').split('/') + if ("[@" in a[0]): + basis = a[0][0:a[0].find("[@")] + else: + basis = a[0] + if (1 == len(a)): + baum[basis] = wert + return baum + if (basis in baum): + elem = baum[basis] + else: + elem = {} + # for i in range(0, len(a)): + if logdebug >= 1: print("setMerkmal "+basis+" "+str(elem)) + baum = fcts.addMerkmal(baum, pfad, 0, wert) + if logdebug >= 1: print("setMerkmal "+basis+" "+str(baum)) + if True: + return baum + if (1 == len(a)): + elem[a[0]] = wert + for i in range(0, len(a)): + if logdebug >= 3 : print("for "+str(i)+" "+a[i]) + if ("[@" in a[i]): + basis = a[i][0:a[i].find("[@")] + else: + basis = a[i] + print ("basis "+basis ) + #if (a[i] in elem): + if ((not basis in fcts.MULTI_NODE) and (basis in elem)): + if logdebug >= 3 : print("a "+basis) + elem = elem[basis] + else: + if ("[@" in a[i]): + if logdebug >= 3 : print("b "+a[i]) + node = a[i][0:a[i].find("[@")] + attribs = a[i][a[i].find("[@")+1:a[i].find("]")] + aname = attribs[0:attribs.find("=")] + aval = attribs[attribs.find("=")+2:-1] + if logdebug >= 3 : print("b "+node+" : "+aname+" = "+aval) + + if (node in elem): + if logdebug >= 3 : print("b "+node+" in elem ") + #if logdebug >= 3 : print(json.dumps(elem[node])) + if ("dict" in str(type(elem[node]))): + if logdebug >= 3 : print(node +" elem[node] ist dict") + xnode = elem[node] + elem[node] = [] + elem[node].append(xnode) + else: + if logdebug >= 3 : print(node+" elem[node] ist nicht dict"+str(type(elem[node]))) + pnode = {} + pnode[aname] = aval + print (str(i)+" ?= "+str(len(a))) + if (i == len(a)-1): + pnode["#text"] = wert + elem[node].append(pnode) + else: + elem[node] = {} + elem = elem[node] + elem[aname] = aval + if (i == len(a)-1): + elem["#text"] = wert + elif (i == len(a)-1): + if logdebug >= 3 : print("c "+a[i]) + elem[a[i]] = wert + else: + if logdebug >= 3 : print("d "+a[i]) + elem[str(a[i])] = {} + elem = elem[str(a[i])] + return baum + + def setMerkmalContent(baum, content, index, feld): + logdebug = 1 # Schalter zur Debug-Einstellung innerhalb der Funktion + if logdebug >= 1 : print ("setMerkmalContent "+feld+" "+content["absender"]["REGNAME"]) + vrfeld = content["vrfelder"].getVrfeld(feld) + if logdebug >= 2 : print(type(vrfeld)) + if logdebug >= 2 : print(json.dumps(vrfeld)) + tabelle = "#" + + + #print (type(vrfeld)+" "+str(vrfeld)) + if (("tabelle" in vrfeld.keys()) and (vrfeld["tabelle"] == "absender")): + if logdebug >= 2 : print ("absender") + pass + elif (not "Register" in vrfeld): + if logdebug >= 2 : print ("kein Register") + return baum + elif (vrfeld["Register"].find(content["absender"]["REGNAME"])<0): + if logdebug >= 2 : print("verboten ") + return baum + if (not ("tabelle" in vrfeld.keys())): + if logdebug >= 2 : print ("keine tabelle") + return baum + elif (vrfeld["tabelle"][0:1] == "#"): + if logdebug >= 2 : print ("# tabelle") + return baum + xpath = vrfeld["Xpath"] + tabelle = vrfeld["tabelle"] + if logdebug >= 3 : print ("args "+tabelle+" "+xpath) + # pfadkennung ersetzen + if (xpath.find('${')>0): + ersatz = xpath[xpath.find('${')+2:xpath.find('}')] + npath = xpath[0:xpath.find('${')]+content["absender"][ersatz]+xpath[xpath.find('}')+1:] + else: + npath = xpath + if logdebug >= 2 : print ("npath "+npath) + npath = npath.replace('nachricht/', '') + if logdebug >= 2 : print ("npath "+npath) + if (tabelle == "absender"): + baum = fcts.setMerkmal(baum, npath, content["absender"][feld]) + return baum + # Wert ermitteln aus Content + if logdebug >= 3 : print (str(index) +" tabelle "+str(content)) + if (not content["tabelle"][tabelle]["_data"][int(index)-1]): + if logdebug >= 2 : print ("Zeile fehlt") + return baum + if logdebug >= 3 : print (content["tabelle"][tabelle]["_data"][int(index)-1]) + if (not feld in content["tabelle"][tabelle]["_data"][int(index)-1].keys()): + if logdebug >= 2 : print ("Feld fehlt") + return baum + wert = content["tabelle"][tabelle]["_data"][int(index)-1][feld] + baum = fcts.setMerkmal(baum, npath, wert) + #print("ausgabe "+str(baum)) + return baum + + def test(): + print("test in fcts") + +class merkmal: + def __init__(self): + self.merkmale = "loadyaml" \ No newline at end of file