python中用ElementTree.iterparse()读取xml文件中的多层节点
我在使用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,还望大牛们指点。
python中用ElementTree.iterparse()读取xml文件中的多层节点的更多相关文章
- 读取xml文件中的配置参数实例_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 paras.xml文件 <?xml version="1.0" encoding=" ...
- 读取xml文件中节点
/// <summary> /// /// </summary> /// <param name="xmlpath">节点路径</para ...
- python读取xml文件中的坐标点
用labelImg工具制作好xml文件后,需要读取其中img路径和坐标点,生成一个label.txt <annotation> <folder>big</folder&g ...
- .net中读取xml文件中节点的所有属性信息
功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...
- Android - 读取XML文件中的数据
读取XML中存储的数据.将xmlfile.xml存放在assets文件夹中.在activity_main.xml中创建一个textview,用来显示读取到的数据. XML文件内容如下:xmlfile. ...
- 解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架自动封装参数的功能
程序结构:src文件夹下存放xml文件 该文件内容: <?xml version="1.0" encoding="UTF-8"?> <myst ...
- 在C#程序中,创建、写入、读取XML文件的方法
一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...
- (转) 读取xml文件转成List<T>对象的两种方法
读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法,加上自己知道的另一种实现方法. 就以一个简单的xml做例子. xml格 ...
- 读取xml文件转成List<T>对象的两种方法(附源码)
读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...
随机推荐
- Spring官方文档
官网里还真不好找,编译的时候pdf版还没编译成功,这里记录下 http://docs.spring.io/spring/
- Windows Server 2003 简体中文企业版
Windows Server 2003 简体中文企业版,真正免激活. CD-KEY:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY 安装序列号:JCGMJ-TC669-KCBG7-HB8X ...
- centos安装rvm报错@curl -L get.rvm.io | bash -s stable fails on cent OS
It is a security feature introduced in the latest version of RVMhttps://github.com/wayneeseguin/rvm/ ...
- Window虚拟内存管理(转)
内存管理是操作系统非常重要的部分,处理器每一次的升级都会给内存管理方式带来巨大的变化,向早期的8086cpu的分段式管理,到后来的80x86 系列的32位cpu推出的保护模式和段页式管理.在应用程序中 ...
- 【306】通过ArcPy编写ArcToolbox
参考:使用 Python 创建工具 参考:在 Python 工具箱中定义参数数据类型 基本步骤如下: (1)创建一个 Python 脚本,并保存成 .py 文件. (2)创建一个自定义工具箱(.tbx ...
- 关于Remoting的个人使用心得
最经几天比较闲写了一个基于Tcp网络通信的聊天程序,写的过程中实现了文件传输,可是却怎样也无法将文件名传送过去,期间想过用通信的端口发送文件的名称,但是又要自己定义一个协议,觉得那样比较麻烦,于是想到 ...
- JAVA中List的三个子类。
JAVA中List的三个子类分别是:ArrayList,Vector,LinkList.下面就来比较一下他们的不同. ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高. Ve ...
- Maven详解【面试+工作】 各种安装 没用
1 Maven介绍1.1 项目开发中遇到的问题 1.都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? 2.为什么在我的机器上可以正常打包,而配置管理员却打不出来? 3.项目组加入 ...
- Redis清理
Redis登录: Redis目录: redis-cli.exe -h 127.0.0.1 -p 6739 login: auth “password” flushall
- Linux网络配置之虚拟网卡的配置(Red Hat 6.5)
怎么查看当前的网络状态,这里就不着重描述,用ifconfig命令就可以.我们直接进入主题. red hat系统中的网卡配置在这个目录中:/etc/sysconfig/network-scripts 1 ...