2016-04-20 137 views
1

我想循環遍歷標籤的特定階段。Python xml通過n級標籤迭代

比如,我想通過頂層對象進行迭代:

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

我只希望在第一階段(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?