VOC数据集的标注文件都是xml格式,最近需要频繁处理xml文件的读取和更新,整理下python处理xml文件的方法。

  XML 指可扩展标记语言(eXtensible Markup Language), 被设计用来传输和存储数据。python中有三个模块解析xml文件:DOM, ElementTree,SAX

1. DOM(Document Object Model)

  DOM是个跨平台的标准模型,W3C定义了DOM模型里的概念。DOM将XML数据在内存中解析成一个树,通过对树的操作来操作XML。python的xml.dom.minimom模块实现了DOM

1.1 DOM写入xml文件

       DOM写入xml文件主要是创建dom树,然后创建根结点,创建子节点并加入到根节点,最后将整个dom树写入文件,相关API如下:

DOM写入相关API

doc = minidom.Document()  #创建树
doc.createElement("folder")  #创建名为folder的结点
doc.createTextNode('user')   #创建文本结点,文本为 user
root_node.appendChild(folder_node) #root_node结点添加folder_node为子节点

book_node.setAttribute('price','199') #book_node设置属性值
# 每一个结点对象(包括dom对象本身)都有输出XML内容的方法,如:toxml()--字符串, toprettyxml()--美化树形格式。 doc.toxml(encoding="utf-8") # 输出字符串 doc.toprettyxml(indent='', addindent='\t', newl='\n', encoding="utf-8")) #输出带格式的字符串 doc.writexml() #将prettyxml字符串写入文件

 下面为写入一个VOC标注文件示例代码

python读取,写入和更新xml文件
def write_xml():
    #1. 创建dom树对象
    doc = minidom.Document()

    #2. 创建根结点,并用dom对象添加根结点
    root_node = doc.createElement("annotation")
    doc.appendChild(root_node)

    #3. 创建结点,结点包含一个文本结点, 再将结点加入到根结点
    folder_node = doc.createElement("folder")
    folder_value = doc.createTextNode('user')
    folder_node.appendChild(folder_value)
    root_node.appendChild(folder_node)

    filename_node = doc.createElement("filename")
    filename_value = doc.createTextNode('0000001.jpg')
    filename_node.appendChild(filename_value)
    root_node.appendChild(filename_node)

    path_node = doc.createElement("path")
    path_value = doc.createTextNode('/home')
    path_node.appendChild(path_value)
    root_node.appendChild(path_node)

    source_node = doc.createElement("source")
    database_node = doc.createElement("database")
    database_node.appendChild(doc.createTextNode("Unknown"))
    source_node.appendChild(database_node)
    root_node.appendChild(source_node)

    size_node = doc.createElement("size")
    for item, value in zip(["width", "height", "depth"], [1920, 1080, 3]):
        elem = doc.createElement(item)
        elem.appendChild(doc.createTextNode(str(value)))
        size_node.appendChild(elem)
    root_node.appendChild(size_node)

    seg_node = doc.createElement("segmented")
    seg_node.appendChild(doc.createTextNode(str(0)))
    root_node.appendChild(seg_node)

    obj_node = doc.createElement("object")
    name_node = doc.createElement("name")
    name_node.appendChild(doc.createTextNode("boat"))
    obj_node.appendChild(name_node)

    pose_node = doc.createElement("pose")
    pose_node.appendChild(doc.createTextNode("Unspecified"))
    obj_node.appendChild(pose_node)

    trun_node = doc.createElement("truncated")
    trun_node.appendChild(doc.createTextNode(str(1)))
    obj_node.appendChild(trun_node)

    trun_node = doc.createElement("difficult")
    trun_node.appendChild(doc.createTextNode(str(0)))
    obj_node.appendChild(trun_node)

    bndbox_node = doc.createElement("bndbox")
    for item, value in zip(["xmin", "ymin", "xmax", "ymax"], [103, 1, 634, 402]):
        elem = doc.createElement(item)
        elem.appendChild(doc.createTextNode(str(value)))
        bndbox_node.appendChild(elem)
    obj_node.appendChild(bndbox_node)
    root_node.appendChild(obj_node)


    with open("0000001.xml", "w", encoding="utf-8") as f:
        # 4.writexml()第一个参数是目标文件对象,第二个参数是根节点的缩进格式,第三个参数是其他子节点的缩进格式,
        # 第四个参数制定了换行格式,第五个参数制定了xml内容的编码。
        doc.writexml(f, indent='', addindent='\t', newl='\n', encoding="utf-8")

    # 每一个结点对象(包括dom对象本身)都有输出XML内容的方法,如:toxml()--字符串, toprettyxml()--美化树形格式。
    # print(doc.toxml(encoding="utf-8"))  # 输出字符串
    # print(doc.toprettyxml(indent='', addindent='\t', newl='\n', encoding="utf-8"))   #输出带格式的字符串
    # doc.writexml() #将prettyxml字符串写入文件
写入xml文件

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-05
  • 2022-12-23
  • 2022-01-31
猜你喜欢
  • 2021-07-21
  • 2022-12-23
  • 2022-12-23
  • 2021-06-16
  • 2021-05-20
  • 2021-12-12
相关资源
相似解决方案