Ulrich Carmesin
2 years ago
60 changed files with 653 additions and 1310 deletions
@ -0,0 +1,5 @@ |
|||
#!/usr/bin/python |
|||
# --------------------------------------------------------------------------------------------------------- |
|||
# Author : Ulrich Carmesin |
|||
# Source : gitea.ucarmesin.de |
|||
# --------------------------------------------------------------------------------------------------------- |
@ -1,757 +0,0 @@ |
|||
#import dpath.util |
|||
import json |
|||
import yaml |
|||
import re |
|||
import datetime |
|||
import utils.tdata_tool |
|||
import os, sys, json |
|||
import xmltodict |
|||
import pprint |
|||
|
|||
#class fcts: |
|||
def dict2xml(tree): |
|||
out = xmltodict.unparse(tree, pretty=True) |
|||
return out |
|||
|
|||
def xml2dict(xmlstring): |
|||
tree = {} |
|||
pp = pprint.PrettyPrinter(indent=4) |
|||
tree = xmlstring.parse(xmlstring) |
|||
return tree |
|||
|
|||
""" |
|||
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"][B.DATA_NODE_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 = utils.tdata_tool.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 isLastGroup(pfad, knoten): |
|||
if (pfad[(pfad.find(knoten)+len(knoten)+4):].find("[@") > 1): |
|||
return False |
|||
return True |
|||
|
|||
def getNodename(knotenname): |
|||
if ("[@" in knotenname): |
|||
return knotenname[0:knotenname.find("[@")] |
|||
return knotenname |
|||
|
|||
def getKeyname(knotenname): |
|||
if ("[@" in knotenname): |
|||
return knotenname[knotenname.find("[@")+1:knotenname.find("=")] |
|||
return knotenname |
|||
|
|||
def setArrayElem(array, elem): |
|||
# sets or appends the element/key-val into the array |
|||
for k in array: |
|||
if (elem in array): |
|||
return array |
|||
array.append(elem) |
|||
|
|||
def getTidyTab(self, depth=0): |
|||
tab = "" |
|||
# print("depth "+str(depth)) |
|||
for i in range(0, depth): |
|||
tab += "\t" |
|||
return tab |
|||
|
|||
def hasTidyAttr(self, tree): |
|||
first = True |
|||
if isinstance(tree, dict): |
|||
for x in tree: |
|||
if first and isinstance(tree[x], dict): |
|||
return self.hasTidyAttr(tree[x]) |
|||
elif first and isinstance(tree[x], list): |
|||
return self.hasTidyAttr(tree[x]) |
|||
elif x[0:1] == "@": |
|||
return True |
|||
else: |
|||
return False |
|||
if isinstance(tree, list): |
|||
for x in tree: |
|||
if first and isinstance(x, dict): |
|||
return self.hasTidyAttr(x) |
|||
elif first and isinstance(x, list): |
|||
return self.hasTidyAttr(x) |
|||
elif x[0:1] == "@": |
|||
return True |
|||
else: |
|||
return False |
|||
elif tree[0:1] == "@": |
|||
return True |
|||
return False |
|||
|
|||
def getTidyAttr(self, tree, x, depth=0): |
|||
xml = "" |
|||
attr = "" |
|||
if isinstance(tree, dict): |
|||
for y in tree: |
|||
if isinstance(y, dict): |
|||
return "" |
|||
elif isinstance(y, list): |
|||
attr = self.getTidyAttr(y, x, depth) |
|||
elif y[0:1] == "@": |
|||
attr += " "+y[1:]+"="+tree[y] |
|||
elif len(attr) > 1: |
|||
xml = "<"+x+attr+">"+y+"</"+x+">" |
|||
return xml |
|||
else: |
|||
return "" |
|||
elif isinstance(tree, dict): |
|||
for y in tree: |
|||
pass |
|||
return "" |
|||
|
|||
def getTidyDict(self, tree, x, depth=0): |
|||
xml = "" |
|||
tab = self.getTidyTab(depth) |
|||
newTree = {} |
|||
attr = "" |
|||
for y in tree: |
|||
if y[0:1] == "@": |
|||
attr = " " + y[1:] + "=\"" + tree[y] + "\"" |
|||
else: |
|||
newTree[y] = tree[y] |
|||
if len(newTree) > 0: |
|||
xml += tab + "<" + x + attr + ">\n" + self.tidy(newTree, depth + 1) + tab + "</" + x + ">\n" |
|||
else: |
|||
xml += tab + "<" + x + attr + "/>\n" |
|||
return xml |
|||
|
|||
def tidy(self, tree, depth=0): |
|||
verify = 0 |
|||
xml = "" |
|||
tab = self.getTidyTab(depth) |
|||
hasa = self.hasTidyAttr(tree) |
|||
if verify: print("getTidy "+str(type(tree))+" hasAttr "+str(hasa)) |
|||
if isinstance(tree, dict): |
|||
for x in tree: |
|||
if verify: print("dict " + str(x)) |
|||
if isinstance(tree[x], dict): |
|||
hasa = self.hasTidyAttr(tree[x]) |
|||
newTree = {} |
|||
attr = "" |
|||
for y in tree[x]: |
|||
if verify: print("y-for "+str(y)) |
|||
if y[0:1] == "@": |
|||
attr = " " + y[1:] + "=\"" + tree[x][y] + "\"" |
|||
else: |
|||
newTree[y] = tree[x][y] |
|||
if len(newTree) > 0: |
|||
xml += tab + "<" + x + attr + ">\n" + self.tidy(newTree, depth + 1) + tab + "</" + x + ">\n" |
|||
else: |
|||
xml += tab + "<" + x + attr + "/>\n" |
|||
elif isinstance(tree[x], list): |
|||
hasa = self.hasTidyAttr(tree[x]) |
|||
if hasa: |
|||
xml += tab + "<" + x + self.tidy(tree[x], depth) + "</" + x + ">\n" |
|||
else: |
|||
xml += tab + "<" + x + ">\n" + self.tidy(tree[x], depth + 1) + tab + "</" + x + ">\n" |
|||
elif x[0:1] == "@": |
|||
attr = " " + x[1:] + "=\"" + tree[x] + "\"" |
|||
elif x == "#text": |
|||
xml = str(tree[x]) |
|||
return xml |
|||
else: |
|||
xml += tab + "<" + x + ">" + str(tree[x]) + "</" + x + ">\n" |
|||
elif isinstance(tree, list): |
|||
for x in tree: |
|||
if verify: print("list " + str(x)) |
|||
if isinstance(x, dict): |
|||
newTree = {} |
|||
attr = "" |
|||
text = False |
|||
hasa = self.hasTidyAttr(x) |
|||
for y in x: |
|||
if verify: print("y-for "+str(y)) |
|||
if y[0:1] == "@": |
|||
attr = " " + y[1:] + "=\"" + x[y] + "\"" |
|||
elif y == "#text": |
|||
text = x[y] |
|||
else: |
|||
newTree[y] = x[y] |
|||
if text and len(newTree) > 0 and len(attr) > 0: |
|||
xml += "" + attr + ">" + self.tidy(newTree, depth + 1) |
|||
elif len(newTree) > 0 and len(attr) > 0: |
|||
xml += "" + attr + ">\n" + self.tidy(newTree, depth + 1) + tab |
|||
elif len(attr) > 0: |
|||
if not isinstance(x, dict): |
|||
xml += tab + "<296" + x + attr + "/>\n" |
|||
else: |
|||
xml += attr + ">"+text |
|||
else: |
|||
xml += self.tidy(newTree, depth) |
|||
else: |
|||
xml += tab + "<" + x + ">\n" + self.tidy(x, depth) + tab + "</" + x + ">" |
|||
else: |
|||
xml += "<" + str(tree) + ">" |
|||
return xml |
|||
|
|||
|
|||
def addMerkmal(baum, pfad, index, wert): |
|||
""" |
|||
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 "+str(index)+" "+pfad+" "+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 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 |
|||
# |
|||
# # # Fall a : Array |
|||
if (basis in fcts.ARRAY_NODE): |
|||
# Weiter zu betrachten |
|||
# .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 |
|||
# ...a zusaetzliches Blatt |
|||
# ...b ueberschriebenes Blatt OPEN |
|||
# ..b: im Pfad - weiterer rekursiver Aufruf |
|||
# ...a expandierter Pfad |
|||
# ...b fortgefuehrter Pfad |
|||
existKnoten = "N" |
|||
hatAttr = "N" |
|||
istWert = "N" |
|||
hatWert = "N" |
|||
expand = "N" |
|||
lastidx = 0 |
|||
if logdebug >= 1: print("a: ARRAY "+a[index-1]+"-"+basis+" "+str(baum)) |
|||
if (basis in baum): |
|||
# ggf. zu bearbeitendes ELEM erzeugen |
|||
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 "+str(baum[basis])) |
|||
#if baum[basis] |
|||
existKnoten = "J" |
|||
elem[basis] = baum[basis] |
|||
else: |
|||
print ("203 neues array") |
|||
elem[basis] = [] |
|||
elem[basis].append({}) |
|||
existKnoten = "N" |
|||
xnode = {} |
|||
if (anode): |
|||
hatAttr = "J" |
|||
xnode = {} # Komplexitaetsfaelle in xnode setzen |
|||
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) |
|||
xnode = anode |
|||
if (bnode): # a-b-a |
|||
istWert = "J" |
|||
if logdebug >= 3: print("existKnoten "+existKnoten+" hatAttr "+hatAttr+" istWert "+istWert+" hatWert "+ hatWert+" expand "+expand+" lastidx "+str(lastidx)) |
|||
if logdebug >= 3: print("-->a-b-a-b> kompl. Blatt "+basis+" "+str(bnode)) |
|||
#-elem[basis].append(bnode) |
|||
elem[basis][0][aarr[0]] = aarr[1] |
|||
elem[basis][0][barr[0]] = barr[1] |
|||
baum[basis] = elem[basis] |
|||
if logdebug >= 3: print("<--a-b-a-b< kompl. Blatt "+basis+" "+str(elem)) |
|||
return baum |
|||
# weitere Fallunterscheidung: unterster Komplexknoten erweitern, vorherige durchlaufen |
|||
subnode = fcts.getNodename(a[nindex]) |
|||
parentkey = fcts.getKeyname(a[index-1]) |
|||
realnode = subnode |
|||
aridx = -1 |
|||
if (basis in elem): |
|||
for x in elem[basis]: |
|||
print("x: "+str(x)+" "+str(len(x.keys()))) |
|||
if len(x.keys()) > 0: |
|||
print ("x ist") |
|||
aridx += 1 |
|||
# aridx -= 1 |
|||
lastidx = aridx |
|||
print ("## Faluntersuchung parentkey "+parentkey+" aridx "+str(aridx)+" subnode "+subnode) |
|||
if ((aridx < 0)): # a-b-b-a |
|||
elem[basis][0][realnode] = {} |
|||
elem[basis][0][realnode][aarr[0]] = aarr[1] |
|||
if logdebug >= 3: print("existKnoten "+existKnoten+" hatAttr "+hatAttr+" istWert "+istWert+" hatWert "+ hatWert+" expand "+expand+" lastidx "+str(lastidx)) |
|||
if logdebug >= 3: print("-->a-b-b-a> kompl. Pfad init " +basis+" "+parentkey+" " + realnode + " " + wert +" "+str(nindex)+" "+str(baum)) |
|||
insnode = fcts.addMerkmal(elem[basis][0][realnode], pfad, nindex, wert) |
|||
if logdebug >= 3: print("<--a-b-b-a< kompl. Pfad init " + basis+" "+str(insnode)+"-set-0-"+str(elem[basis][0])) |
|||
elem[basis][0] = insnode |
|||
baum[basis] = elem[basis] |
|||
return baum ## |
|||
if fcts.isLastGroup(pfad, basis): # a-b-b-a expandierter Pfad |
|||
subnode = fcts.getNodename(a[nindex]) |
|||
if logdebug >= 3: print("existKnoten "+existKnoten+" hatAttr "+hatAttr+" istWert "+istWert+" hatWert "+ hatWert+" expand "+expand+" lastidx "+str(lastidx)) |
|||
if logdebug >= 3: print("-->a-b-b-a> kompl. Pfaderw "+subnode+" "+str(nindex)+" "+str(anode)+" "+str(baum)) |
|||
insnode = fcts.addMerkmal(anode, pfad, nindex, wert) |
|||
if logdebug >= 3: print("<--a-b-b-a< kompl. Pfaderw. " + basis + " "+str(insnode)+"-ins-"+str(elem[basis][0])) |
|||
elem[basis].append(insnode) |
|||
baum[basis] = elem[basis] |
|||
return baum |
|||
else: |
|||
# hier soll in dem Knoten weiternavigiert werden |
|||
# satz[@klasse="1"]/mm[@name="2"]... |
|||
# basis = satz, subnode = mm |
|||
# baum = {satz: [{ @klasse : 1, mm : [{ @name : 0, .. |
|||
subnode = fcts.getNodename(a[nindex]) |
|||
realnode = subnode |
|||
if "[@" in subnode: |
|||
realnode = a[nindex+1] |
|||
if logdebug >= 3: |
|||
print (basis) |
|||
print (elem) |
|||
print (baum) |
|||
aridx = 0 |
|||
if (basis in baum): |
|||
aridx = len(baum[basis])-1 |
|||
#if (aridx >= 0) and (): |
|||
# elem[basis] = [] |
|||
# elem[basis].append(anode) |
|||
# .b Knoten mit Attribut als Blatt (anode+bnode) oder mit Unterknoten (nur anode) |
|||
# Weiter zu betrachten hinsichtlich Pfadposition |
|||
# ..a: Blatt - Wert eintragen und #-DONE-# |
|||
# ...a zusaetzliches Blatt #-OPEN-# |
|||
# ...b ueberschriebenes Blatt #-DONE-# |
|||
# ..b: im Pfad - weiterer rekursiver Aufruf |
|||
# ...a initialer Pfadposition #-DONE-# |
|||
# ...b expandierter Pfad |
|||
# ...c fortgefuehrter Pfad |
|||
if (aridx > 0 and logdebug >= 3): |
|||
print (basis+" ++ "+str(aridx)+" "+subnode) |
|||
print(str(baum[basis])) |
|||
print(str(baum[basis][aridx])) |
|||
if ((aridx > 0) and (realnode in baum[basis][aridx].keys())): |
|||
elem[basis] = [] |
|||
#elem[basis].append(elem[basis][aridx][realnode]) |
|||
if logdebug >= 3: print("existKnoten "+existKnoten+" hatAttr "+hatAttr+" istWert "+istWert+" hatWert "+ hatWert+" expand "+expand+" lastidx "+str(lastidx)) |
|||
if logdebug >= 3: print("-->a-b-b-c> kompl. Pfad " +basis+" "+ realnode + " " + wert + " " + str(nindex) + " " + str(aridx)+" "+str(baum)) |
|||
insnode = fcts.addMerkmal(elem[basis][aridx], pfad, nindex, wert)[realnode] |
|||
if logdebug >= 3: print("<--a-b-b-c< kompl. Pfad " + basis+" "+str(insnode)+"-set-"+str(elem[basis][aridx][realnode])) |
|||
elem[basis][aridx][realnode] = insnode |
|||
else: |
|||
#elem[basis] = [] |
|||
#elem[basis].append(anode) |
|||
if logdebug >= 3: print("existKnoten "+existKnoten+" hatAttr "+hatAttr+" istWert "+istWert+" hatWert "+ hatWert+" expand "+expand+" lastidx "+str(lastidx)) |
|||
if logdebug >= 3: print("-->a-b-b-b> kompl. Pfad " +basis+" "+ realnode + " " + wert + " " + str(nindex) + " " + str(aridx)+" "+str(baum)) |
|||
insnode = fcts.addMerkmal(elem[basis][lastidx], pfad, nindex, wert) |
|||
if logdebug >= 3: print("<--a-b-b-b< kompl. Pfad " + basis+" "+str(insnode)+"-set-"+str(elem[basis][aridx])) |
|||
#elem[basis].append(insnode) |
|||
pass |
|||
baum[basis] = elem[basis] |
|||
return baum |
|||
# unerreichbar, da schon im else returned |
|||
#if logdebug >= 3: |
|||
# print("-->a-b-b> kompl. Pfad "+basis+" "+str(nindex)) |
|||
# print("-->a-b-b> kompl. Pfad "+realnode+" "+str(nindex)+" "+str(baum)) |
|||
# print("-->a-b-b> kompl. Pfad "+realnode+" "+str(nindex)+" "+str(elem)) |
|||
#if not subnode in elem[basis][0]: |
|||
# elem[basis][0][realnode] = {} |
|||
# elem[basis][0][realnode][aarr[0]] = aarr[1] |
|||
# elem[basis][0] = fcts.addMerkmal(elem[basis][0][realnode], pfad, nindex, wert) |
|||
#elif (len(elem[basis]) > 0): |
|||
# elem[basis].append(fcts.addMerkmal(xnode, pfad, nindex, wert)) |
|||
#+elem[basis].append(fcts.addMerkmal(xnode, pfad, nindex, wert)) |
|||
#if logdebug >= 3: |
|||
# print (basis) |
|||
# print(baum) |
|||
# print(elem) |
|||
# print("<--a-b-b< kompl. Pfad "+basis+""+str(baum)) |
|||
#baum[basis] = elem[basis] |
|||
#return baum ## |
|||
else: |
|||
if logdebug >= 3: print("-->a-a-b> einf. Pfad "+str(nindex)+" "+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][B.DATA_NODE_DATA][int(index)-1]): |
|||
if logdebug >= 2 : print ("Zeile fehlt") |
|||
return baum |
|||
if logdebug >= 3 : print (content["tabelle"][tabelle][B.DATA_NODE_DATA][int(index)-1]) |
|||
if (not feld in content["tabelle"][tabelle][B.DATA_NODE_DATA][int(index)-1].keys()): |
|||
if logdebug >= 2 : print ("Feld fehlt") |
|||
return baum |
|||
wert = content["tabelle"][tabelle][B.DATA_NODE_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" |
Loading…
Reference in new issue