import xml.etree.ElementTree as ET

 def parse_res(xml_file):
res_dic = {}
tmp_lst_lev1 = []
tmp_lst_lev2 = []
add_flag = False
for event, elem in ET.iterparse(xml_file):
if event == 'end':
if elem.tag == 'Item':
tmp_lst_lev1.append(dict(elem.attrib))
elif elem.tag == 'Enum':
enum_str = ''.join([ ''.join(['[', item['value'], '=', item['name'], ']']) for item in tmp_lst_lev1])
res_enum = {}
res_enum['id'] = elem.attrib['id']
res_enum['name'] = enum_str
tmp_lst_lev2.append(res_enum)
tmp_lst_lev1 = []
elif elem.tag == 'EnumRes':
res_dic['EnumRes'] = {}
tmp_dic = res_dic['EnumRes']
for item in tmp_lst_lev2:
tmp_dic[ item['id'].split('.')[1] ] = item['name']
tmp_lst_lev2 = []
elif elem.tag == 'MeasUnitRes' or elem.tag == 'CounterNameRes' or elem.tag == 'CounterUnitRes':
res_dic[elem.tag] = {}
tmp_dic = res_dic[elem.tag]
for item in tmp_lst_lev1:
tmp_dic[ item['id'].split('.')[1] ] = item['name']
tmp_lst_lev1 = []
#CommonInfo.Resource.xml
elif elem.tag == 'DevTypeNameRes' or elem.tag == 'VendorRes' or elem.tag == 'MocRes':
res_dic[elem.tag] = {}
tmp_dic = res_dic[elem.tag]
for item in tmp_lst_lev1:
tmp_dic['id'] = item['id'].split('.')[1]
tmp_dic['name'] = item['name']
tmp_lst_lev1 = []
#StaticList.xml
elif elem.tag == 'param':
if 'alarmId' == elem.attrib['name']:
id = elem.text
elif elem.tag == 'alarm':
tmp_lst_lev1.append([id, elem.attrib['name']])
elif elem.tag == 'alarms':
res_dic[elem.tag] = {}
tmp_dic = res_dic[elem.tag]
for item in tmp_lst_lev1:
tmp_dic[ item[0] ] = item[1]
tmp_lst_lev1 = []
elem.clear() #关键在这一名,处理完节点及时清理内存
return res_dic

快速解析超大XML不占用太大内存的更多相关文章

  1. 一个Java对象到底占用多大内存?

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  2. 一个Java对象到底占用多大内存

    在网上搜到了一篇博客讲的非常好,里面提供的这个类也非常实用: import java.lang.instrument.Instrumentation; import java.lang.reflect ...

  3. 一张图片资源要占用多大内存xhdpi xxhdpi

    一张图片资源要占用多大内存,可以用下面的计算公式计算 4 * withPixel*(targetDensity /sourcedensity) * heightPixel*(targetDensity ...

  4. 高端面试必备:一个Java对象占用多大内存

    这个问题一般会出现在稍微高端一点的 Java 面试环节.要求面试者不仅对 Java 基础知识熟悉,更重要的是要了解内存模型. Java 对象模型 HotSpot JVM 使用名为 oops (Ordi ...

  5. android避免decodeResource图片时占用太大的内存

    增加largeHeap="true"属性. android:largeHeap Whether your application's processes should be cre ...

  6. mysql5.6默认情况下内存占用太大

    下载了mysql5.6.12 ,默认占用内存达400多M,  而原来使用的5.0 只有30M.. 解决方案:调整以下参数----------------performance_schema_max_t ...

  7. XE 安装后C盘占用太大,C盘空间清理

    XE安装完C盘可以清理的垃圾缓存文件 C:\ProgramData\{0DE47792-19BD-4AF4-B9CF-6378FBA44825}  XE6 9个G,xe7 18G XE6如此,XE7安 ...

  8. mui 每次页面跳转用mui.openWindow会不会占用很大内存?

    http://ask.dcloud.net.cn/question/5384 不能每次用mui.openWindow.不用的webview要close,一个webview被close后会露出其他没有被 ...

  9. Unity3D占用内存太大的解决方法

    原地址:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大 ...

随机推荐

  1. 【转载】windows平台安装nodejs过程

    第一步 下载nodejs 访问https://nodejs.org/en/download/url 根据您的系统是32位或64位,按照文字说明进行下载 第二步 安装nodejs 双击运行nodejs的 ...

  2. java web工程 数据库操作报驱动类找不到的错误

    这几天在进行数据库的操作,写好数据库操作类后,用测试类测试成功通过,但是部署到tomcat后,从页面访问就会报异常. 最后终于发现是tomcat使用了连接池的数据连接方式. 解决方法是把jdbc ja ...

  3. AfxMessageBox和MessageBox区别

    如果用MFC的话,请尽量使用afxmessagebox,因为这个全局的对话框最安全,也最方便.    但是在WIN32 SDK的情况下只能使用MESSAGEBOX. MessageBox()是Win3 ...

  4. IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)

    在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...

  5. R语言将字符串矩阵转化为数值型矩阵

    这是原始数据的格式,当运行完下面的命令的时候,结果如下图 x=read.table("C:/Users/Administrator/Desktop/s1.txt") x=as.ma ...

  6. php 正则表达式 将形如 "天," ,"安", "门" 转化为"天、安、门", (仅匹配汉字)

    #!/usr/bin/php<? $rows = file("illwods_deal1.txt"); $goalfile = fopen("illwods_res ...

  7. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  8. cocoapods安装及常用命令

    如果不是因为我重装了电脑,我大概也不会写这篇博客,网上关于cocoapods的安装可谓是不可胜数. 但是对于新版的系统来说,的确存在很多的坑点,这点不是我一个人遇到的问题 如果是新装的系统,默认是安装 ...

  9. Windows 2008 R2 安装 Windows phone 7 开发环境

    安装环境:1.Windows server 2008 R22.Visual Studio 2010 SP1 旗舰版 1.下载 WP7 SDK 离线安装包.(话说要选择与 VS2010 相同语言的版本) ...

  10. redis高可用分布式集群

    一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...