2013-03-01 63 views

回答

3

也許這可能是一個最初的想法:

from xml.etree import ElementTree 
from xml.etree.ElementTree import iterparse 

level = 0 

for (event, node) in iterparse(fileName, ['start', 'end', 'start-ns', 'end-ns']): 

    if event == 'end': 
     level -= 1 

    if event == 'start': 
     level += 1 

    # do soething with node ... 
+0

謝謝!這就是我正在尋找的! :),其他答案很好,但他們打算找到一個節點的級別,而不是每個節點。 – Curious 2013-03-01 07:51:35

0

我被「蟒蛇XML解析器」你的意思是xml.etree假設。還有其他庫(如lxml)可以使這項工作更容易,但根據this answer有沒有簡單的方法來訪問使用此庫的父元素。然而,解決辦法提出有(創建家長到整個樹的映射)就足以確定任何特定元素的水平:

import xml.etree.ElementTree as ET 
tree = ET.parse('country_data.xml') 
root = tree.getroot() 
# root = ET.fromstring(...) # Alternative 

parent_map = dict((c, p) for p in root.getiterator() for c in p) 
def level(node): 
    return level(parent_map[node])+1 if node in parent_map else 0 
0

我總是用minidom命名,並推薦它爲這些類和XML文件的交互。您可以爲此使用元素的parentNode屬性。

import xml.dom.minidom as parser 

tree = parser.parse('xml.xml') 

#let's say we want the first instance of a tag with an specific name 
x = tree.getElementsByTagName('tagname')[0] 

level = 0 
while x: 
    x = x.parentNode 
    level += 1 

print(level) 

這是一個鏈接到minidom documentation