Python 处理 xml 文件

本贴最后更新于 1329 天前,其中的信息可能已经时移世异

最近有同学询问如何利用Python处理xml文件,特此整理一个比较简洁的操作手册,供大家参阅。
准备一个xml文件,xml中的内容如下所示,存储为:student.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- sno是属性定义在元素内 -->
<students no="2">
	<student sno="1901">
		<name>江韬</name>
		<age>31</age>
		<gender></gender>
		<mobilephone>13517315144</mobilephone>
	</student>

	<student sno="1902">
		<name>华华</name>
		<age>31</age>
		<gender></gender>
		<mobilephone>18688773499</mobilephone>
	</student>
</students>

如果要获取这个xml里面的数据,我们需要利用Python里面ElementTree来进行处理,具体操作如下所示:

1:导入包(包是Python内置自带)
import xml.etree.ElementTree as ET
2:打开文件,并获取根节点的属性和节点名称
#打开xml文件
#如下两行代码后期可以重复使用哦·后面操作就不再重复书写
tree=ET.parse("student.xml")
root=tree.getroot()#获取根节点

print(root.tag)#打印根节点的值
print(root.attrib)#打印属性值

运行代码后,结果如下所示:
image.png

3:利用find方法获取子节点(缺点:只能根据提供的名称获取第一个子节点)
node=root.find("student")
print("节点名称:",node.tag)
print("节点属性值:",node.attrib)

运行结果如下所示:
image.png

4:利用findall方法获取所有子节点,返回的节点会存在一个列表里面
#利用findall根据提供给的节点名,查找所有同名的节点名
nodes=root.findall("student")
# 根据索引去取值
print("节点名称:",nodes[0].tag)
print("节点属性值:",nodes[0].attrib)
print("节点名称:",nodes[1].tag)
print("节点属性值:",nodes[1].attrib)

#利用遍历去获取节点的属性和名称
for node in nodes:
    print("节点名称:",node.tag)
    print("节点属性值:",node.attrib)

运行的结果如下所示:
image.png

5:利用findall方法获取所有三级子节点,返回的节点会存在一个列表里面
nodes=root.findall("student")
#利用遍历去获取节点的属性和名称
for node in nodes:
    sub_node=node.findall("name")#查找name节点
    for three_node in sub_node:
        #获取三级节点name的tag 和 标签包含的值
        print("{}{}".format(three_node.tag,three_node.text))

运行结果如下所示:
image.png

6:利用遍历的方法去直接遍历子节点里面的所有元素
for node in root:#遍历二级节点
    print("二级节点{}的属性值{}:".format(node.tag,node.attrib))
    print("三级节点的获取:")
    for sub_node in node:#遍历三级节点
        print("{}={},".format(sub_node.tag,sub_node.text),end="")
    print("\n")

运行结果如下所示:
image.png

至此我们的xml的处理已经完全结束啦!

给大家留下一个练习题:
有一个xml的文件,内容如下,保存为:UILibrary.xml

<?xml version="1.0" encoding="UTF-8"?>
<pages>
	<!-- page元素代表一个页面 -->
	<page keyword="登录页面">
		<uiElement keyword="手机号" by="id" value="mobilephone"></uiElement>
		<uiElement keyword="密码" by="id" value="password"></uiElement>
		<uiElement keyword="登录按钮" by="id" value="login"></uiElement>
		<uiElement keyword="错误信息展示区" by="className" value="tips"></uiElement>
	</page>

	<page keyword="注册页面">
		<uiElement keyword="手机号" by="id" value="mobilephone"></uiElement>
		<uiElement keyword="密码" by="id" value="password"></uiElement>
		<uiElement keyword="重复密码" by="id" value="pwdconfirm"></uiElement>
		<uiElement keyword="验证码" by="id" value="verifycode"></uiElement>
		<uiElement keyword="注册按钮" by="id" value="signup-button"></uiElement>
		<uiElement keyword="错误信息展示区" by="className" value="tips"></uiElement>
	</page>

	<page keyword="首页">
		<uiElement keyword="老师信息管理" by="id" value="menu-teacher"></uiElement>
		<uiElement keyword="老师信息" by="partialLinkText" value="老师信息"></uiElement>
		<uiElement keyword="老师列表iframe" by="xpath" value="//iframe[@src='teacher-list.html']"></uiElement>
	</page>

	<page keyword="老师列表页">
		<uiElement keyword="添加老师按钮" by="partialLinkText" value="添加老师"></uiElement>
	</page>

	<page keyword="老师编辑页">
		<uiElement keyword="昵称" by="id" value="nickname"></uiElement>
		<uiElement keyword="手机号" by="id" value="mobilephone"></uiElement>
		<uiElement keyword="qq" by="id" value="qq"></uiElement>
		<uiElement keyword="性别" by="id" value="sex"></uiElement>
		<uiElement keyword="地区" by="id" value="livingPlace"></uiElement>
		<uiElement keyword="类别" by="id" value="type"></uiElement>
		<uiElement keyword="保存按钮" by="id" value="save"></uiElement>
		<uiElement keyword="老师编辑页iframe" by="xpath" value="//iframe[@src='./teacher-edit.html']"></uiElement>
	</page>
</pages>

给大家留下一个练习题,针对上述xml文件,要求如下:

1:写一XmlUtil类,里面写一个函数:get_page,传递一个参数 file_path,实现元素的读取,返回列表形式的数据,并且列表里面存储每个page节点的信息;

2:写一个page类,有2个属性:page_key_word,存储页面信息;uiElement存储列表数据

3:写一个UiElement类,有1个属性:存储列表类型的数据,把每一个信息作为列表里面的一个数据

后期给大家揭晓答案哟!记得持续关注,或者找杰克辅导员!后面也会结合WEB自动化来给大家做进一步的分享

1 操作
huahua 在 2020-08-07 21:48:30 更新了该帖
3 回帖
请输入回帖内容 ...
  • huahua

    😎 居然没有人来做

  • 其他回帖
  • huahua

    找杰克老师~~

  • zjing306

    大佬 2个月了 答案呢