在Python中创建适当嵌套的XML输出

时间:2016-06-22 13:43:18

标签: python xml output

我试图以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

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

我想要获得的输出如下:

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

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

2 个答案:

答案 0 :(得分:0)

我只使用Python中的基本ET模块,并且无法为python 3.5找到lxml下载(我已经开始)以便测试它,但是 b 之前的行表示字节,快速浏览文档表明tostring()有一个编码关键字,所以你只需要将其设置为unicode或utf-8。

我还要提到你不需要设置&#34;我&#34;在你的for循环之前(python会创建&#34; i&#34;它需要for循环),尽管我个人 - 会压缩列表并迭代列表中的项目他们自己(虽然在这种情况下不会对代码产生任何实际影响)。

答案 1 :(得分:0)

您的&#34;电流输出&#34;是由etree.tostring()生成的字节串的表示(内部python表示),似乎在Python3 print(somebytestring)中打印表示而不是实际的字符串。

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

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