在python中的XML对象序列化,Gnosis有什么替代品吗?

时间:2010-11-09 16:10:56

标签: python xml serialization pickle

有一段时间我一直在使用名为“gnosis-utils”的软件包,它为Python提供XML pickling服务。这个课程运作得相当好,但在过去的四年中它似乎被它的开发人员忽略了。

当我们最初选择gnosis时,它是Python唯一的XML serization工具。 Gnosis的优势在于它提供了一组类,其功能与内置的Python XML pickler非常相似。它产生了Python,python开发人员发现它易于阅读,但非python开发人员发现令人困惑。

既然该项目已经发展,我们就有了新的要求:我们需要能够与喜欢Java或.Net的同事交换XML。这些非python开发人员不会使用Python - 他们打算直接生成XML,因此我们需要简化XML的格式。

Gnosis还有其他选择吗?我们的要求:

  • 必须适用于Python 2.4 / Windows x86 32位
  • 输出必须是XML,尽可能简单
  • API必须尽可能地与Pickle相似
  • 表现并不是非常重要

当然我们可以简单地适应Gnosis,但是我们更喜欢简单地使用已经提供我们需要的功能的组件(假设它存在)。

2 个答案:

答案 0 :(得分:1)

那么你要找的是一个python库,为你的对象吐出任意的XML?您不需要控制格式,因此您不必费心去编写迭代数据相关属性的内容并使用现有工具之一生成XML?

这似乎是一个坏主意。任意XML序列化听起来不是一个好的方法。任何包含所有pickle功能的格式都会变得丑陋,冗长,而且非常讨厌使用。这不简单。它不会很好地转化为Java。

您的数据是什么样的?

如果你准确地告诉我们你需要什么方面的泡菜(以及为什么lxml.objectify不能满足这些要求),我们将能够更好地帮助你。

您是否考虑过使用JSON进行序列化?它易于解析,原生支持类似python的数据结构,并且具有广泛的支持。作为一个额外的好处,它不会像原生泡菜模块那样以各种邪恶漏洞打开你的代码。

老实说,如果你绝对必须使用XML,你需要咬紧牙关并定义一种格式,并使用标准的XML工具构建一个序列化程序。考虑JSON。

答案 1 :(得分:0)

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兼容性,因为很久以前就提出了这个问题,但xml转储任意Python对象的解决方案仍然相关。