2013-04-01 31 views
4

我想用Python解析XML文件中的某些标记元素,并生成输出excel文档,该文档将包含元素并保留其层次结构。Python - 如何确定分析的XML元素的层次结构级别?

我的问题是,我无法弄清楚嵌套每个元素(在哪个分析器迭代)是多深。

XML样品提取物(3个元素,它们可以嵌套自身内任意地):

<A> 
    <B> 
     <C> 
     </C> 
    </B> 
</A> 
<B> 
    <A> 
    </A> 
</B> 

以下代码,使用ElementTree的,运作良好遍历元素。但我认为ElementTree无法确定每个元素嵌套的深度。如下所示:

import xml.etree.ElementTree as ET 

root = ET.parse('XML_file.xml') 
tree = root.getroot() 
for element in tree.iter(): 
    if element.tag in ("A","B","C"): 
     print(element.tag) 

这会按顺序给我列出元素A,B,C。但我需要打印出来与他们的信息化水平,

这样不仅:

A 
B 
C 
B 
A 

但这样的:

A 
--B 
----C 
B 
--A 

为了能够做到这一点,我需要得到每个元素的级别。是否有任何适合python的解析器可以很容易地做到这一点?我会想象像 “element.hierarchyLevel”,这将返回一些整数索引...

+0

您需要使用某种形式的堆栈。遇到一个开放的标签,将它推入堆栈,关闭标签,弹出它。这样,堆栈长度将始终包含嵌套级别。 –

+0

请注意,您几乎可以肯定想要导入'xml.etree.cElementTree',它比pure-python模块快很多倍并且100%兼容。 – user4815162342

回答

3

尝试使用递归函数,即跟踪你的“水平”。

import xml.etree.ElementTree as ET 

def perf_func(elem, func, level=0): 
    func(elem,level) 
    for child in elem.getchildren(): 
     perf_func(child, func, level+1) 

def print_level(elem,level): 
    print '-'*level+elem.tag 

root = ET.parse('XML_file.xml') 
perf_func(root.getroot(), print_level) 
+0

非常感谢,这很好的解决了它,会用解决方案来更新问题(+一个微小的更正) – VojtaBurian

+0

你应该[接受答案](http://meta.stackexchange.com/a/5235/207820)你解决了这个问题。不要将此添加到您的问题中。 – pradyunsg

1

你可以使用xml.sax.saxhandler

import xml.sax as sax 
import xml.sax.handler as saxhandler 

class TreeBuilder(saxhandler.ContentHandler): 
    # http://docs.python.org/library/xml.sax.handler.html#contenthandler-objects 
    def __init__(self): 
     self.level = 0 
    def startElement(self, name, attrs): 
     print('--'*self.level + name) 
     self.level += 1 
    def endElement(self, name): 
     self.level -= 1 

builder = TreeBuilder() 
src = '''\ 
<root> 
<A> 
    <B> 
     <C> 
     </C> 
    </B> 
</A> 
<B> 
    <A> 
    </A> 
</B> 
</root> 
''' 
sax.parseString(src, builder) 

产生

root 
--A 
----B 
------C 
--B 
----A 
+0

使用SAX看起来很聪明,但可能会坚持学生的想法。无论如何,感谢您的帮助! – VojtaBurian

相关问题