使用Python修改XML
- 加载元素树模块
- 打开XML文档并解析为树
- 查找节点
-
- 使用`Element.iter()`查找
- 使用`Element.findall()`查找
- 修改节点
- 保存XML
加载元素树模块
Python标准库中,提供了元素树的两种实现。一个是纯Python实现的xml.etree.ElementTree
,另一个是速度更快的C语言实现xml.etree.cElementTree
。
因为C语言实现的元素树,它的速度要快很多,而且内存消耗也要少很多。所以在加载模块时先尝试去载入C语言实现的,没有再去用Python实现的元素树。
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
- 1
- 2
- 3
- 4
打开XML文档并解析为树
调用parse()
方法,返回解析树。调用树的方法getroot()
可以获取树的根节点。
tree = ET.parse("kun.xml") # 将xml解析为树
root = tree.getroot() # 获取根节点
- 1
- 2
查找节点
xml示例:
<?xml version="1.0" encoding="UTF-8"?>
<kun>
<students>
<student>
<name>张三</name>
<age>18</age>
<score>89</score>
</student>
<student>
<name>李四</name>
<age>19</age>
<score>81</score>
</student>
<student>
<name>王五</name>
<age>17</age>
<score>92</score>
</student>
</students>
</kun>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
使用Element.iter()
查找
Element.iter()
会将节点中的子节点和孙节点都遍历一遍。
for student in root.iter('student'):
print student[0].text # 打印名字
- 1
- 2
输出结果:
张三
李四
王五
- 1
- 2
- 3
使用Element.findall()
查找
Element.findall()
只会将节点中的子节点遍历一遍,不会查找孙节点。查找孙节点时可以使用下列方法:
students = root.find('students')
for element in students.findall('student'):
name = element.find('name').text
print name
- 1
- 2
- 3
- 4
输出结果:
张三
李四
王五
- 1
- 2
- 3
修改节点
通过一下函数进行修改:
方法 | 功能 |
---|---|
Element.text = ‘’ | 直接改变字段内容 |
Element.append(Element) | 为当前的Elment对象添加子对象 |
Element.remove(Element) | 删除Element节点 |
Element.set(key, value) | 添加和修改属性 |
ElementTree.Element() | 构建一个节点 |
ElementTree.SubElement(Element,tag) | 构建一个子节点 |
保存XML
调用树的方法write()
保存更新XML文件:
# 以UTF-8的格式保存
tree.write('kun.xml', 'UTF-8')
- 1
- 2
更多详细用法请查看官方资料:https://docs.python.org/zh-cn/3/library/xml.etree.elementtree.html