从Python简单输出XML

1 投票
4 回答
3821 浏览
提问于 2025-04-16 08:55

我需要用Python以一种非常简洁的方式输出XML:

  • 我不能使用任何额外的库,只能用Python 2.6.5自带的东西
  • 我需要输出XML标签和文本内容,不需要任何属性

现在我正在用打印语句来明确地输出尖括号标签,唯一让我感到困扰的是如何在标签内处理文本转义,我不知道该怎么做。

有什么建议吗?


更新:Python有没有类似Java的StAX XMLStreamWriter的东西?我可能需要生成一个很大的XML文档,而我不想把整个文档都放在内存里。

更新 #2:我还需要处理文本中的随机Unicode或非ASCII字符的转义,除了<>&之外。

4 个回答

2

如果这个任务很简单,使用minidom就可以了。下面是一个简单的例子:

from xml.dom.minidom import Document

# create xml document
document = Document()

# create root element
root = document.createElement("root")
document.appendChild(root)

# create child element
child = document.createElement("child")
child.setAttribute("tag", "test")
root.appendChild(child)

# insert some text
atext = document.createTextNode("Foo bar")
child.appendChild(atext)

# print created xml
print(document.toprettyxml(indent="    "))
2

ElementTree 是 Python 2.6 自带的一个库:

from xml.etree import ElementTree as ET
root = ET.Element('root')
sub = ET.SubElement(root,'sub')
sub.text = 'Hello & Goodbye'
tree = ET.ElementTree(root)
tree.write('out.xml')
# OR
ET.dump(root)

输出结果

<root><sub>Hello &amp; Goodbye</sub></root>
4

看起来SAX其实并没有那么难用。这里有个例子。

xmltest.py:

import xml.sax.xmlreader
import xml.sax.saxutils

def testJunk(file, e2content):
  attr0 = xml.sax.xmlreader.AttributesImpl({})
  x =  xml.sax.saxutils.XMLGenerator(file)
  x.startDocument()
  x.startElement("document", attr0)

  x.startElement("element1", attr0)
  x.characters("bingo")
  x.endElement("element1")

  x.startElement("element2", attr0)
  x.characters(e2content)
  x.endElement("element2")

  x.endElement("document")
  x.endDocument()

测试结果:

>>> import xmltest
>>> xmltest.testJunk(open("test.xml","w"), "wham < 3!")

输出结果:

<?xml version="1.0" encoding="iso-8859-1"?>
<document><element1>bingo</element1><element2>wham &lt; 3!</element2></document>

撰写回答