XML-прогулка в питоне

Я новичок в python и хотел бы понять синтаксический анализ xml. Мне не удалось найти каких-либо замечательных примеров или объяснений того, как создать общую программу для обхода набора узлов XML.

Я хочу иметь возможность классифицировать и идентифицировать все элементы и атрибуты по имени и значению, не имея никакой информации о схеме xml. Я не хочу полагаться на вызов элементов и атрибутов конкретно по имени тега или тексту.

Может ли кто-нибудь указать мне правильное направление?

Спасибо

ОБНОВИТЬ:

Конкретный вопрос, который задавали, звучал так: «Как мне вообще выполнить рекурсию всех узлов из корневого узла в XML-документе, не обладая какими-либо глубокими знаниями о схеме».

В то время, будучи новичком в python и понимая, как выполнять эту операцию на многих других языках, я был озадачен любыми примерами из реального мира, которые не полагались на именованные узлы для обхода DOM, а это совсем не то, что я хотел. .

Надеюсь, это прояснит вопрос, так как информация в этой теме действительно полезна.


person Baywatch    schedule 20.11.2012    source источник


Ответы (2)


Ознакомьтесь с документацией по ElementTree в справке по python.

Базовая заглушка кода с этой страницы:

    import xml.etree.ElementTree as ET
    tree = ET.parse(filename)
    root = tree.getroot()
    for child in root:  
      child.tag, child.attrib

вы можете продолжать работать for child in root: рекурсивно вниз, пока не останется потомков.

person aw4lly    schedule 20.11.2012
comment
Спасибо! Именно то, что я искал. - person Baywatch; 20.11.2012

использовать cElementTree; он в 15-20 раз быстрее, чем Python-версия ElementTree, и использует в 2-5 раз меньше памяти. http://effbot.org/zone/celementtree.htm

import xml.etree.cElementTree as ET
tree = ET.parse('test.xml')
for elem in tree.getiterator():
    if elem.tag:
        print 'my name:'
        print '\t'+elem.tag
    if elem.text:
        print 'my text:'
        print '\t'+(elem.text).strip()
    if elem.attrib.items():
        print 'my attributes:'
        for key, value in elem.attrib.items():
            print '\t'+'\t'+key +' : '+value
    if list(elem): # use elem.getchildren() for python2.6 or before
        print 'my no of child: %d'%len(list(elem))
    else:
        print 'No child'
    if elem.tail:
        print 'my tail:'
        print '\t'+'%s'%elem.tail.strip()
    print '$$$$$$$$$$'
person namit    schedule 20.11.2012