把多个xmL文件内容写入到另一个文件xml中
"""
把多个xmL文件写入到一个文件xml中
"""
import os
import xml.etree.ElementTree as ET
# 加空格解决排版问题
def indent(elem, level=0):
i = "\n" + level * " "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level + 1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
def handle_xml(image_name, src_path):
# 判断是否有根节点
try:
tree = ET.parse("pre_knowledge.xml")
root = tree.getroot() # 数据内存地址
# print(root.tag) # 标签
except:
# 创建根节点
root = ET.Element("root")
# print(root)
annotation = ET.SubElement(root, "annotation")
deviceid = ET.SubElement(annotation, "deviceid") # SubElement 子节点
list01 = image_name.split("_")
name_text = list01[1] + '_' + list01[2]
deviceid.text = name_text
# 写入元素节点
# 读取文件,然后依次遍历每个文件下xml的size标签属性和object标签属性
# print(os.path.join(src_path,image_name))
target_dom = ET.parse(os.path.join(src_path, image_name))
target_root = target_dom.getroot() # 数据内存地址
# print(target_dom)
# 创建子节点
size = ET.SubElement(deviceid, "size") # SubElement 子节点
for ta in target_root.iter("size"):
for i in ta:
i_tag = ET.SubElement(size, i.tag) # SubElement 子节点
i_tag.text = i.text
for i in target_root.iter('object'):
object = ET.SubElement(deviceid, "object")
for j in i:
if j.tag == 'name':
j_tag = ET.SubElement(object, j.tag) # SubElement 子节点
j_tag.text = j.text
print(j.tag, j.text)
if j.tag == 'bndbox':
j_tag = ET.SubElement(object, j.tag) # SubElement 子节点
for m in j:
m_tag = ET.SubElement(j_tag, m.tag) # SubElement 子节点
m_tag.text = m.text
# 保存
indent(root)
et = ET.ElementTree(root) # 生成文档对象
et.write("pre_knowledge01.xml", encoding="utf-8", xml_declaration=True)
# 显示结果
# ET.dump(root)
if __name__ == "__main__":
src_path = 'D:/picture/error_fencuo/xml/'
f = open('pre_knowledge.xml', 'a', encoding='utf-8')
for path, dirs, files in os.walk(src_path):
for file_name in files:
print(file_name)
if not file_name.endswith('.xml'):
continue
handle_xml(file_name, src_path)
f.close()