188 lines
8.2 KiB
Python
188 lines
8.2 KiB
Python
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
|
||
|