2010-11-09 2 views
4

Некоторое время я использовал пакет под названием «gnosis-utils», который предоставляет службу трассировки XML для Python. Этот класс работает достаточно хорошо, однако, по-видимому, его разработчиком занимались последние четыре года.Сериализация объектов XML в python, есть ли какие-либо альтернативы Gnosis?

В то время, когда мы первоначально выбрали gnosis, это был единственный инструмент для сериализации XML для Python. Преимущество Gnosis заключалось в том, что он предоставил набор классов, функция которых была очень похожа на встроенный пиксор XML Python. Он создал XML, который python-разработчики легко читали, но разработчики, не являющиеся разработчиками python, сбивали с толку.

Теперь, когда proejct вырос, у нас есть новое требование: мы должны иметь возможность обмениваться XML с нашими коллегами, которые предпочитают Java или .Net. Эти разработчики, не являющиеся разработчиками python, не будут использовать Python - они намереваются напрямую создавать XML, поэтому нам нужно упростить формат XML.

Так есть ли какие-либо альтернативы Гнозису. Наши требования:

  • должны работать на Python 2.4/Windows x86 32bit
  • Выход должен быть XML, так просто, как это возможно
  • API должны напоминать Pickle настолько близко, насколько это возможно
  • производительность не очень важна

Конечно, мы могли бы просто адаптировать Gnosis, однако мы бы предпочли просто использовать компонент, который уже предоставляет функции, которые мы выполняем (предполагая, что он существует).

+1

FYI, я знаю об этом: http://codespeak.net/lxml/objectify.html - он не поддерживает ничего похожего на API стиля Pickle. –

ответ

1

Итак, что вы ищете, это библиотека python, которая выплевывает произвольный XML для ваших объектов? Вам не нужно управлять форматом, поэтому вам не следует беспокоиться о том, чтобы написать что-то, что итерации по соответствующим свойствам ваших данных, и генерирует XML, используя один из существующих инструментов?

Это похоже на плохую идею. Произвольная сериализация XML не похожа на хороший способ продвижения вперед. Любой формат, который включает все функции рассола, будет уродливым, многословным и очень противным в использовании. Это будет непросто. Он не будет хорошо переводиться на Java.

Как выглядят ваши данные?

Если вы расскажете нам, какие именно аспекты рассола вам нужны (и почему lxml.objectify не выполняет их), мы сможем вам помочь.

Рассматривали ли вы использование JSON для вашей сериализации? Это легко разобрать, изначально поддерживает структуры данных, подобные питону, и имеет широкую поддержку. В качестве дополнительного бонуса он не открывает ваш код для всех видов злобных эксплойтов, как это делает собственный модуль рассола.

Честно говоря, вам нужно укусить пулю, определить формат и построить сериализатор с использованием стандартных инструментов XML, если вы абсолютно должны использовать XML. Рассмотрим JSON.

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 остается актуальным.