2016-04-20 6 views
1

私のタグの特定の段階を繰り返していきたいと思います。Python xmlでnレベルのタグを反復する

たとえば、私はトップレベルのオブジェクトを反復処理したいと思います:

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

私は、彼らが子供と呼ばれていない私の本当のxmlでは、ステージ1(stage1tagとstage1tag2)でタグを反復処理したいです... .tagタグとstageタグ...これは、読みやすくするためです。トップレベルのタグを取得するにはどうしたらいいですか?私はこれが、この問題に対する一つの可能​​な解決策である

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

実際のケースのシナリオを使用し、必要な出力を追加すると、より明確な例を作成できますか? –

+0

私は現在私のPC上にはありません。私はこれを私の携帯電話から聞いています。しかし、この例は本当かもしれません...私はそれらの個々の子供に別々にアクセスできるように、トップレベルのタグのリストを取得したいと考えています... – 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 

これは、出力します:あなたのXLMを指定して、適切である

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

を。

0

私はあなたがルート要素を持っていると仮定します。そうでなければ、パーサーは "XMLSyntaxError:ドキュメントの最後に余分なコンテンツ"のようなものをつけます。あなたはルート要素が不足している場合は、1つだけ追加します。

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?を参照)

関連する問題