python - Python 使用 ElementTree 在一个 xml 文件中写入多个 xml 结构
问题描述
我正在尝试用 ElementTree 编写一个 xml 文件。GeeksforGeeks 有一个很棒的教程。我面临的问题是我想在同一个 xml 文件中编写多个 xml 结构。
在教程中创建的 xml 文件如下:
电流输出
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
我想用循环创建如下:
期望的输出
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
我尝试使用循环函数并且循环正在工作,但写入 xml 文件不起作用。我的代码看起来像这样。
代码
import xml.etree.ElementTree as ET
test = [1,2,3]
l = []
for i in test:
data = ET.Element('chess')
element1 = ET.SubElement(data, 'Opening')
s_elem1 = ET.SubElement(element1, 'E4')
s_elem2 = ET.SubElement(element1, 'D4')
s_elem1.set('type', 'Accepted')
s_elem2.set('type', 'Declined')
s_elem1.text = "King's Gambit Accepted"
s_elem2.text = "Queen's Gambit Declined"
b_xml = ET.tostring(data)
l.append(b_xml)
output = bytearray(l)
with open("output.xml", "wb") as f:
f.write(l)
错误信息
TypeError: an integer is required
有没有办法在一个 xml 文件中创建多个结构并将其写入输出文件?
解决方案
您需要在 XML 中至少有一个根元素,才能将子元素附加到:
from lxml import etree
test = [1, 2, 3]
l = []
xmlRoot = etree.Element('root')
for i in test:
data = etree.SubElement(xmlRoot, 'chess')
element1 = etree.SubElement(data, 'Opening')
s_elem1 = etree.SubElement(element1, 'E4')
s_elem2 = etree.SubElement(element1, 'D4')
s_elem1.set('type', 'Accepted')
s_elem2.set('type', 'Declined')
s_elem1.text = "King's Gambit Accepted"
s_elem2.text = "Queen's Gambit Declined"
doc = etree.ElementTree(xmlRoot) # convert into elementtree and write it directly into a file
with open("output.xml", "wb") as f:
f.write(
etree.tostring(
doc, pretty_print=True, xml_declaration=True, encoding='utf-8'
)
)
print(open("output.xml").read())
出去:
<?xml version='1.0' encoding='utf-8'?>
<root>
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
<chess>
<Opening>
<E4 type="Accepted">King's Gambit Accepted</E4>
<D4 type="Declined">Queen's Gambit Declined</D4>
</Opening>
</chess>
</root>
推荐阅读
- ios - 如何快速将 yyyy-MM-dd'T'HH:mm:ss.SSS'Z' 转换为 MM-dd-yyyy
- apache-spark - 结构流式演示,程序像批处理作业一样立即退出,不连续,火花
- c - 如何回调函数在 C 中的运行时工作
- javascript - 如何使 Javascript 倒计时 24 小时并在 24 小时后淡出 div 元素?
- python - Python mysql fetchall() 返回附加字符
- ruby-on-rails - 如何在rails中为异常编写rspec?
- python - 我已经按照Django的官方教程制作了一个投票应用程序,但我无法继续
- javascript - Vuex store WATCH 和 SUBSCRIBE 的区别
- r - na.rm = TRUE 未能在 unite() 上删除 NA
- php - 如何从该控制器发布多张图像?