通过 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
。
使用下面的代码,我可以成功地在我想要的地方添加一个子元素,并且在功能上它可以工作。为了可读性,我想格式化 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
:
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
。