python解析xml多层子节点_python中用ElementTree.iterparse()读取xml文件中的多层节点

我在使用Python解析比较大型的xml文件时,为了提高效率,决定使用iterparse()方法,但是发现根据网上的例子:每次if event == 'end':之后elem.clear()或者是每次 if elem.tag == '':之后clear(),都只能去到当前标签的相关内容,如果想继续读取得到标签的子标签,则会返回为空,也就是取不到。

其实iterparse()方法的原理是当遇到标签的“>”符号时触发start,当遇到标签的结束标志是会触发end,比如:

在这个xml栗子中,用iterparse()方法捕捉end来获取标签,如果要获取标签,那elem先获取的是country下的标签,因为在遍历到标签的结束标志>前,先遍历到的结束标志,所以elem先获取标签的子标签,这类似于深度优先遍历,所以如果每次if完都clear()的话,会clear掉相应标签的子标签,所以得不到其子标签。

我尝试了各种方法来解决这个问题,后来通过这么写来实现的:

from xml.etree import ElementTree

for event, elem in ElementTree.iterparse(xml):

if event == 'end':

if elem.tag == 'name' and elem.find('children').get('name') == attr_name:

相应标签的操作

elem.clear()

if ....:

elem.clear()

我把clear()方法放在了if里面,这样只有在找到相应标签并且读取完其子标签后再clear(),这样就可以读取子标签以及多层节点了。

功能是实现了,但是不知道其效率有没有影响,本人菜鸟刚接触Python,还望大牛们指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值