Python中使用ElementTree解析XML文件
来源:互联网 发布:外资企业数据 编辑:程序博客网 时间:2024/05/16 12:00
- Python中使用ElementTree对XML文件进行解析
- XML文件介绍
- Python中提供的XML解析方式
- 准备一份XML格式的文件
- XML文件格式介绍
- ElementTree解析XML文件的过程
- 源码演示
- 查找指定的子节点
- 删除指定的节点以及保存
Python中使用ElementTree对XML文件进行解析
官方API介绍:https://docs.python.org/3.6/library/xml.etree.elementtree.html
XML文件介绍:
XML指可扩展标记语言(eXtensible Markup Language),接触过Java或者Android的同学们相信绝对不会陌生,XML被设计用来传输和存储数据,虽然现在用来与服务端交互更多情况下使用的都是Json格式的数据,但是XML格式还是有着广泛的应用。
最近在公司的项目中,需要使用Python脚本在后台对反编译的apk文件进行合并,其中对Manifest文件中标签的处理,主要就是用到了Python中的XML解析,因此写一篇文章记录一下。
Python中提供的XML解析方式:
准备一份XML格式的文件:
巧妇难为无米之炊,需要进行解析,首先必须有一个XML文件,本篇文章采用官方API示例中的XML文档,示例代码如下:
<?xml version="1.0"?><data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor name="Austria" direction="E"/> <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor name="Malaysia" direction="N"/> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor name="Costa Rica" direction="W"/> <neighbor name="Colombia" direction="E"/> </country></data>
XML文件格式介绍:
<tag attrib = > text </tag> tail
例:<APP_KEY channel = 'CSDN'> hello123456789 </APP_KEY>
- tag,即标签,用于标识该元素表示哪种数据,即APP_KEY
- attrib,即属性,用Dictionary形式保存,即{‘channel’ = ‘CSDN’}
- text,文本字符串,可以用来存储一些数据,即hello123456789
- tail,尾字符串,并不是必须的,例子中没有包含。
ElementTree解析XML文件的过程:
- 导入ElementTree,
import xml.etree.ElementTree as ET
- 解析Xml文件找到根节点:
- 直接解析XML文件并获得根节点,
tree = ET.parse('country_data.xml') root = tree.getroot()
- 解析字符串,
root = ET.fromstring(country_data_as_string)
- 直接解析XML文件并获得根节点,
- 遍历根节点可以获得子节点,然后就可以根据需求拿到需要的字段了。
源码演示:
示例代码:
#!usr/bin/python# -*- coding: utf-8 -*-#==========================import xml.etree.ElementTree as ETtree = ET.parse('country_data.xml')root = tree.getroot()print('root-tag:',root.tag,',root-attrib:',root.attrib,',root-text:',root.text)for child in root: print('child-tag是:',child.tag,',child.attrib:',child.attrib,',child.text:',child.text) for sub in child: print('sub-tag是:',sub.tag,',sub.attrib:',sub.attrib,',sub.text:',sub.text)
运行结果:
>>> root-tag: data ,root-attrib: {} ,root-text: child-tag是: country ,child.attrib: {'name': 'Liechtenstein'} ,child.text: sub-tag是: rank ,sub.attrib: {} ,sub.text: 1sub-tag是: year ,sub.attrib: {} ,sub.text: 2008sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 141100sub-tag是: neighbor ,sub.attrib: {'direction': 'E', 'name': 'Austria'} ,sub.text: Nonesub-tag是: neighbor ,sub.attrib: {'direction': 'W', 'name': 'Switzerland'} ,sub.text: Nonechild-tag是: country ,child.attrib: {'name': 'Singapore'} ,child.text: sub-tag是: rank ,sub.attrib: {} ,sub.text: 4sub-tag是: year ,sub.attrib: {} ,sub.text: 2011sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 59900sub-tag是: neighbor ,sub.attrib: {'direction': 'N', 'name': 'Malaysia'} ,sub.text: Nonechild-tag是: country ,child.attrib: {'name': 'Panama'} ,child.text: sub-tag是: rank ,sub.attrib: {} ,sub.text: 68sub-tag是: year ,sub.attrib: {} ,sub.text: 2011sub-tag是: gdppc ,sub.attrib: {} ,sub.text: 13600sub-tag是: neighbor ,sub.attrib: {'direction': 'W', 'name': 'Costa Rica'} ,sub.text: Nonesub-tag是: neighbor ,sub.attrib: {'direction': 'E', 'name': 'Colombia'} ,sub.text: None
查找指定的子节点:
当XML文件较大或者其中的子节点tag非常多的时候,一个一个获取是比较麻烦的而且有很多不是我们需要的,这样我们可以通过find(‘nodeName’)或者findall(‘nodeName’)方法来查找指定tag的节点。
- find(‘nodeName’):表示在该节点下,查找其中**第一个**tag为nodeName的节点。
- findall(‘nodeName’):表示在该节点下,查找其中**所有**tag为nodeName的节点。
代码示例:
#!usr/bin/python# -*- coding: utf-8 -*-import xml.etree.ElementTree as ETtree = ET.parse('country_data.xml')root = tree.getroot()animNode = root.find('country') #查找root节点下第一个tag为country的节点print(animNode.tag,animNode.attrib,animNode.text)
运行结果,可以在XML文件中看到,第一个tag为country的节点确实是Liechtenstein:
>>> country {'name': 'Liechtenstein'}
删除指定的节点以及保存
在合并Manifest文件的时候,可能有一些重复的权限,那么怎么删除掉呢,删除指定节点可以通过remove(node)方法,移除指定的节点。
代码示例,比如我们想移除attribute中name为Liechtenstein的节点:
#!usr/bin/python# -*- coding: utf-8 -*-import xml.etree.ElementTree as ETtree = ET.parse('country_data.xml')root = tree.getroot()animNode = root.find('country') if animNode.attrib['name'] == 'Liechtenstein': root.remove(animNode)tree.write('finish.xml')#保存修改后的XML文件
运行结果,我们打开保存的finish.xml文件,发现保存结果如下,name为Liechtenstein的节点已经被删除了:
<data> <country name="Singapore"> <rank>4</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> <country name="Panama"> <rank>68</rank> <year>2011</year> <gdppc>13600</gdppc> <neighbor direction="W" name="Costa Rica" /> <neighbor direction="E" name="Colombia" /> </country></data>
- Python中使用ElementTree解析XML文件
- Python中使用ElementTree对XML文件进行解析
- Python之使用ElementTree解析xml文件
- 使用Python库ElementTree解析XML文件
- python使用ElementTree解析XML文件
- Python使用ElementTree解析XML
- python 使用ElementTree解析XML
- Python 使用ElementTree解析XML
- 使用Python和xml.etree.ElementTree解析xml文件
- Python——使用ElementTree解析AndroidManifest.xml文件
- python-xml.etree.ElementTree解析xml文件
- python xml解析ElementTree
- python解析xml ElementTree
- 用 ElementTree 在 Python 中解析 XML
- 用 ElementTree 在 Python 中解析 XML
- 用 ElementTree 在 Python 中解析 XML
- 用 ElementTree 在 Python 中解析 XML
- 用 ElementTree 在 Python 中解析 XML
- jquery ajax
- 模拟ORM框架—数据层的增加
- Intelij Idea设置系统默认换行符解决多系统协作开发换行符冲突
- Virtualbox .vdi虚拟磁盘文件瘦身方法
- hdu4757(LCA+可持久化字典树)
- Python中使用ElementTree解析XML文件
- Android Window 二 可移动悬浮窗口 WindowManager
- Caused by: java.lang.RuntimeException: A TaskDescription's primary color should be opaque的解决方案
- 【Hibernate】--关联关系映射:多对多映射
- ACCP7.0使用JAVA理解程序逻辑第十一章
- icmp应答包如何定位ping进程
- 【BZOJ】1213 [HNOI2004]高精度开根
- 高精度加法模板
- Android之自定义实现BaseAdapter(通用适配器四)