2011-07-07 11 views
0

我正在处理一些xml文件。这些文件的模式指定只能有某种类型的元素(在这种情况下,我正在使用脚注元素)。如何从列表中获得某种特定类型的唯一元素,比我所做的更干净?

在脚注元素中可以有几个脚注元素,我试图抓住并处理脚注元素,以便我可以遍历它来发现脚注元素。

这里是我目前的做法

def get_footnotes(element_list): 
    footnoteDict=od() 

    footnotes_element=[item for item in element_list if item.tag=='footnotes'][0] 
    for eachFootnote in footnotes_element.iter(): 
     if eachFootnote.tag=='footnote': 
      footnoteDict[eachFootnote.values()[0]]=eachFootnote.text 
    return footnoteDict 

element_list是贯穿整个树遍历

所以我想知道如果有一个更Python的方式来获得后是相关的我的元素列表脚注元素,而不是遍历元素列表,在我看来,这是笨拙的,因为这是

footnotes_element=[item for item in element_list if item.tag=='footnotes'][0] 
+0

你应该看看这个问题,它的答案(http://stackoverflow.com/questions/8692/how-to-use-xpath-在的Python)。也许你应该使用XPath和lxml。 – buruzaemon

+0

@erkysun感谢您的支持 – PyNEwbie

回答

2

有点像thi s应该做的工作:

from lxml import etree 

xmltree = etree.fromstring(your_xml) 

for footnote in xmltree.iterfind("//footnotes/footnote"): 
    # do something 
    pass 

如果您提供一些示例XML更容易帮助。

编辑:

如果使用的是真正的大文件时,你可能会想看看iterparse

这个问题似乎有相当不错的例子:python's lxml and iterparse method

+0

您建议不要从树中获取相关元素,而是通过完整的树。这是一个有趣的建议,我需要考虑一些。我首先运行一个函数,将我关心的元素的父母拉入到element_list中,并将该列表传递给我的其他函数。你的建议是,我只是把树带过去。我的想法是,我正在使用的一些树是非常大的,所以通过删除我想要的功能中的元素,我通过垃圾回收其他不需要的东西来收集 – PyNEwbie

+0

如果你正在使用非常大的你应该看看'iterparse'文件。它允许您在解析文件时提取数据,而不是先解析整个文件并将其保存在内存中。 – Acorn

+0

@PyNEwbie,你不会传递“整棵树”,只是参考它。 –

相关问题