Я также искал простой способ преобразования данных между документами XML и структурами данных Python, похожий на XML-библиотеку Голанга , которая позволяет декларативно указывать способ сопоставления структур данных с XML.
Мне не удалось найти такую библиотеку для Python, поэтому я написал одну для удовлетворения моей потребности под названием declxml для декларативной обработки XML.
С помощью declxml вы создаете процессоров , которые декларативно определяют структуру вашего XML-документа. Процессоры используются для выполнения как синтаксического анализа, так и сериализации, а также базового уровня проверки.
Анализ этих XML-данных в списке словарей с помощью declxml не вызывает затруднений
import declxml as xml
xml_string = """
<encspot>
<file>
<Name>some filename.mp3</Name>
<Encoder>Gogo (after 3.0)</Encoder>
<Bitrate>131</Bitrate>
</file>
<file>
<Name>another filename.mp3</Name>
<Encoder>iTunes</Encoder>
<Bitrate>128</Bitrate>
</file>
</encspot>
"""
processor = xml.dictionary('encspot', [
xml.array(xml.dictionary('file', [
xml.string('Name'),
xml.string('Encoder'),
xml.integer('Bitrate')
]), alias='files')
])
xml.parse_from_string(processor, xml_string)
Который дает следующий результат
{'files': [
{'Bitrate': 131, 'Encoder': 'Gogo (after 3.0)', 'Name': 'some filename.mp3'},
{'Bitrate': 128, 'Encoder': 'iTunes', 'Name': 'another filename.mp3'}
]}
Хотите разобрать данные в объекты вместо словарей? Вы также можете сделать это
import declxml as xml
class AudioFile:
def __init__(self):
self.name = None
self.encoder = None
self.bit_rate = None
def __repr__(self):
return 'AudioFile(name={}, encoder={}, bit_rate={})'.format(
self.name, self.encoder, self.bit_rate)
processor = xml.array(xml.user_object('file', AudioFile, [
xml.string('Name', alias='name'),
xml.string('Encoder', alias='encoder'),
xml.integer('Bitrate', alias='bit_rate')
]), nested='encspot')
xml.parse_from_string(processor, xml_string)
, который производит вывод
[AudioFile(name=some filename.mp3, encoder=Gogo (after 3.0), bit_rate=131),
AudioFile(name=another filename.mp3, encoder=iTunes, bit_rate=128)]