Python中的XML对象序列化,有没有Gnosis的替代方案?
我之前一直在用一个叫“gnosis-utils”的工具包,它为Python提供了一个XML序列化服务。这个类的功能还算不错,不过它的开发者似乎在过去四年里没有维护过。
当初我们选择gnosis的时候,它是Python唯一的XML序列化工具。Gnosis的好处在于它提供了一组类,这些类的功能和Python自带的XML序列化器非常相似。它生成的XML对于Python开发者来说比较容易理解,但对非Python开发者来说就有点儿复杂了。
现在项目发展了,我们有了新的需求:我们需要能和那些喜欢用Java或.Net的同事交换XML。这些非Python开发者不会使用Python,他们打算直接生成XML,所以我们需要简化XML的格式。
那么有没有其他替代Gnosis的工具呢?我们的要求是:
- 必须能在Python 2.4 / Windows x86 32位上运行
- 输出必须是尽可能简单的XML
- API的设计要尽量像Pickle
- 性能不是特别重要
当然,我们可以直接修改Gnosis,但我们更希望能找到一个已经提供我们所需功能的组件(前提是这样的组件存在)。
2 个回答
有一个叫做 xml_marshaller
的工具,它可以很简单地把任意的 Python 对象转换成 XML 格式:
>>> from xml_marshaller import xml_marshaller
>>> class Foo(object): pass
>>> foo = Foo()
>>> foo.bar = 'baz'
>>> dump_str = xml_marshaller.dumps(foo)
用 lxml
(这个是 xml_marshaller
的一个依赖库)来美化上面的输出:
>>> from lxml.etree import fromstring, tostring
>>> print tostring(fromstring(dump_str), pretty_print=True)
你会得到这样的输出结果:
<marshal>
<object id="i2" module="__main__" class="Foo">
<tuple/>
<dictionary id="i3">
<string>bar</string>
<string>baz</string>
</dictionary>
</object>
</marshal>
我没有检查这个工具是否兼容 Python 2.4,因为这个问题是在很久以前提出来的,但把任意 Python 对象转换成 XML 的解决方案依然是有用的。
你想要的是一个可以把你的对象转成任意XML格式的Python库吗?你不想控制格式,所以不想自己写代码去遍历数据的相关属性,然后用现有的工具生成XML?
这样做听起来不太好。随便生成XML格式并不是一个好的选择。任何包含了pickle所有功能的格式都会很复杂、冗长,而且使用起来会很麻烦。它不会简单,也不容易转换成Java。
你的数据是什么样子的呢?
如果你能告诉我们你需要pickle的哪些具体功能(以及为什么lxml.objectify不能满足这些需求),我们会更好地帮助你。
你有没有考虑过用JSON来进行序列化?JSON很容易解析,原生支持类似Python的数据结构,而且支持范围广泛。更重要的是,它不会像原生的pickle模块那样让你的代码面临各种安全风险。
老实说,如果你真的必须使用XML,你需要下定决心定义一个格式,并使用标准的XML工具来构建一个序列化器。考虑一下JSON吧。