Форум сайта python.su
9+ в функциях для тэгов добавить разбор аттрибутов:
+ - у карты должен быть параметр внешняя (true, false)
+ - у слоя параметры - уид (строка)
+ - диапазон масштабов - кортеж из двух флоатов
+ - у подслоя параметры - уид (строка)
+ - тип (scale, polyline, polygone)
+ - диапазон масштабов - кортеж из двух флоатов
+ - у шейпа параметры - уид (строка)
+ - масштаб (флоат)
+ - угол поворота (флоат)
+ - координата x - флоат
+ - координата y - флоат
+ - у контура индекс, набор пар координат (x, y)
+10. При вызове каждой функции, ты должен знать, в какой тег вложен тот тег, который ты сейчас читаешь.
+11. Реализовать вывод на печать всего вышеперечисленного.
xml и .py в архиве
Прикреплённый файлы: parser.py.zip (3,2 KБ)
Офлайн
держи, написал все в лоб. можно ещё упростить. но пока лень
# coding: utf-8 # импортируем ElementTree import xml.etree.ElementTree as xmlparser # создаем переменную source передаем в неё "extMap.xml" source = 'extMap.xml'; #читаем extMap,xml с помощью созданной функции def xml_reader(source): try: doc = xmlparser.parse(source); # исключение если файл не найден except FileNotFoundError: print('File not found at: ' + source) exit(0) return doc # добовляем отступы #def padding(length): return ('. ' * (length -1)) + '|---' # пробуем произвести вывод дерева вместе с атрибутами. def print_xml_tags(doc,level = 0): # если level == 0 ,то выводим тэги атрибуты if level == 0: print (doc.tag,doc.attrib) # либо else: print(level*"|-"+doc.tag,doc.attrib) for node in doc: print_xml_tags(node, level + 1) #для каждого типа тегов создать отдельную функцию, которая будет выводить текстовое сообщение вида #"Карта (Слой, Подслой и т.тд.)" def map_callback(el): print("Карта"), isExternal = el.attrib.get('isExternal') if isExternal is None: print("Отсутсвует атрибут внешнйй") elif isExternal: print("Внешний") else: print("Внутренни") def layer_callback(el): print("Слой"), uid = el.attrib.get('uid') if uid: print("uid={}".format(uid)), else: print(""), scaleRange = el.attrib.get('scaleRange') if scaleRange: print("scaleRange={}".format(scaleRange)) else: print("") def sublayer_callback(el): print("Подслой"), uid = el.attrib.get('uid') if uid: print("uid={}".format(uid)), else: print(""), type_ = el.attrib.get('type') if type_: print("type={}".format(type_)), else: print(""), scaleRange = el.attrib.get('scaleRange') if scaleRange: print("scaleRange={}".format(scaleRange)) else: print("") def item_callback(el): print("Единица"), uid = el.attrib.get('uid') if uid: print("index={}".format(uid)), else: print(""), scale = el.attrib.get('scale') if scale: print("scale={}".format(scale)), else: print(""), rotation = el.attrib.get('rotation') if rotation: print("rotation={}".format(rotation)), else: print(""), x = el.attrib.get('x') if x: print("x={}".format(x)), else: print(""), y = el.attrib.get('y') if y: print("y={}".format(y)) else: print("") def contour_callback(el): print("Контур"), index = el.attrib.get('index') if index: print("index={}".format(index)), else: print(""), spatial = el.attrib.get('spatial') if spatial: print("spatial={}".format(spatial)) else: print("") def callback_handler(el): if el.tag == 'map': map_callback(el) elif el.tag == 'layer': layer_callback(el) elif el.tag == 'subLayer': sublayer_callback(el) elif el.tag == 'item': item_callback(el) elif el.tag == 'contour': contour_callback(el) #------------------------------------------- #Добавить функцию, аналогичную print_xml_tags(doc, level), которая, в соответствии с типом тега, #будет вызывать одну из функций def print_xml_tags(doc,level = 0): callback_handler(doc) for node in doc: print_xml_tags(node) doc = xml_reader(source) print_xml_tags(doc.getroot())
Отредактировано ilnur (Март 31, 2014 16:36:48)
Офлайн