Dzień dobry,
Czy ktoś używał i korzystał kiedyś z walidacji przez .iterparse?
Potrzebuje przebudować wtyczkę tak, aby możliwe było walidowanie plików powyżej 2GB
W tym celu konieczna jest zmiana parsera- w miejscu lxml.etree.parse stosuję etree.iterparse
ale... w raporcie końcowym błędnie wychodzą dane.
W miejscu (kolumnami Excel z wartościami)
WALIDOWANY PLIK:C:\Users....\PL.PZGiK.341.2805__OT_BUBD_A.xml
GMLID: PL.PZGiK.6525.BDOT_B81C7CD2-4986-4AFA-85EC-ED4027882177_2022-08-03T14-06-08
WIERSZ: 775613
OPIS BŁĘDU: Zawartość elementu jest niezgodna ze schematem aplikacyjnym. Błąd może być spowodowany m.in. niepoprawną przestrzenią nazw.
KOMUNIKAT BŁĘDU: Element 'zrodloDanychGeometrycznych': Ten element jest nieoczekiwany. Oczekiwany jest ( wersja ).
wychodzi tak:
WALIDOWANY PLIK: C:\Users....\PL.PZGiK.341.2805__OT_BUBD_A.xml
GMLID: Nie pozyskano gmlid
WIERSZ: -
OPIS BŁĘDU: -
KOMUNIKAT BŁĘDU: Walidacja nie powiodła się (szczegóły niedostępne)
Czy to jest wina samego Interparsera?
Stary kod wyglądał tak:
Kod:
plikGML = pliki[int(taks.description()]]
try:
walidowanyPlik = lxml.etree.parse(plikGML)
unique_gmlid = set()
plikiZparsowane.append(plikGML)
if walidowanyPlik.getroot() != None:
error_gmlid_dic = {}
for element in list(walidowanyPlik.iter()):
if str(element.tag).endswith('featureMember'):
wynikWalidacji = xmlschema.validate(element)
if not wynikWalidacji:
walidacjaZWynikiemPozytywnym = False
for subelement in element:
error_gmlid_dic[xmlschema.error_log] = subelement.attrib['{http://www.opengis.net/gml/3.2}id']
except Exception as e:
QMessageBox.critical(self.iface.mainWindow(), "Błąd walidacji", f"Walidacja przerwana:\n{e}")
return
return {'taskID':task.description(), 'plikGML':plikGML, 'error':error_gmlid_dic}
#później to return jest przekazywane dalej i wpisywane do raportu .xsl
Zaś nowa wersja, która doprowadziła do takiego stanu raportu następująco:
Kod:
plikGML = pliki[int(task.description())]
try:
plikiZparsowane.append(plikGML)
error_gmlid_dic = {}
plikDoWalidacji = str(plikGML)
ns_gml_id = '{http://www.opengis.net/gml/3.2}id'
counter = 0
#try: chwilowo wyłączyłem
with open(plikGML, 'rb', buffering=1024*1024) as f:
ctx = etree.iterparse(f, events=('end',), tag='{http://www.opengis.net/gml/3.2}featureMember', huge_tree=True)
for event, element in ctx:
gml_id = "BRAK_ID"
try:
first_child = next(iter(element), None)
if first_child is not None:
gml_id = first_child.attrib.get(ns_gml_id, 'BRAK_ID')
except Exception:
pass
# --- 2) walidacja + delta logu
before = len(xmlschema.error_log)
try:
ok = xmlschema.validate(element)
except Exception as e:
ok = False
error_gmlid_dic[e] = gml_id
if not ok:
walidacjaZWynikiemPozytywnym = False
new_items = list(xmlschema.error_log)[before:]
if new_items:
error_gmlid_dic[tuple(new_items)] = gml_id
else:
error_gmlid_dic[OSError("Walidacja nie powiodła się (szczegóły niedostępne)")] = gml_id
# except Exception as e:
# QMessageBox.critical(self.iface.mainWindow(), "Błąd walidacji", f"Walidacja przerwana:\n{e}")
# return
return {'taskID':task.description(), 'plikGML':plikGML, 'error':error_gmlid_dic}
Z góry dziękuje za każdą pomoc!