Python,将嵌套元素添加到 xml 文件

Python, add nested elements to xml file

我有一个这样的 xml 文件:

<annotation>
    <folder>my-project-name</folder>
    <filename>red_noisy_snake_0000.png</filename>
    <object>
        <name>red_noisy_snake</name>
        <pose>Unspecified</pose>
        <truncated>Unspecified</truncated>
        <difficult>Unspecified</difficult>
        <bndbox>
            <xmin>618</xmin>
            <ymin>774</ymin>
            <xmax>1037</xmax>
            <ymax>858</ymax>
        </bndbox>
    </object>
</annotation>

而且我需要添加另一个 'object' 字段,类似于已经存在的字段。 我将各种值保存在变量中(因此,'name'、'pose'、'truncated'、'bndbox'...中的值),我只需要将它添加到原始的 xml 文件,所以最后我应该得到这样的东西:

<annotation>
    <folder>red_noisy_snake</folder>   --> CHANGED VALUE
    <filename>red_noisy_snake_0000.png</filename>
    <object>
        <name>red_noisy_snake</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>618</xmin>
            <ymin>774</ymin>
            <xmax>1037</xmax>
            <ymax>858</ymax>
        </bndbox>
    </object>
    <object>  --> ADDED OBJECT FIELD
        <name>child_seat</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>871</xmin>
            <ymin>25</ymin>
            <xmax>1190</xmax>
            <ymax>566</ymax>
        </bndbox>
    </object>
</annotation>

我知道如何添加单个非嵌套元素,例如:

import xml.etree.ElementTree as ET

in_file = 'wrong.xml'

tree = ET.parse(in_file)
root = tree.getroot()

## add single field
add = ET.Element("tag_name")
add.tail = '\n\t'
add.text = 'content'
root.insert(5,add)
ET.dump(root)

但我不知道如何正确创建我需要的嵌套结构。

公平警告:不是每个人都喜欢这种方法 - 并且更喜欢手动构建元素 - 但是当涉及到冗长的嵌套节点结构时,我更喜欢使用这种类似模板的方法。

#this assumes all your new variables are located in one list; if not - you'll have to modify
inserts = ["child_seat","Unspecified", 0, 0, 871, 25, 1190, 566]

new_el = f"\n<object>\n        \
<name>{inserts[0]}</name>\n        <pose>{inserts[1]}</pose>\n <truncated>{inserts[2]}</truncated>\n      \
<difficult>{inserts[3]}</difficult>\n        <bndbox>\n            <xmin>{inserts[4]}</xmin>\n           \
<ymin>{inserts[5]}</ymin>\n            <xmax>{inserts[6]}</xmax>\n    \
<ymax>{inserts[7]}</ymax>\n        </bndbox>\n </object>\n"

add = ET.fromstring(new_el)
root.insert(3,add)
print(ET.tostring(root).decode())

输出应该是您要查找的内容。