Python 序列化数据为XML格式,下面介绍一个使用Python内置的库进行XML序列化的方法,这将从单独的标签构建出一个文档。一种常用的替代方法是使用Python的自省特性来进行检查并将Python对象和类名映射为XML标记和属性。
XML序列化过程如下:
import xml.etree.ElementTree as XML
def serialize_xml(series: str, data: List[Pair]) -> bytes:
"""
>>> data = [Pair(2,3), Pair(5,7)]
>>> serialize_xml( "test", data )
b'<series
name="test"><row><x>2</x><y>3</y></row><row><x>5</x><y>7</y></row></series>'
"""
doc = XML.Element("series", name=series)
for row in data:
row_xml = XML.SubElement(doc, "row")
x = XML.SubElement(row_xml, "x")
x.text = str(row.x)
y = XML.SubElement(row_xml, "y")
y.text = str(row.y)
return cast(bytes, XML.tostring(doc, encoding='utf-8'))
这样就创建了一个顶层元素<series>
,并将子元素<row>
放在它的下面。在每一个子元素<row>
内创建了<x>
标签和<y>
标签,并将文本内容赋给了各个标签。
使用ElementTree
库作为构建XML文档的接口往往是命令式的,因此它不适合函数式设计。除了命令式做法外,请注意并没有创建DTD(documnet type definition,文档类型定义)或XSD(XML schemas definition,XML模式定义),也尚未为标签分配合适的命名空间,同时省略了<?xml version="1.0"?>
处理指令,而通常它会作为XML文档的第一项。
函数XML.tostring()
有一个类型提示用于声明返回的是str
。这样做通常是正确的,但当提供的是encoding
参数时,结果的类型会变为bytes
。并没有简单的方法来根据参数的值判断返回值的类型,因此使用显式的cast()
将实际类型告知mypy。
更高级的序列化库可能会有所帮助,访问https://wiki.python.org/moin/PythonXml查看更多选择。