2-1-04 文件操作 - XML 格式文件
模块使用
# 使用XML模块操作
#基于xml形代指式使用这个模块,用ET来代指ElementTree
from xml.etree import ElementTree as ET
XML格式文件
1. 定义
可扩展标记语言,是一种简单的数据存储语言,XML 被设计用来传输和存储数据。
- 存储,可用来存放配置文件,例如:java的配置文件。
- 传输,网络传输时以这种格式存在,例如:早期ajax传输的数据、soap协议等。
<data> #开始
<country name="Liechtenstein"> # name="Liechtenstein" 属性
<rank updated="yes">2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2026</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data> # 结尾
注意:在Python开发中用的相对来比较少,大家作为了解即可(后期课程在讲解微信支付、微信公众号消息处理 时会用到基于xml传输数据)。
例如:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
2. 使用方法
2.1 读取文件和内容
2.1.1 通过xml文件读取
#基于xml形代指式使用这个模块,用ET来代指ElementTree
from xml.etree import ElementTree as ET
# 1.直接读取xml文件
# ET去打开xml文件
tree = ET.parse("file/xo.xml")# 获取根标签
root = tree.getroot()
print(root) #<Element 'data' at 0x000002E365722BD0> data就是根标签
2.1.2 通过文本或者网络请求获取xml格式
from xml.etree import ElementTree as ET
content = """
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
"""
root = ET.XML(content) # 以字符串形式获取
print(root) # <Element 'data' at 0x7fdaa019cea0>
2.2 读取节点数据
2.2.0 开头
from xml.etree import ElementTree as ET
content = """
<data>
<country name="Liechtenstein">
<rank>2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Panama">
<rank>69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
"""
2.2.1 获取某一个标签属性等
root = ET.XML(content)
country_object = root.find("country") # 这个是找到第一个country标签
print(country_object.tag, country_object.attrib) #country {'name': 'Liechtenstein', 'id': '999'}
#在country下面找标签
gdppc_object = country_object.find("gdppc")
# print(gdppc_object.tag,gdppc_object.attrib) #gdppc {}
print(gdppc_object.tag,gdppc_object.attrib,gdppc_object.text) # gdppc {} 141100 gdppc_object.text 这个是没有属性获取中间的值
2.2.2 获取所有的信息
# 获取根标签 data
root = ET.XML(content)
# 获取data标签的孩子标签
for child in root:
# 第一次循环
# child.tag = conntry child.tag表示获取标签的名字
# child.attrib = {"name":"Liechtenstein"} child.attrib表示字典,会把标签的属性放入
# 第二次循环
# child.tag = conntry child.tag表示获取标签的名字
# child.attrib = {"name":"Panama"} child.attrib表示字典,会把标签的属性放入
print(child.tag, child.attrib)
# 获取conntry中间的内容,用node.text获取
for node in child:
print(node.tag, node.attrib, node.text
root = ET.XML(content)
for child in root.iter('year'): # iter :在所有的里面找year标签
print(child.tag, child.text)
>>> 输出
year 2023
year 2026
#findall是找到所有的标签
root = ET.XML(content)
v1 = root.findall('country')
print(v1)
#输出:[<Element 'country' at 0x000001DABCC07040>, <Element 'country' at 0x000001DABCC07220>]
# find 是找到第一个标签
v2 = root.find('country').find('rank') # 找country里面的 rank 标签的值
print(v2.text)
2.3 修改和删除节点
2.3.1 抬头
from xml.etree import ElementTree as ET
content = """
<data>
<country name="Liechtenstein">
<rank>2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Panama">
<rank>69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
"""
2.3.2 修改节点内容和属性
# 修改节点内容和属性
rank = root.find('country').find('rank')
print(rank.text) #获取rank中间的内容
rank.text = "999" #修改rank的内容
rank.set('update', '2020-11-11') #在rank中增加属性update="2020-11-11
"
print(rank.text, rank.attrib)
############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
注意:xml中的内容必须是字符串类型,不能是整型
![[assets/Pasted image 20221015123939.png]]
2.3.2 删除节点
root = ET.XML(content)
# 删除节点
root.remove( root.find('country') )
print(root.findall('country'))
############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("newnew.xml", encoding='utf-8')
2.4 构建文档
方式一
from xml.etree import ElementTree as ET
# 创建根标签
root = ET.Element("home")
#<home>
#</home>
# 创建节点大儿子
son1 = ET.Element('son', {'name': '儿1'})
#<son name="儿1"></son>
# 创建小儿子
son2 = ET.Element('son', {"name": '儿2'})
#<son name="儿2"></son>
# 在大儿子中创建两个孙子
grandson1 = ET.Element('grandson', {'name': '儿11'})
#<grandson name="儿11"></son>
grandson2 = ET.Element('grandson', {'name': '儿12'})
#<grandson name="儿12"></son>
son1.append(grandson1) #将 grandson1 的标签加入到 son1 中
son1.append(grandson2) #将 grandson2 的标签加入到 son1 中
# 把儿子添加到根节点中
root.append(son1) #将 son1 的标签加入到 root 中
root.append(son2) #将 son2 的标签加入到 root 中
#将文档写入到oooo.xml文件中
tree = ET.ElementTree(root)
tree.write('oooo.xml', encoding='utf-8', short_empty_elements=False)
# short_empty_elements=False 表示是否使用短标签?False表示不使用 True表示使用
>>> 输出
<home>
<son name="儿1">
<grandson name="儿11"></grandson>
<grandson name="儿12"></grandson>
</son>
<son name="儿2"></son>
</home>
![[assets/Pasted image 20221015124036.png]]
![[assets/Pasted image 20221015124043.png]]
方式二
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("famliy")
# 创建大儿子
son1 = root.makeelement('son', {'name': '儿1'})
# 创建小儿子
son2 = root.makeelement('son', {"name": '儿2'})
# 在大儿子中创建两个孙子
grandson1 = son1.makeelement('grandson', {'name': '儿11'})
grandson2 = son1.makeelement('grandson', {'name': '儿12'})
son1.append(grandson1)
son1.append(grandson2)
# 把儿子添加到根节点中
root.append(son1)
root.append(son2)
tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8')
方式3
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("famliy")
# 创建节点大儿子,直接放入root里面
son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})
# 创建小儿子,直接放入root里面
son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})
# 在大儿子中创建一个孙子,直接放入son1里面
grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
grandson1.text = '孙子'
et = ET.ElementTree(root) #生成文档对象
et.write("test.xml", encoding="utf-8")
升级版
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("user")
root.text = "<![CDATA[你好呀]]"
et = ET.ElementTree(root) # 生成文档对象
et.write("test.xml", encoding="utf-8")
>>> 输出
<user><![CDATA[你好呀]]</user>
案例:
content = """<xml>
<ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>
<FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>
<CreateTime>1395658920</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>
<MsgID>200163836</MsgID>
<Status><![CDATA[success]]></Status>
</xml>"""
#结果转换成字典
from xml.etree import ElementTree as ET
info = {}
root = ET.XML(content)
for node in root:
# print(node.tag,node.text)
info[node.tag] = node.text
print(info)