在 Python 中创建正确嵌套的 XML 输出

Creating Properly-Nested XML Output in Python

我试图以 XML 格式保存来自多个列表的数据,但我无法理解如何使 XML 正确显示。我现在的代码示例如下:

from lxml import etree

#Create XML Root
articles = etree.Element('root')

#Create Lists & Data
t_list = ['title1', 'title2', 'title3', 'title4', 'title5']
c_list = ['content1', 'content2', 'content3', 'content4', 'content5']
sum_list = ['summary1', 'summary2', 'summary3', 'summary4', 'summary5']
s_list = ['source1', 'source2', 'source3', 'source4', 'source5']

i = 0
for t in t_list:
    for i in range(len(t_list)):
        #Create SubElements of XML Root
        article = etree.SubElement(articles, 'Article')
        titles = etree.SubElement(article, 'Title')
        summary = etree.SubElement(article, 'Summary')
        source = etree.SubElement(article, 'Source')
        content = etree.SubElement(article, 'Content')

        #Add List Data to SubElements
        titles.text = t_list[i]
        summary.text = sum_list[i]
        source.text = s_list[i]
        content.text = c_list[i]

print(etree.tostring(articles, pretty_print=True))

我的当前输出以一种非常混乱的方式写在一行中,如下所示:

b'<root>\n  <Article>\n    <Title>title1</Title>\n    <Summary>summary1</Summary>\n    <Source>source1</Source>\n    <Content>content1</Content>\n  </Article>\n

看起来 lxml 中的 pretty_print 函数正在添加适当的缩进,以及 \n 中断,但它似乎没有得到解释输出时正确;它写在一行上。

我试图得到的输出如下:

<root>
  <Article>
    <Title>title1</Title>
    <Summary>summary1</Summary>
    <Source>source1</Source>
    <Content>content1</Content>
  </Article>

理想情况下,我希望我的输出被视为有效的 XML 文档,并以正确的嵌套格式显示。

我只使用了 Python 中的基本 ET 模块,找不到 python 3.5(我正在使用)的 lxml 下载以对其进行测试,但是b 行前表示字节,快速浏览文档表明 tostring() 有一个编码关键字,因此您只需要将其设置为 unicode 或 utf-8。

我还会提到您不需要在 for 循环之前设置 "i"(python 将创建 for 循环所需的 "i") ,尽管我个人会 zip 列表并自己迭代列表中的项目(尽管在这种情况下这不会对代码产生任何实际影响)。

你的"Current Output"是由etree.tostring()生成的字节串的表示(内部python表示),似乎在Python3 print(somebytestring) 打印表示而不是实际字符串。

希望解决方案非常简单:只需将 desired encoding 传递给 etree.tostring(),即:

xml = etree.tostring(articles, encoding="unicode", pretty_print=True) 
print(xml)