通过ElementTree

时间:2017-11-01 15:50:44

标签: python xml python-3.x 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文件。但是,我将在<item>循环中添加while个子元素,所以当我有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

我提前感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

考虑使用.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')

输出 (在输入中输入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