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())
输出应该是您要查找的内容。
我有一个这样的 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())
输出应该是您要查找的内容。