我有一个非常大的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
答案 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()
。