держи, написал все в лоб. можно ещё упростить. но пока лень
# 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())