84 lines
3.4 KiB
Python
84 lines
3.4 KiB
Python
import os
|
||
import xml.etree.ElementTree as ET
|
||
import pandas as pd
|
||
from pathlib import Path
|
||
|
||
# === 🔧 НАСТРОЙКИ (меняйте под себя) ===
|
||
FOLDER_WITH_XMLS = r"C:\Users\jze9\Documents\work\git\kadastr12\test" # Папка с XML-файлами
|
||
OUTPUT_XLSX_FILE = r"C:\Users\jze9\Documents\work\git\kadastr12\result.xlsx" # Куда сохранить результат
|
||
|
||
# === ⛏ ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===
|
||
def extract_text(elem, tag):
|
||
node = elem.find(f".//{tag}")
|
||
return node.text.strip() if node is not None and node.text else ""
|
||
|
||
def has_spatial(elem):
|
||
return elem.find(".//SpatialElement") is not None
|
||
|
||
def collect_explanations(elem):
|
||
return " ".join(e.text.strip() for e in elem.findall(".//Explanation") if e.text and e.text.strip())
|
||
|
||
def process_section(tree, tag, label, records, is_zemel=True):
|
||
section = tree.find(f".//{tag}")
|
||
if section is None:
|
||
return
|
||
subtag = next(iter(section), None)
|
||
if subtag is None:
|
||
return
|
||
for item in section.findall(f".//{subtag.tag}"):
|
||
rec = {
|
||
"Раздел КПТР": label,
|
||
"Кадастровый номер": extract_text(item, "CadastralNumber"),
|
||
"Кадастровый квартал": extract_text(item, "CadastralBlock"),
|
||
"Вид объекта": extract_text(item, "ObjectType"),
|
||
"Площадь ЗУ": extract_text(item.find("Area") or item, "Area") if is_zemel else "",
|
||
"Погрешность определения площади": extract_text(item.find("Area") or item, "Inaccuracy") if is_zemel else "",
|
||
"наличие координат": "да" if has_spatial(item) else "нет",
|
||
"Пояснения": collect_explanations(item),
|
||
}
|
||
records.append(rec)
|
||
|
||
# === 🚀 ОСНОВНОЙ КОД ===
|
||
def main():
|
||
records = []
|
||
for file in os.listdir(FOLDER_WITH_XMLS):
|
||
if not file.lower().endswith(".xml"):
|
||
continue
|
||
xml_path = os.path.join(FOLDER_WITH_XMLS, file)
|
||
try:
|
||
tree = ET.parse(xml_path)
|
||
except ET.ParseError as e:
|
||
print(f"❌ Ошибка в файле {file}: {e}")
|
||
continue
|
||
|
||
root = tree.getroot()
|
||
process_section(root, "FormParcels", "Образование ЗУ", records)
|
||
process_section(root, "SpecifyParcels", "Уточнение ЗУ", records)
|
||
process_section(root, "CadastralErrorsParcels", "Исправление ЗУ", records)
|
||
process_section(root, "ExistNewObjectsRealty", "Уточнение ОКС", records, is_zemel=False)
|
||
process_section(root, "CadastralErrorsOKS", "Исправление ОКС", records, is_zemel=False)
|
||
|
||
if not records:
|
||
print("⚠️ Нет данных для экспорта.")
|
||
return
|
||
|
||
for i, rec in enumerate(records, 1):
|
||
rec["№ п/п"] = i
|
||
|
||
df = pd.DataFrame(records, columns=[
|
||
"№ п/п",
|
||
"Раздел КПТР",
|
||
"Кадастровый номер",
|
||
"Кадастровый квартал",
|
||
"Вид объекта",
|
||
"Площадь ЗУ",
|
||
"Погрешность определения площади",
|
||
"наличие координат",
|
||
"Пояснения",
|
||
])
|
||
df.to_excel(OUTPUT_XLSX_FILE, index=False)
|
||
print(f"✔️ Файл успешно сохранён: {OUTPUT_XLSX_FILE}")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|