from lxml import etree data=[] class Data_farame(): def __init__(self,section_KPTR,cadastral_number,cadastral_quarter,object_type,land_plot_area,error_in_determining_area,availability_coordinates,explanations): self.section_KPTR = section_KPTR #Раздел КПТР self.cadastral_number = cadastral_number #Кадастровый номер self.cadastral_quarter = cadastral_quarter #Кадастровый квартал self.object_type = object_type #Вид объекта self.land_plot_area = land_plot_area #Площадь ЗУ self.error_in_determining_area = error_in_determining_area #Погрешность определения площади self.availability_coordinates = availability_coordinates #наличие координат self.explanations = explanations #Пояснения class CadastralErrorsParcels(): def chec_koordinat(self,CadastralErrorParcel): if 'EntitySpatial' in CadastralErrorParcel: if 'SpatialElement' in CadastralErrorParcel['EntitySpatial'][0]: return "да" else: return "нет" else: return "нет" def __init__(self, xml_dict): try: for item in xml_dict['Package'][0]['CadastralErrorsParcels'][0]['CadastralErrorParcel']: data.append( Data_farame( section_KPTR="Исправление ЗУ", cadastral_number=item['CadastralErrorExistParcel'][0]['@attributes']["CadastralNumber"], cadastral_quarter=item['CadastralErrorExistParcel'][0]['CadastralBlock'][0]['#text'], object_type="", land_plot_area=item['CadastralErrorExistParcel'][0]['Area'][0]['Area'][0]['#text'], error_in_determining_area=item['CadastralErrorExistParcel'][0]['Area'][0]['Inaccuracy'][0]['#text'], availability_coordinates=self.chec_koordinat(item['CadastralErrorExistParcel'][0]), explanations="" ) ) except: return class SpecifyParcel(): def chec_koordinat(self,new_parcel): if 'EntitySpatial' in new_parcel: if 'SpatialElement' in new_parcel['EntitySpatial'][0]: return "да" return "нет" return "нет" def chec_tag_ProvidingPassCadastralNumbers(self,PPCN): if 'ProvidingPassCadastralNumbers' in PPCN['ExistParcel'][0]: return PPCN['ExistParcel'][0]['ProvidingPassCadastralNumbers'][0]['Other'][0]['#text'] else: return "" def chec_tag_Explanation(self,Explanation): if 'Explanation' in Explanation['ExistParcel'][0]: return Explanation['ExistParcel'][0]['Explanation'][0]['#text'] else: return "" def __init__(self, xml_dict): try: for i,item in enumerate(xml_dict['Package'][0]['SpecifyParcels'][0]['SpecifyParcel']): data.append( Data_farame( section_KPTR="Уточнение ЗУ", cadastral_number=item['ExistParcel'][0]['@attributes']["CadastralNumber"], cadastral_quarter=item['ExistParcel'][0]['CadastralBlock'][0]['#text'], object_type=self.chec_tag_ProvidingPassCadastralNumbers(PPCN=item), land_plot_area=item['ExistParcel'][0]['Area'][0]['Area'][0]['#text'], error_in_determining_area=item['ExistParcel'][0]['Area'][0]['Inaccuracy'][0]['#text'], availability_coordinates=self.chec_koordinat(item['ExistParcel'][0]), explanations=self.chec_tag_Explanation(Explanation=item) ) ) except: return class NewParcel: def add_new_data(self,doc_category): data="" for item in doc_category: data += f"{item}: {doc_category[item][0]['#text']}, " return data def chec_koordinat(self,new_parcel): if 'EntitySpatial' in new_parcel: if 'SpatialElement' in new_parcel['EntitySpatial'][0]: return "да" else: return "нет" else: return "нет" def get_cad_number(self,object_realty): cad_nimbers = "" for item in object_realty: cad_nimbers+=f"{item['InnerCadastralNumbers'][0]['CadastralNumber'][0]['#text']}, " return cad_nimbers def __init__(self,xml_dict): try: for new_parcel in xml_dict['Package'][0]['FormParcels'][0]['NewParcel']: data.append( Data_farame( section_KPTR="Образование ЗУ", cadastral_number=self.get_cad_number(new_parcel['ObjectsRealty'][0]['ObjectRealty']), cadastral_quarter=new_parcel['CadastralBlock'][0]['#text'], object_type="", land_plot_area=new_parcel['Area'][0]['Area'][0]['#text'], error_in_determining_area=new_parcel['Area'][0]['Inaccuracy'][0]['#text'], availability_coordinates=self.chec_koordinat(new_parcel), explanations=self.add_new_data(new_parcel['Category'][0]['DocCategory'][0]) ) ) except: return def lxml_to_dict(element): result = {} # Обрабатываем атрибуты (если есть) if element.attrib: result["@attributes"] = element.attrib # Обрабатываем текстовое содержимое (если есть) if element.text and element.text.strip(): result["#text"] = element.text.strip() # Группируем все дочерние элементы в списки children_by_tag = {} for child in element: child_tag = child.tag if child_tag not in children_by_tag: children_by_tag[child_tag] = [] children_by_tag[child_tag].append(lxml_to_dict(child)) # Добавляем в результат (всегда списками) for tag, children in children_by_tag.items(): result[tag] = children # Всегда массив, даже если элемент один return result #tree = etree.parse('C:/Users/USER/Downloads/12. ХМЛ КПТР в ексель/Исходные данные/Карта-план в хмл прмиер Копейск на кк 74 30 0104002/MapPlanTerritory_54F3719F-2ED8-48FF-8442-9813191EBA51.xml') tree = etree.parse('C:/Users/USER/Downloads/12. ХМЛ КПТР в ексель/Исходные данные/Карта-план в хмл прмиер Копейск на кк 74 30 0104002/MapPlanTerritory_E2DF5B75-E136-48DA-BB4C-8887BA4ABF46.xml') xml_dict = lxml_to_dict(tree.getroot()) temp = NewParcel(xml_dict) temp = SpecifyParcel(xml_dict) temp = CadastralErrorsParcels(xml_dict) def get_cad_block(cad_block): temp = "" for item in cad_block: temp += f"{item['#text']}, " return temp def get_object_type(type:str): if type == "002001002000": return "Здание" if type == "002001004000": return "Сооружение" if type == "002001005000": return "Объект" for item in xml_dict['Package'][0]['ExistNewObjectsRealty'][0]['ExistNewObjectRealty']: data.append( Data_farame( section_KPTR="Уточнение ОКС", cadastral_number=item['CadastralNumber'][0]['#text'], cadastral_quarter=get_cad_block(item['CadastralBlocks'][0]['CadastralBlock']), object_type=get_object_type(item['ObjectType'][0]['#text']), land_plot_area="нет", error_in_determining_area="нет", availability_coordinates=self.chec_koordinat(new_parcel), explanations=self.add_new_data(new_parcel['Category'][0]['DocCategory'][0]) ) ) pass