1. 背景
在目标检测任务中,自己有这样的需求:对于已经标注好的PascalVOC格式数据标签,想批量去掉标签中的某个分类;或者有时候想对xml标签中的某项内容进行编辑或者删除。这个该如何用python代码操作呢?自己主要使用xml.etree.ElementTree这个库来实现。
2. 实现
在Python中,xml.etree.ElementTree
是一个简单而有效的库,用于解析和创建XML数据。虽然 ElementTree
的API主要用于读取和写入XML文件,但它也支持一定程度的修改功能,如添加、删除或修改XML元素和属性。以下是如何使用 xml.etree.ElementTree
来修改XML标签文件的基本步骤:
(1)解析XML文件
首先,你需要使用 ElementTree
来解析XML文件,获取一个元素树(ElementTree)对象,然后可以遍历或修改这个树。
python
import xml.etree.ElementTree as ET
# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()
(2)修改XML元素
- 修改元素标签
直接修改元素的标签名并不直接支持,但你可以通过创建一个新元素并替换旧元素来实现。
python
# 假设我们要修改第一个<oldtag>为<newtag>
for elem in root.findall('.//oldtag'):
new_elem = ET.Element('newtag')
new_elem.attrib.update(elem.attrib) # 复制属性
for child in elem:
new_elem.append(child) # 复制子元素
elem.getparent().replace(elem, new_elem) # 替换元素
- 修改元素文本
python
# 修改第一个<tag>元素的文本
for elem in root.findall('.//tag'):
elem.text = '新的文本内容'
break # 如果只修改第一个,则退出循环
- 修改元素属性
python
# 修改第一个<tag>元素的某个属性
for elem in root.findall('.//tag'):
elem.set('attribute_name', '新的属性值')
break # 如果只修改第一个,则退出循环
- 添加新元素
python
# 在根元素下添加一个新元素
new_element = ET.SubElement(root, 'newtag')
new_element.text = '新元素的内容'
- 删除元素
python
# 删除database, annotation元素
root.remove(root.find('database'))
root.remove(root.find('annotation'))
- 写入到文件
完成修改后,你需要将修改后的树写回到文件中。
python
# 将修改后的树写回到文件
tree.write('modified_example.xml', encoding='utf-8', xml_declaration=True)
这就是使用 xml.etree.ElementTree
来修改XML文件的基本方法。注意,在进行任何修改之前,确保已经备份了原始XML文件,以防修改不符合预期。