Python3 xml.etree.ElementTree 读取XML文件

本文介绍如何使用Python的xml.etree.ElementTree模块解析XML文件,包括读取、查询等操作,并通过实例展示了如何遍历和查找XML节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

工作中需要读取xml文档中数据。Python中有几个模块都支持解析XML文件。这里选择xml.etree.ElementTree模块。一般对xml文件的操作有:查询读取、修改内容、删除内容、增加内容、构建新的xml文件。目前工作中主要应用查询读取,接下来主要总结查询读取的操作。不过对于其他操作,主要是模块提供的API不同。所谓触类旁通,一叶知秋,当以后需要使用其他的操作,也不嘘的。

xml文件

以下是这次需要读取的xml文件:取名叫country.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>
	<MediaPlatformService ip="36.32.160.199" port="9084" userName="admin" passWord="111" width="220" height="165">
	</MediaPlatformService>
</data>

了解下xml文件

正规的xml文档结构可通过正规教程等方式了解,这里个人对xml的理解是:可以将xml文档看作一个树结构,这棵树主要由一个根节点和众多子节点组成。
在上面的xml文档中,<data></data>就是一个根节点,其他类似country \ rank \ MediaPlatformService就是子节点。每个节点都有3个属性:tag、text、attrib

#xml一个节点有三个属性:tag、text、attrib
	以第一个子节点country为例:
	#tag代表节点名字,country节点的tag就是它的名字:country
	#text代表节点文本内容,rank节点的text就是1
	#attrib代表节点包含的属性,以{属性:值}这样的字典形式存放。country节点的属性是{name:Liechtenstein}.name是属性的键,Liechtenstein是属性的值。{属性:值}就是一个字典类型,可以使用一切字典方法。
	#country节点的tag为country,attrib为{name:Liechtenstein},text为空
	#rank节点的tag为rank,attrib为空字典,text为1
	#综上所述,xml文档主要由节点以及节点的三个属性组成。

了解下模块提供的相关API

  1. tree = ET.ElementTree(file=xmlfilename) #读取xml文件,还有别的方法。
  2. root = tree.getroot() #获取xml文件中的根节点,比如上面的xml文件,根节点就是<data>

节点对象提供了一些寻找元素的方法,如下:

  1. Elementt.iter() #递归迭代xml文件中所有节点(包含子节点,以及子节点的子节点),返回一个包含所有节点的迭代器
  2. Element.find(tag) #查找第一个节点为tag的直接子元素,返回一个节点对象
  3. Element.findall(tag) #查找节点为tag的所有直接子元素’,返回一个节点列表
    #直接子元素的意思:只会查找当前节点的子节点那一级目录

封装了一下,便于管理。不过实际使用中用处不是很大

已经封装到一个类里了,便于以后使用或拓展:
这个类里的方法,节点对象都是基于根节点,在实际使用中,都是直接使用上面三个方法。

import xml.etree.ElementTree as ET

class GetXML:
	'提供读取XML文件和读取值得一些方法'
	def __init__(self):
		pass

	def Read(self,xmlfilename):
		'将XML文件解析为树,并且得到根节点'
		tree = ET.ElementTree(file=xmlfilename)
		self.root = tree.getroot()
		return self.root

	def Iter(self):
		'递归迭代xml文件中所有节点(包含子节点,以及子节点的子节点)'
		return self.root.iter()

	def FindAll(self,tag):
		'查找节点为tag的所有直接子元素'
		#直接子元素的意思:只会查找当前节点的子节点那一级目录
		return self.root.findall(tag)

	def Find(self,tag):
		'查找第一个节点为tag的直接子元素'
		return self.root.find(tag)

实际使用下

Element.find(tag)的应用:
在这里插入图片描述
Element.findall(tag)的应用:
在这里插入图片描述
Elementt.iter()的应用:
在这里插入图片描述
以上,就是节点对象提供获取元素的三个方法的使用过程。

最后,实现一个小需求

需求:判断country.xml文件中是否有userName,passWord这样的配置,如果有,进行一定处理,没有则不处理。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值