python操作XML格式文件
- python操作XML格式文件
- 1. 读取文件和内容
- 2.读取节点数据
- 3.修改和删除节点
- 4.构建文档
python操作XML格式文件
可扩展标记语言,是一种简单的数据存储语言,XML被设计用来传输和存储数据
- 存储,可用来存放配置文件,例:java配置文件
- 传输,网络传输以这种格式存在,例:早期ajax传输数据等
<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="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>
1. 读取文件和内容
#导包
from xml.etree import ElementTree as ET
# ET去打开xml文件
tree = ET.parse("files/xo.xml")
# 获取根标签
root = tree.getroot()
print(root) # <Element 'data' at 0x7f94e02763b0>
2.读取节点数据
- 获取根标签
root = ET.XML(content)
- 查找节点【默认找第一个】 find()
country_object = root.find("country")
print(country_object) #<Element 'country' at 0x0000020D57DFB220>
- 获取节点标签 tag
country_object.tag #country
- 获取节点属性 attrib
country_object.attrib #{'name': 'Liechtenstein'}
- 获取节点文本 text
gdppc_object.text #141100
- 循环节点
# 获取data标签的孩子标签
for child in root:
print(child.tag, child.attrib)
#获取child标签的孩子标签
for node in child:
print(node.tag, node.attrib, node.text)
- 查找所有标签 iter()
# 获取data里面所有year标签
for child in root.iter('year'):
print(child.tag, child.text)
- 查找所有标签 findall()
# 查找所有的country标签
v1 = root.findall('country')
- 查找标签
# 查找country里面的rank标签,找第一个
v2 = root.find('country').find('rank')
3.修改和删除节点
【修改和删除内容只在内存中修改,没有存到文件中,都要重新保存文件】
- 修改节点内容
#修改rank文本
rank.text = "999"
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
- 修改节点属性
#修改rank属性
rank.set('update', '2020-11-11')
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
- 保存文件
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
- 删除节点
root.remove( root.find('country') )
tree = ET.ElementTree(root)
tree.write("new.xml", encoding='utf-8')
4.构建文档
- 方式一ET.Element()
<home>
<son name="儿1">
<grandson name="儿11"></grandson>
<grandson name="儿12"></grandson>
</son>
<son name="儿2"></son>
</home>
from xml.etree import ElementTree as ET
#创建根标签
root=ET.Element('home')
# 创建大儿子,与root还没有关系
son1=ET.Element('son',{'name':'儿1'})
#创建小儿子,与root还没有关系
son2=ET.Element('son',{'name':'儿2'})
#创建2个孙子
grandson1=ET.Element('grandson',{'name':'儿11'})
grandson2=ET.Element('grandson',{'name':'儿12'})
# 创建两个孙子,与son1还没有关系
son1.append(grandson1)
son1.append(grandson2)
# 把儿子添加到根节点
root.append(son1)
root.append(son2)
#root节点放到根节点中
tree=ET.ElementTree(root)
#保存xml文件
# short_empty_elements=True,节点中没有元素,用简写方式显示例:<grandson name="儿11" />
tree.write('file/root.xml',encoding='utf-8',short_empty_elements=True)
- 方式二 标签.makeelement()
<famliy>
<son name="儿1">
<grandson name="儿11"></grandson>
<grandson name="儿12"></grandson>
</son>
<son name="儿2"></son>
</famliy>
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("famliy")
# 创建大儿子,与root还没有关系
son1 = root.makeelement('son', {'name': '儿1'})
#创建小儿子,与root还没有关系
son2 = root.makeelement('son', {"name": '儿2'})
# 创建两个孙子,与son1还没有关系
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')
- 方式三 标签.SubElement(),创建标签的子标签
<famliy>
<son name="儿1">
<age name="儿11">孙子</age>
</son>
<son name="儿2"></son>
</famliy>
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"})
# 在大儿子中创建一个孙子
grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
grandson1.text = '孙子'
et = ET.ElementTree(root) #生成文档对象
et.write("test.xml", encoding="utf-8")
- 方式四
<user><![CDATA[你好呀]]</user>
from xml.etree import ElementTree as ET
# 创建根节点
root = ET.Element("user")
#<![CDATA[你好呀]]直接添加到文本里
root.text = "<![CDATA[你好呀]]"
et = ET.ElementTree(root) # 生成文档对象
et.write("test.xml", encoding="utf-8")