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