[英]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>
我需要添加另一個“對象”字段,類似於已經存在的字段。 我將各種值保存在變量中(所以,'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())
output 應該是您正在尋找的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.