xml.etree.ElementTree 处理 XML 格式数据

 ElementTree生来就是为了处理XML, 它在Python标准库中有两种实现:一种是纯Python实现的, 如xml.etree.ElementTree, 另一种是速度快一点的xml.etree.cElementTree. 注意:尽量使用C语言实现的那种, 因为它速度更快, 而且消耗的内存更少.

  a. 遍历根节点的下一层   
  b. 下标访问各个标签、属性、文本
  c. 查找root下的指定标签
  d. 遍历XML文件
  e. 修改XML文件

导入包

1
2
3
4
try:
import xml.etree.cElementTree as ET
except:
import xml.etree.ElementTree as ET

解析 xml 文件

1
2
3
4
5
6
7
8
xmlFilePath = os.path.abspath('test.xml')

try:
tree = ET.parse(xmlFilePath) # 或者 tree = ET.ElementTree(xmlFilePath)
root = tree.getroot() # 获取根节点
except Exception as e:
print('parse xml failed!')
sys.exit()

逐层遍历

1
2
3
4
5
6
7
8
9
10
11
12
print(root.tag, root.attrib, root.text)
for child in root:
print(child.tag, child.attrib, child.text)

# 递归遍历全部:
def traverseXml(element):
if len(element) > 0: # 叶节点的len为0
for child in element:
print(child.tag, child.attrib)
traverseXml(child)

traverseXml(root)

根据签名查找需要的标签

1
2
item_lists = root.findall('item') # 只能找到儿子, 不能找到孙子, 返回的是儿子们组成的列表
item = root.find('item') # 返回的是单个的儿子

获取叶子节点的值

当访问到叶子节点时, 就可以利用 text 来得到相应的标签了

1
2
3
4
5
6
7
8
9
10
obj_bbox_set
objects = root.findall('object')
for obj in objects:
obj_name = obj.find('name').text
bbox = obj.find('bndbox')
x1 = int(bbox.find('xmin').text)
y1 = int(bbox.find('ymin').text)
x2 = int(bbox.find('xmax').text)
y2 = int(bbox.find('ymax').text)
obj_bbox_set.append([x1, x2, y1, y2, obj_name])

创建 XML 类型的数据文件

先创建 root Element, 然后创建 SubElement, 最后将 root 传入 ElementTree(element), 创建 tree, 调用 tree.write() 方法写入文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

import xml.etree.ElementTree as ET


def subElement(root, tag, text):
ele = ET.SubElement(root, tag)
ele.text = text
ele.tail = '\n'


root = ET.Element("note")

to = root.makeelement("to", {})
to.text = "peter"
to.tail = '\n'
root.append(to)

subElement(root, "from", "marry")
subElement(root, "heading", "Reminder")
subElement(root, "body", "Don't forget the meeting!")

tree = ET.ElementTree(root)
tree.write("note.xml", encoding="utf-8", xml_declaration=True)

效果:

1
2
3
4
5
6
<?xml version='1.0' encoding='utf-8'?>
<note><to>peter</to>
<from>marry</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>