from lxml import etree import re xml_path = "C:/temp-GIS/2026-04-08_export_new2.xml" xsd_path = 'C:/temp-GIS/_isy/2017/1_XML-Schema/1707-metadaten.xsd' try: with open(dateipfad, 'r', encoding='utf-8') as f: zeilen = f.readlines() except FileNotFoundError: return "Datei nicht gefunden." def finde_letzte_bezeichnung(zeilen, ziel_zeile): """ Sucht rückwärts ab ziel_zeile nach dem Tag . """ # Überprüfung der Zeilennummer if ziel_zeile > len(zeilen): return "Fehler: Zeilennummer existiert nicht." # Suche rückwärts von der Zielzeile (Index = Zeile - 1) for i in range(ziel_zeile - 1, -1, -1): aktuelle_zeile = zeilen[i] # Regex sucht nach dem Inhalt zwischen den Tags treffer = re.search(r'(.*?)', aktuelle_zeile) if treffer: return treffer.group(1).strip() # Falls der Tag über mehrere Zeilen geht oder nur der Start-Tag da ist if '' in aktuelle_zeile: # Extrahiere Text nach dem Start-Tag in dieser Zeile text = aktuelle_zeile.split('')[-1].strip() return text if text else "Tag gefunden, Inhalt leer oder mehrzeilig." return "Keine oberhalb dieser Zeile gefunden." # XML-Datei laden with open("C:/temp-GIS/2026-04-08_export_new2.xml", "rb") as xml_file: xml_doc = etree.parse(xml_file) # XSD-Datei laden with open('C:/temp-GIS/_isy/2017/1_XML-Schema/1707-metadaten.xsd', "rb") as xsd_file: xsd_doc = etree.parse(xsd_file) # Schema erstellen xmlschema = etree.XMLSchema(xsd_doc) # Validieren if xmlschema.validate(xml_doc): print("XML ist gültig ✅") else: print("XML ist NICHT gültig ❌") with open("C:/temp-GIS/fehler.log", "w", encoding="utf-8") as log_file: count = 0 for error in xmlschema.error_log: log_file.write(f"Zeile: {error.line}, Spalte: {error.column}; ") ergebnis = finde_letzte_bezeichnung(zeilen, error.line) log_file.write(f"{ergebnis};Fehler: {error.message}\n") count = count + 1 print("Anzahl Fehler: ", count)