通过 ElementTree 添加和格式化新的 SubElement

Appending and formatting a new SubElement via ElementTree

使用下面的代码,我可以成功地在我想要的地方添加一个子元素,并且在功能上它可以工作。为了可读性,我想格式化 item.append 插入新子元素的方式。 我的代码:

import xml.etree.ElementTree as ET

tree = ET.parse(file.xml)
root = tree.getroot()

for items in root.iter('items'):
    item = ET.SubElement(items, 'item')
    item.append((ET.fromstring('<item>cat</item>')))    

tree.write('output.xml')

XML 文件:

<interface>
    <object>
        <items>
            <item>dog</Item>
        </items>
    </object>
</interface>

预期输出:

<interface>
    <object>
        <items>
            <item>dog</item>
            <item>cat</item>
        </items>
    </object>
</interface>

实际输出:

<interface>
    <object>
        <items>
            <item>dog</item>
            <item><item>cat</item></item></items>
    </object>
</interface>

通常我不会关心它是如何格式化output.xml文件的。但是,我将在 while 循环中添加 <item> 子元素,因此当我有 4 或 5 个添加时,为了可读性,代码会变得有点草率。

我已经查看了很多与此相关的类似问题,但它们要么没有得到解答,要么不适用于我正在尝试做的事情。

这是我在 while 循环中的代码,以防它会添加更多说明:

import xml.etree.ElementTree as ET

tree = ET.parse(file.xml)
root = tree.getroot()

while True:

    item_add = input("Enter item to add: 'n")
    item_string = '<item>'
    item_string += item_add
    item_string += '</item>'

    for items in root.iter('items'):
        item = ET.SubElement(items, 'item')
        item.append((ET.fromstring(item_string)))   

tree.write('output.xml')

#Code asking for more input, if none break out of loop

在此先感谢您的帮助。

考虑使用 .find() 走到你需要的节点,然后简单地使用 SubElement 来添加。使用 etree:

等 DOM 库时,不需要字符串版本的标记
import xml.etree.ElementTree as ET

tree = ET.parse("input.xml")
root = tree.getroot()

while True:
    item_add = input("Enter item to add: ")

    if item_add == 'x':
        break

    items = root.find('object').find('items')
    tmp = ET.SubElement(items, 'item')
    tmp.text = item_add

# PRINT TO SCREEN
print(ET.tostring(root).decode('utf-8'))

# SAVE TO FILE
tree.write('output.xml')

Output (inputs中输入cat,frog,zebra后,用x结束循环)

<interface>
    <object>
        <items>
            <item>dog</item>
        <item>cat</item><item>frog</item><item>zebra</item></items>
    </object>
</interface>

pretty printing 使用内置 mini.dom 或第三方 lxml