Добавление тега в XML с помощью Python - PullRequest
0 голосов
/ 20 марта 2019
 98 def add_field(xml):
 99     fields = """
100     <fields>
101         <field>
102             <column/>
103             <description/>
104             <datatype/>
105             <length/>
106         </field>
107         <field>
108             <column/>
109             <description/>
110             <datatype/>
111             <length/>
112         </field>
113     </fields>
114     """
115     #Insert new field into <fields>
116     root = ET.fromstring(fields)
117     new_field = ET.Element("field")
118     field_col = ET.SubElement(new_field, "column")
119     field_des = ET.SubElement(new_field, "description")
120     field_data = ET.SubElement(new_field, "datatype")
121     field_length = ET.SubElement(new_field, "length")
122     root.insert(0, new_field)

Я пытаюсь добавить новый элемент в существующий документ XML. По умолчанию написано два, но я хочу добавить третий динамически. Приведенный выше код не дает никаких ошибок, но в моем XML-документе ничего не меняется.

Как мне вставить новый элемент в документ XML?

Конечный результат, который я ищу:

<fields>
    <field>
        <column />
        <description />
        <datatype />
        <length />
    </field>
    <field>
        <column />
        <description />
        <datatype />
        <length />
    </field>
   <field><column /><description /><datatype /><length /></field>
</fields>

1 Ответ

0 голосов
/ 20 марта 2019

root содержит ваши изменения, вы можете просмотреть их, используя вызов ElementTree dump().Так как мы знаем, что root содержит ваши изменения, вам нужно будет сохранить root, преобразовав его в ElementTree и вызвав на нем write():

import xml.etree.ElementTree as ET

fields = """
<fields>
    <field>
        <column/>
        <description/>
        <datatype/>
        <length/>
    </field>
    <field>
        <column/>
        <description/>
        <datatype/>
        <length/>
    </field>
</fields>
"""
#Insert new field into <fields>
root = ET.fromstring(fields)
new_field = ET.Element("field")
field_col = ET.SubElement(new_field, "column")
field_des = ET.SubElement(new_field, "description")
field_data = ET.SubElement(new_field, "datatype")
field_length = ET.SubElement(new_field, "length")
root.insert(0, new_field)

ET.dump(root)
tree = ET.ElementTree(root)
tree.write(open('test.xml','w'), encoding='unicode')

Распечатает и произведетфайл test.xml с тем же содержанием:

<fields>
    <field><column /><description /><datatype /><length /></field><field>
        <column />
        <description />
        <datatype />
        <length />
    </field>
    <field>
        <column />
        <description />
        <datatype />
        <length />
    </field>
</fields>

Отредактировано в соответствии с отредактированным вопросом: пожалуйста, прекратите редактировать свой вопрос, чтобы он отличался от исходного.

В любом случае, insert() берет индекс, в котором вы хотите разместить новый элемент, так как вы хотите, чтобы ваш новый элемент находился в третьем слоте (2-й индекс, поскольку индекс начинается с 0), просто передайте его 2 вместо0:

root.insert(2, new_field)

Который будет производить:

<fields>
    <field>
        <column />
        <description />
        <datatype />
        <length />
    </field>
    <field>
        <column />
        <description />
        <datatype />
        <length />
    </field>
<field><column /><description /><datatype /><length /></field></fields>
...