簡體   English   中英

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>

我需要添加另一個“對象”字段,類似於已經存在的字段。 我將各種值保存在變量中(所以,'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM