Найти - Пользователи
Полная версия: Помогите пожалуйста справиться с заданием. Parser xml
Начало » Центр помощи » Помогите пожалуйста справиться с заданием. Parser xml
1
protect13
9+ в функциях для тэгов добавить разбор аттрибутов:
+ - у карты должен быть параметр внешняя (true, false)
+ - у слоя параметры - уид (строка)
+ - диапазон масштабов - кортеж из двух флоатов
+ - у подслоя параметры - уид (строка)
+ - тип (scale, polyline, polygone)
+ - диапазон масштабов - кортеж из двух флоатов
+ - у шейпа параметры - уид (строка)
+ - масштаб (флоат)
+ - угол поворота (флоат)
+ - координата x - флоат
+ - координата y - флоат
+ - у контура индекс, набор пар координат (x, y)

+10. При вызове каждой функции, ты должен знать, в какой тег вложен тот тег, который ты сейчас читаешь.
+11. Реализовать вывод на печать всего вышеперечисленного.

xml и .py в архиве
ilnur
держи, написал все в лоб. можно ещё упростить. но пока лень

# 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())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB