Je pourrais suggérer declxml .
Divulgation complète: J'ai écrit cette bibliothèque parce que je cherchais un moyen de convertir entre les structures de données XML et Python sans avoir besoin d'écrire des dizaines de lignes de code d'analyse / de sérialisation impératif avec ElementTree.
Avec declxml, vous utilisez des processeurs pour définir de manière déclarative la structure de votre document XML et comment mapper entre les structures de données XML et Python. Les processeurs sont utilisés à la fois pour la sérialisation et l'analyse ainsi que pour un niveau de validation de base.
L'analyse dans les structures de données Python est simple:
import declxml as xml
xml_string = """
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
"""
processor = xml.dictionary('foo', [
xml.dictionary('bar', [
xml.array(xml.integer('type', attribute='foobar'))
])
])
xml.parse_from_string(processor, xml_string)
Ce qui produit la sortie:
{'bar': {'foobar': [1, 2]}}
Vous pouvez également utiliser le même processeur pour sérialiser les données en XML
data = {'bar': {
'foobar': [7, 3, 21, 16, 11]
}}
xml.serialize_to_string(processor, data, indent=' ')
Qui produit la sortie suivante
<?xml version="1.0" ?>
<foo>
<bar>
<type foobar="7"/>
<type foobar="3"/>
<type foobar="21"/>
<type foobar="16"/>
<type foobar="11"/>
</bar>
</foo>
Si vous souhaitez travailler avec des objets au lieu de dictionnaires, vous pouvez également définir des processeurs pour transformer les données vers et depuis les objets.
import declxml as xml
class Bar:
def __init__(self):
self.foobars = []
def __repr__(self):
return 'Bar(foobars={})'.format(self.foobars)
xml_string = """
<foo>
<bar>
<type foobar="1"/>
<type foobar="2"/>
</bar>
</foo>
"""
processor = xml.dictionary('foo', [
xml.user_object('bar', Bar, [
xml.array(xml.integer('type', attribute='foobar'), alias='foobars')
])
])
xml.parse_from_string(processor, xml_string)
Qui produit la sortie suivante
{'bar': Bar(foobars=[1, 2])}