Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Nowy walidator plików xml
25-09-2025, 09:13,
#1
Nowy walidator plików xml
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!


Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Problem z otwieraniem plików xml WODGiK PPGR 0 690 30-01-2025, 21:59
Ostatni post: PPGR
  problemy z parsowaniem xml z zipa Karoluss96 0 781 09-07-2024, 10:24
Ostatni post: Karoluss96
  Automatyzacja atrybutów nowy obiektów geodeta 6 4 391 06-03-2023, 12:46
Ostatni post: xmaziax
  Ładowanie XML w treeView (Qt) Karoluss96 2 2 942 21-06-2022, 12:25
Ostatni post: Karoluss96
  BDOO XML kapiszon85 6 10 418 10-06-2020, 08:30
Ostatni post: tm261700
  CODGiK Punkty adresowe zmniejszenie pliku XML Loozak 5 20 552 13-10-2016, 13:09
Ostatni post: pelekPL
  zapisywanie się plików projektu w typie plików innym niż dbf mak 3 20 893 28-07-2011, 11:54
Ostatni post: mak
  konwersja SVG+XML na SHP Kristoforos 1 18 251 08-12-2009, 16:56
Ostatni post: borys

Skocz do: