如何用python构建xml文件,并设置格式

如何用python构建xml文件,并设置格式,python,newline,whitespace,Python,Newline,Whitespace,我正在尝试用python构建一个xml文件,这样我就可以将它写入一个文件中,但是我遇到了新行和制表符等复杂问题 我不能使用模块来实现这一点,因为我使用的是Python2的精简版。它必须全部使用纯python 例如,如何创建具有这种格式的xml文件,以保留所有新行和制表符(空白) e、 g 布拉布拉赫 我试着把每一行都围起来 ' <myfiledata>' +\n ' blahblah' +\n “”+\n “blahblah”+\n 等等

我正在尝试用python构建一个xml文件,这样我就可以将它写入一个文件中,但是我遇到了新行和制表符等复杂问题

我不能使用模块来实现这一点,因为我使用的是Python2的精简版。它必须全部使用纯python

例如,如何创建具有这种格式的xml文件,以保留所有新行和制表符(空白)

e、 g


布拉布拉赫
我试着把每一行都围起来

'    <myfiledata>' +\n
'                blahblah' +\n
“”+\n
“blahblah”+\n
等等

然而,我从脚本中获得的输出与python文件中的外观并不接近,存在额外的空白,新行无法正常工作

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

您可以使用从saxutils生成XML并解析它并打印漂亮的XML(这两个模块都来自Python 2中的标准库)

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

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)
输出为:


文本内容
另一子项的文本内容

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

答案是使用XML.element.tree和from XML.dom导入minidom


这些都在python 2.5上提供,请查看该软件包,看看它是否可以帮助您。很抱歉,我更新了答案,我不能使用lxml,它必须是纯python。您可能需要一个多行字符串。请看此了解一些想法。您可以使用标准库中的
xml.etree.ElementTree
吗?这样可能会有所帮助。@Ke。下次请在你的问题中说明这种要求。
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)