博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中用ElementTree.iterparse()读取xml文件中的多层节点
阅读量:5062 次
发布时间:2019-06-12

本文共 981 字,大约阅读时间需要 3 分钟。

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

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

<item>

  <country>

    <city></city>

    <city></city>

  </country>

</item>

  在这个xml栗子中,用iterparse()方法捕捉end来获取标签,如果要获取<country>标签,那elem先获取的是country下的<city>标签,因为在遍历到<country>标签的结束标志</>前,先遍历到<city>的结束标志,所以elem先获取<country>标签的子标签<city>,这类似于深度优先遍历,所以如果每次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,还望大牛们指点。

转载于:https://www.cnblogs.com/dragonisnotghost/p/4508877.html

你可能感兴趣的文章
js无缝滚动
查看>>
Diameter协议摘要
查看>>
操作系统(一) 操作系统的概念
查看>>
打开utmp文件,访问其中的内容
查看>>
C++基础:纯虚函数和抽象类
查看>>
王者荣耀交流协会第二次Scrum立会
查看>>
设计模式-装饰者模式
查看>>
windows 下命令行关闭进程。
查看>>
fileSave,fileOpen,fileSaveAs
查看>>
VMware虚拟机安装Centos预安装环境图文教程1
查看>>
时钟Demo
查看>>
leetcode 区间合并
查看>>
Java中的控制语句
查看>>
通过正则表达式来判断字符串是否为数字组成的
查看>>
vue中引入jQuery
查看>>
过滤器
查看>>
HDU5692(线段树+dfs序)
查看>>
MVC引用asp.net报表(测试小例子)
查看>>
写出float x 与“零值”比较的if语句
查看>>
我是MVC菜鸟---MVC的优劣对比
查看>>