从Python简单输出XML
我需要用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 & 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 < 3!</element2></document>