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 SpecifyParcel(): def chec_koordinat(new_parcel): if 'EntitySpatial' in new_parcel: if 'SpatialElement' in new_parcel['EntitySpatial']: return "да" else: return "нет" else: return "нет" def chec_tag_ProvidingPassCadastralNumbers(ProvidingPassCadastralNumbers): if 'ProvidingPassCadastralNumbers' in ProvidingPassCadastralNumbers['ExistParcel'][0]: return ProvidingPassCadastralNumbers['ExistParcel'][0]['ProvidingPassCadastralNumbers'][0]['Other'][0]['#text'] else: return "" def chec_tag_Explanation(Explanation): if 'Explanation' in Explanation['ExistParcel'][0]: return Explanation['ExistParcel'][0]['Explanation'][0]['#text'] else: return "" def __init__(self): 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(ProvidingPassCadastralNumbers=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]['EntitySpatial'][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) pass