使用python解析Xml文件错误:列出索引超出范围的索引

时间:2015-01-19 12:40:33

标签: python xml parsing

我有一个非常大的XML文件。我需要使用python显示存储在每个标签中的值。我正在尝试使用dom库。有人可以帮忙吗? XML文件链接:https://code.google.com/p/warai/downloads/detail?name=haarcascade_frontalface_alt.xml

from xml.dom import minidom

doc= minidom.parse('haarcascade_frontalface_alt.xml')

size=doc.getElementsByTagName('size')[0]
print size.firstChild.data

stages=doc.getElementsByTagName('stages')[0]
stagen=stages.getElementsByTagName('_')

for stage in stagen:
    stage_threshold=stage.getElementsByTagName('stage_threshold')[0]
    parent=stage.getElementsByTagName('parent')[0]
    anext=stage.getElementsByTagName('next')[0]

    print stage_threshold.firstChild.data
    print parent.firstChild.data
    print anext.firstChild.data

    trees=stage.getElementsByTagName('trees')[0]
    a=trees.getElementsByTagName('_')
    for k in a:
        b=k.getElementsByTagName('_')[0]
        threshold=b.getElementsByTagName('threshold')[0]
        left_val=b.getElementsByTagName('left_val')[0]
        right_val=b.getElementsByTagName('right_val')[0]
        feature=b.getElementsByTagName('feature')[0]
        tilted=feature.getElementsByTagName('tilted')[0]
        rects=feature.getElementsByTagName('rects')[0]
        m=rects.getElementsByTagName('_')[0]
        n=rects.getElementsByTagName('_')[1]


        print m.firstChild.data
        print n.firstChild.data
        print tilted.firstChild.data
        print threshold.firstChild.data
        print left_val.firstChild.data
        print right_val.firstChild.data

1 个答案:

答案 0 :(得分:0)

使用ElementTree接口,例如xml.etree.ElementTree,但也存在其他实现。

使用迭代器递归迭代所有元素以遍历XML树:

from xml.etree import ElementTree as ET
root = ET.parse("xml.xml").getroot()
def print_value(node):
  if node.text and not node.text.isspace(): 
     print(node.text)
  for child in node: print_value(child)

print_value(root)

但是如果文件非常大,并且您无法将整个树加载到内存中,请使用.iterparse()。它按元素返回元素 - 事件"开始"和"结束"表示解析器到达当前节点的开头或结尾。如果没有向iterparse函数提供任何事件,则只有"结束"使用。

import xml.etree.ElementTree as ET

it = ET.iterparse("xml.xml")

for event, node in it:
  if node.text and not node.text.isspace():   
     print(node.text)
  node.clear()

注释

  • 您还可以打印每个元素的.tail
  • 如果你有非常非常多的元素,你可以考虑记住每个节点的父节点,并使用parent.remove(node)而不是node.clear()