转载:http://blog.csdn.net/lihao21/article/details/72891932

最近使用 Python 来发送 SOAP 请求以测试 Web Service 的性能,由于 SOAP 是基于 XML 的,故免不了需要使用 Python 来处理 XML 数据。在对比了几种方案后,最后选定使用 xml.etree.ElementTree 模块来实现。 
这篇文章记录了使用 xml.etree.ElementTree 模块常用的几个操作,也算是总结一下,免得以后忘记了。

概述

对比其他 Python 处理 XML 的方案,xml.etree.ElementTree 模块(下文我们以 ET 来表示)相对来说比较简单,接口也较友好。 
官方文档 里面对 ET 模块进行了较为详细的描述,总的来说,ET 模块可以归纳为三个部分:ElementTree类,Element类以及一些操作 XML 的函数。 
XML 可以看成是一种树状结构,ET 使用ElementTree类来表示整个 XML 文档,使用Element类来表示 XML 的一个结点。对整 XML 文档的操作一般是对ElementTree对象进行,而对 XML 结点的操作一般是对Element对象进行。

解析 XML 文件

ET 模块支持从一个 XML 文件构造ElementTree对象,例如我们的 XML 文件example.xml内容如下(下文会继续使用这个 XML 文档):

<?xml version="1.0" encoding="utf-8"?>
<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> </data>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

可以使用 ET 模块的parse()函数来从指定的 XML 文件构造一个ElementTree对象:

import xml.etree.ElementTree as ET# 获取 XML 文档对象 ElementTree
tree = ET.parse('example.xml')
# 获取 XML 文档对象的根结点 Element root = tree.getroot() # 打印根结点的名称 print root.tag
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

从 XML 文件构造好ElementTree对象后,还可以获取其结点,或者再继续对结点进行进一步的操作。

解析 XML 字符串

ET 模块的fromstring()函数提供从 XML 字符串构造一个Element对象的功能。

xml_str = ET.tostring(root)
print xml_str
root = ET.fromstring(xml_str)
print root.tag
  • 1
  • 2
  • 3
  • 4

接着上面的代码,我们使用 ET 模块的tostring()函数来将上面我们构造的root对象转化为字符串,然后使用fromstring()函数重新构造一个Element对象,并赋值给root变量,这时root代表整个 XML 文档的根结点。

构造 XML

如果我们需要构造 XML 文档,可以使用 ET 模块的 Element类以及SubElement()函数。 
可以使用Element类来生成一个Element对象作为根结点,然后使用ET.SubElement()函数生成子结点。

a = ET.Element('a')
b = ET.SubElement(a, 'b')
b.text = 'leehao.me'
c = ET.SubElement(a, 'c')
c.attrib['greeting'] = 'hello' d = ET.SubElement(a, 'd') d.text = 'www.leehao.me' xml_str = ET.tostring(a, encoding='UTF-8') print xml_str
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出:

<?xml version='1.0' encoding='UTF-8'?>
<a><b>leehao.me</b><c greeting="hello" /><d>www.leehao.me</d></a>
  • 1
  • 2

如果需要输出到文件中,可以继续使用ElementTree.write()方法来处理:

# 先构造一个 ElementTree 以便使用其 write 方法
tree = ET.ElementTree(a)
tree.write('a.xml', encoding='UTF-8')
  • 1
  • 2
  • 3

执行后,便会生成一个 XML 文件a.xml:

<?xml version='1.0' encoding='UTF-8'?>
<a><b>leehao.me</b><c greeting="hello" /><d>www.leehao.me</d></a>
  • 1
  • 2

XML 结点的查找与更新

1. 查找 XML 结点

Element类提供了Element.iter()方法来查找指定的结点。Element.iter()会递归查找所有的子结点,以便查找到所有符合条件的结点。

# 获取 XML 文档对象 ElementTree
tree = ET.parse('example.xml')
# 获取 XML 文档对象的根结点 Element
root = tree.getroot()
# 递归查找所有的 neighbor 子结点
for neighbor in root.iter('neighbor'): print neighbor.attrib
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出:

{'direction': 'E', 'name': 'Austria'}
{'direction': 'W', 'name': 'Switzerland'} {'direction': 'N', 'name': 'Malaysia'}
  • 1
  • 2
  • 3

如果使用Element.findall()或者Element.find()方法,则只会从结点的直接子结点中查找,并不会递归查找。

for country in root.findall('country'):rank = country.find('rank').textname = country.get('name') print name, rank
  • 1
  • 2
  • 3
  • 4

输出:

Liechtenstein 1
Singapore 4
  • 1
  • 2

2. 更新结点

如果需要更新结点的文本,可以通过直接修改Element.text来实现。如果需要更新结点的属性,可以通过直接修改Element.attrib来实现。 
对结点进行更新后,可以使用ElementTree.write()方法将更新后的 XML 文档写入文件中。

# 获取 XML 文档对象 ElementTree
tree = ET.parse('example.xml')
# 获取 XML 文档对象的根结点 Element
root = tree.getroot()
for rank in root.iter('rank'): new_rank = int(rank.text) + 1 rank.text = str(new_rank) rank.attrib['updated'] = 'yes' tree.write('output.xml', encoding='UTF-8')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

新生成的output.xml文件以下:

<?xml version='1.0' encoding='UTF-8'?>
<data><country name="Liechtenstein"> <rank updated="yes">2</rank> <year>2008</year> <gdppc>141100</gdppc> <neighbor direction="E" name="Austria" /> <neighbor direction="W" name="Switzerland" /> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2011</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> </data>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

对比example.xml文件,可以看到output.xml文件已更新。

参考资料

  1. https://docs.python.org/2/library/xml.html#xml-vulnerabilities
  2. https://stackoverflow.com/questions/1912434/how-do-i-parse-xml-in-python

转载于:https://www.cnblogs.com/wangfeng92/p/8545236.html

PythonElementTree相关推荐

  1. c 引用mysql报错_安装TPCC-MySQL报错

    安装TPCC-MySQL做压力测试,由于TPCC-MySQL是bzr工具进行版本控制的,所以要先安装bzr [root@mha_backup /root] #rpm -Uvh http://dl.fe ...

  2. 安装TPCC-MySQL报错

    2019独角兽企业重金招聘Python工程师标准>>> 安装TPCC-MySQL做压力测试,由于TPCC-MySQL是bzr工具进行版本控制的,所以要先安装bzr [root@mha ...

  3. linux yum c 11,CentOS YUM源安装 GVM-11 (一)

    不为啥,这个只为补上之前在QQ群里给小伙伴们挖下的坑.因为 Greenbone Vulnerability Management 官方的推荐的部署方式是源代码编译安装和docker镜像部署.Green ...

  4. linux yum坏了怎么办,yum坏掉的解决

    yum坏掉的解决 发布时间:2008-10-13 00:06:46来源:红联作者:Montun # yum install webalizer Setting up Install Process S ...

  5. 《UNIX/LINUX系统管理I》课程学习总结

    目录 1. 解决grub引导过程故障 2. 解决系统网络接口卡无法激活故障 3.解决PUTTY窗口的登陆问题 4. 解决 文件系统无法访问故障 5. 解决软件yum安装 故障 1.1解决grub引导过 ...

  6. 青蛙学Linux—软件安装

    与Windows下通过双击EXE安装包安装软件不同,Linux下可以使用多种方法来安装软件.由于Linux开源的特性,所以在Linux上运行的很多软件都是开源软件,开源软件一般都会提供源码,有了源码我 ...

最新文章

  1. 人工智能预测之七宗罪
  2. Mobile and MID opportunities in APAC
  3. 通过第三方工具体验Microsoft Graph
  4. svn: Commit failed (details follow): svn: Authorization failed
  5. FCKeditor上传图片显示叉叉的问题的解决方案
  6. 机器学习实战—FPGrowth算法的实现
  7. ASC码表 和 转义字符表
  8. DVWA安装以及模块使用教程(一)
  9. xml--通过DOM解析XML
  10. 关于VS.NET中多个项目的工程相互引用和多个dll引用的问题! - antony--异域空间 - 博客园
  11. 软考证书可以落户上海吗?很多人不知道
  12. Mysql入门到放弃
  13. 客户成功团队的 OKR 案例
  14. 验证方法学覆盖率(一):代码覆盖率
  15. ipa 上传卡在鉴权_上传app,一直卡在“正在通过 App Store 进行鉴定”
  16. 关于技术学习的一点思考
  17. 鸿蒙车载智慧屏评测,搭载鸿蒙系统的荣耀智慧屏值得入手吗?荣耀智慧屏全面评测...
  18. correl函数相关系数大小意义_Excel使用Correl函数返回相关系数并确定属性关系的步骤方法...
  19. 项目:基于yolov5的舰船检测+pycharm+机器学习+图像检测
  20. 使用Nexus搭建Maven私服、私服下载与上传

热门文章

  1. html照片4张 9张布局,css实现朋友圈照片排列布局
  2. java对象的初始化顺序_Java对象初始化顺序
  3. java 网络实验_Java实验五网络编程与安全
  4. 控制工程matlab实验报告小结,控制工程MATLAB实验报告.doc
  5. python添加lxml库_7分钟,建议看完这5个Python库对比丨web抓取
  6. oracle 11.2.0.3 asm非rac双机,oracle11.2.0.4 rac asm启动故障
  7. python开发应用程序错误怎么办_编程中遇到的Python错误和解决方法汇总整理
  8. 测试信标灯的随机特性
  9. 如何能够得到灵敏度更高的150kHz导航信号检测板?
  10. AI视觉组培训第二弹——入门篇