首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ElementTree在一个xml文件中写入多个xml结构

用ElementTree在一个xml文件中写入多个xml结构
EN

Stack Overflow用户
提问于 2021-03-18 19:39:50
回答 1查看 211关注 0票数 0

我正在尝试用ElementTree编写一个xml文件。GeeksforGeeks有一个很好的教程。我面临的问题是,我想在同一个xml文件中编写多个xml结构。

在本教程期间创建的xml文件如下:

电流输出

代码语言:javascript
复制
<chess>
    <Opening>
        <E4 type="Accepted">King's Gambit Accepted</E4>
        <D4 type="Declined">Queen's Gambit Declined</D4>
    </Opening>
</chess>

我想用循环创建以下内容:

期望输出

代码语言:javascript
复制
<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文件的写入不起作用。我的代码看起来是这样的。

代码语言:javascript
复制
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)

错误消息

代码语言:javascript
复制
TypeError: an integer is required

是否有办法在一个xml文件中创建多个结构并将其写入输出文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-18 20:17:59

您需要在XML中至少有一个根元素,才能将子元素追加到:

代码语言:javascript
复制
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())

退出:

代码语言:javascript
复制
<?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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66698021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档