繁体   English   中英

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

[英]Python write multiple xml structures in one xml file with ElementTree

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

教程中创建的 xml 文件如下:

当前 output

<chess>
    <Opening>
        <E4 type="Accepted">King's Gambit Accepted</E4>
        <D4 type="Declined">Queen's Gambit Declined</D4>
    </Opening>
</chess>

我想用循环创建如下:

所需 output

<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 文件中创建多个结构并将其写入 output 文件?

您需要在 XML 中至少有一个根元素,到 append 的子元素:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM