关于换行:如何在python中构建XML文件,使用格式

how to build xml file in python, with formatting

我正在尝试用python构建一个XML文件,这样我就可以把它写到一个文件中,但是新的行和tabbing等会让我变得复杂。

我不能使用一个模块来完成这项工作,因为我使用的是一个精简版的python 2。一定都是纯Python。

例如,如何使用这种格式创建一个XML文件,它保留了所有新行和制表符(空白)?

例如

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8"?>
<myfiledata>
    <mydata>
            blahblah
    </mydata>
</myfiledata>

我试着把每一行都包起来

1
2
3
'    <myfiledata>' +

'                blahblah' +

等。

但是,我从脚本中得到的输出与我的python文件中的输出不太接近,有多余的空白空间,新行不能正常工作。

有什么明确的方法可以做到这一点吗?我宁愿编辑一个看起来有点像我将要结束的文件-为了清晰起见…


您可以使用saxutils中的xmlgenerator来生成XML,使用xml.dom.minidom来解析它并打印漂亮的XML(这两个模块都来自Python2中的标准库)。

创建XML并漂亮地打印它的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from __future__ import print_function
from xml.sax.saxutils import XMLGenerator
import io
import xml.dom.minidom

def pprint_xml_string(s):
   """Pretty-print an XML string with minidom"""
    parsed = xml.dom.minidom.parse(io.BytesIO(s))
    return parsed.toprettyxml()

# create a XML file in-memory:
fp = io.BytesIO()
xg = XMLGenerator(fp)

xg.startDocument()
xg.startElement('root', {})

xg.startElement('subitem', {})
xg.characters('text content')
xg.endElement('subitem')

xg.startElement('subitem', {})
xg.characters('text content for another subitem')
xg.endElement('subitem')

xg.endElement('root')
xg.endDocument()

# pretty-print it
xml_string = fp.getvalue()
pretty_xml = pprint_xml_string(xml_string)
print(pretty_xml)

输出为:

1
2
3
4
5
<?xml version="1.0" ?>
<root>
    <subitem>text content</subitem>
    <subitem>text content for another subitem</subitem>
</root>

请注意,文本内容元素(包装在标记中)没有缩进,因为这样做会改变它们的内容(XML不会像HTML那样忽略空白)。


答案是使用xml.element.tree和从xml.dom导入minidom

在python 2.5上都有