使用以下代码,我可以成功地在我想要的地方添加一个子元素,并且功能上它可以正常工作。为了便于阅读,我想格式化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
我提前感谢任何帮助。
答案 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
。