2016-04-20 3 views
1

Я хочу перебирать определенный этап моих тегов.Python xml итерация через теги n-уровня

Например, я хотел бы перебирать объекты верхнего уровня:

<stage1tag> 
<child1tag>bla</child1tag> 
<child2tag>blabla</child2tag> 
<child3tag><stage2tag>heyho</stage2tag></child3tag></stage1tag> 
<stage1tag2> 
<stage1tag> 
<child1tag>… 
... 

Я только хочу, чтобы перебирать тег на этапе 1 (stage1tag и stage1tag2) В моей реальной XML они не называют ребенком .. .tag и stage ..., это только для лучшей читаемости. Как я могу получить теги верхнего уровня? Я ищу что-то вроде

elems = mytree.getlevel(0) #toplevel 
for child in elems.iter(): 
    #do something with the childs... 
+0

Вы можете сделать более ясный пример, используя сценарий реального случая и добавив вывод, который вы хотели бы иметь? –

+0

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

+1

Еще раз проверьте xml, который вы публикуете, после чего никогда не закрывается и никогда не открывается. .. –

ответ

0

Это один из возможных решений этой проблемы, я не тщательно протестированы, но она предназначена, чтобы дать вам представление о том, как подходить к такого рода проблем.

import re 

txt = \ 
''' 
<stage1tag> 
<child1tag>bla</child1tag> 
<child2tag>blabla</child2tag> 
<child3tag><stage2tag>heyho</stage2tag></child3tag></stage1tag> 
<stage1tag2> 
<stage1tag> 
<child1tag> 
''' 

#1: find tags 
re1='(<[^>]+>)' # regex string 
rg = re.compile(re1,re.IGNORECASE|re.DOTALL) 
tags = rg.findall(txt) 

#2: determine the level of each tag 
lvl = 1 # starting lvl 
for t in tags: 
    if '</' not in t: #it's an open tag, go up one lvl 
     k = t[1:-1] 
     print k,':',lvl 
     lvl += 1 

    else: #it's a close tag, go one lvl down 
     lvl -= 1 

Он печатает:

stage1tag : 1 
child1tag : 2 
child2tag : 2 
child3tag : 2 
stage2tag : 3 
stage1tag2 : 1 
stage1tag : 2 
child1tag : 3 

Это правильно учитывая ваш XLM.

0

Я предполагаю, что у вас есть корневой элемент - в противном случае анализатор задохнется с чем-то вроде «XMLSyntaxError: дополнительный контент в конце документа». Если у вас нет корневой элемент, просто добавьте:

data = """<root> 
<stage1tag id="1"> 
<child1tag>bla</child1tag> 
<child2tag>blabla</child2tag> 
<child3tag><stage2tag>heyho</stage2tag></child3tag> 
</stage1tag> 
<stage1tag id="2"> 
<child1tag>bla</child1tag> 
<child2tag>blabla</child2tag> 
<child3tag><stage2tag>heyho</stage2tag></child3tag> 
</stage1tag> 
</root> 
""" 

Вы можете использовать LXML:

>>> import lxml.etree 
>>> root = lxml.etree.fromstring(data) 
>>> root.getchildren() 
[<Element stage1tag at 0x3bf6530>, <Element stage1tag at 0x3bfb7d8>] 

>>> for tag in root.getchildren(): 
     print(tag.attrib.get('id')) 
1 
2 

Если документ отсутствует корневой элемент я не думаю, что вы можете назвать это XML, у вас есть что-то похожее на XML (см. Do you always have to have a root node with xml/xsd?)

Смежные вопросы