【问题标题】:Python pickle to xmlPython泡菜到xml
【发布时间】:2013-09-22 00:07:35
【问题描述】:

如何将 pickle 对象转换为 xml 文档?

例如,我有一个这样的泡菜:

cpyplusplus_test
Coordinate
p0
(I23
I-11
tp1
Rp2
. 

我想得到类似的东西:

<Coordinate>
  <x>23</x>
  <y>-11</y>
</Coordinate>

Coordinate 类当然有 x 和 y 属性。我可以提供一个 xml 架构进行转换。

我尝试了 gnosis.xml 模块。它可以将 xml 文档对象化为 python 对象。但它不能像上面那样将对象序列化为 xml 文档。

有什么建议吗?

谢谢。

【问题讨论】:

  • 你能展示创建这个泡菜的代码吗?
  • @alecxe 代码在这里:cord = pyplusplus_test.Coordinate(10,10) cord.x = 23 cord.y = -11 tmpStr = pickle.dumps(cord) print tmpStr

标签: python xml pickle


【解决方案1】:

gnosis.xml 确实支持酸洗到 XML:

import gnosis.xml.pickle
xml_str = gnosis.xml.pickle.dumps(obj)

要反序列化 XML,请使用 loads:

o2 = gnosis.xml.pickle.loads(xml_str)

当然,这不会直接将现有的 pickle 转换为 XML — 您必须先将它们反序列化为活动对象,然后将它们转储为 XML。

话虽如此,我必须警告您gnosis.xml 非常缓慢,有些脆弱,而且很可能没有维护(上一次发布是在六年前)。它也非常臃肿,包含大量子包,其中包含许多不仅您不需要,而且未经测试且有缺陷的功能。我们尝试将其用于我们的开发,并且在尝试调试和改进它浪费了大量精力之后,最终编写了一个运行约 500 行代码的简单 XML pickler,并且从未回头。

【讨论】:

  • 你是对的,gnosis 支持对 XML 的酸洗。但有两个担忧。首先,它的 XML 模式不是面向类的。例如一个字符串成员序列化为&lt;attr name="s" type="string" value="abc" /&gt; 但是,我想&lt;s&gt;abc&lt;&lt;/s&gt; 格式。其次,我通过 boost.python 使用来自 C++ 库的类型。 gnosis 以原始泡菜格式腌制它们。对于我的坐标类:&lt;attr name="__toplevel__" family="atom" type="rawpickle" &gt;»»cpyplusplus_test Coordinate p1 (I23 I-11 tRp2 .««&lt;/attr&gt;
  • @QQ 如果您的 XML 语法是固定的,那么显然 gnosis.xml 将没有多大用处,而且我相当肯定您必须编写自己的序列化程序。至于“rawpickle”这件事,很可能是由于 gnosis.xml 不知道如何序列化该类,而将其留给 pickle 去做。要解决这个问题,您需要编写一个 gnosis.xml “扩展”(有一些关于如何做到这一点的文档),但这仍然无法解决您的第一个问题。最后,我的答案最后一段中关于 gnosis.xml 的警告仍然适用。
  • 谢谢@user4815162342 我的主要目标是在python和其他语言之间找到一种通用的数据交换格式。 (c++、c# 等)。我从同一个模型为各种语言生成了类声明。但似乎不可能在 python 脚本和用不同语言编写的程序之间共享 xml 格式的对象。
  • @QQ 你没有在问题中提到这一点,但现在你提到了,事情变得更加清晰了。它必须是 XML 吗? json 在 Python 中运行良好,在其他语言中并不完全未知。
  • 我刚刚试图解决这个问题。我测试了一点json。存在一些实施问题。但我想问另一个问题可能会更好。谢谢@user4815162342
【解决方案2】:

首先,您需要通过pickle.loadpickle.loads 解开数据。然后生成xml sn -p。如果你在tmpStr 变量中有泡菜,只需这样做:

c = pickle.loads(tmpStr)
print '<Coordinate>\n<x>%d</x>\n<y>%d</y>\n</Coordinate>' % (c.x, c.y)

写入文件作为练习留给读者。

【讨论】:

  • 我不想将 xml 代码嵌入到脚本中。我想使用类似于serializationManager.serialize(c, 'c.xml') 的方法调用自动序列化对象
猜你喜欢
  • 2019-10-30
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多