【问题标题】:XML object serialization in python, are there any alternatives to Gnosis?python中的XML对象序列化,是否有任何替代Gnosis的方法?
【发布时间】:2011-05-07 08:32:51
【问题描述】:

一段时间以来,我一直在使用一个名为“gnosis-utils”的包,它为 Python 提供了 XML 酸洗服务。这个类工作得相当好,但是在过去的四年里它似乎被它的开发者忽视了。

在我们最初选择 gnosis 时,它是 Python 的唯一 XML 序列化工具。 Gnosis 的优势在于它提供了一组类,其功能与内置的 Python XML pickler 非常相似。它生成的 XML 让 Python 开发人员觉得很容易阅读,但非 Python 开发人员觉得很困惑。

现在项目已经发展壮大,我们有一个新要求:我们需要能够与喜欢 Java 或 .Net 的同事交换 XML。这些非 Python 开发人员不会使用 Python——他们打算直接生成 XML,因此我们需要简化 XML 的格式。

Gnosis 有什么替代品吗?我们的要求:

  • 必须在 Python 2.4 / Windows x86 32bit 上工作
  • 输出必须是 XML,尽可能简单
  • API 必须尽可能与 Pickle 相似
  • 性能并不是很重要

当然,我们可以简单地调整 Gnosis,但是我们更愿意简单地使用已经提供了我们需要的功能的组件(假设它存在)。

【问题讨论】:

标签: python xml serialization pickle


【解决方案1】:

那么您正在寻找的是一个可以为您的对象生成任意 XML 的 Python 库吗?您不需要控制格式,因此您不必费心实际编写一些东西来迭代数据的相关属性并使用现有工具之一生成 XML?

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

您的数据是什么样的?

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

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

老实说,如果您绝对必须使用 XML,您需要硬着头皮定义格式,并使用标准 XML 工具构建序列化程序。考虑 JSON。

【讨论】:

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

    【讨论】:

    • stackoverflow.com/questions/62604159/… - 我试过了,但 XML 非常“不自然”。与类结构完全不匹配。
    • XML 与 pickle 格式和Pickle Protocol 的要求相匹配,所以是的,这对 Python 开发人员来说很自然,但对于外部开发人员来说却不是,所以我猜它与原始开发人员之一不匹配问题要求。再说一次,每个类都不需要架构并且也生成简单的 xml 的东西很难找到。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多