Salut,

La communauté Python étant très active, avant de passer trop de temps dans un bricolage incertain, ou je suis peut être en train de ré-inventer la roue...

Les idées...

On décrit une classe avec des Attributs et des Elements, dans le style:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
class User(Entities.Element):
    attr1 = Types.Attribute(MyTypes.Integer, None)
Derrière le mirroir, cela construit un schéma XML, i.e:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
>>> print User.xml_schema()
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="user">
    <xs:complexType>
      <xs:attribute name="attr1" type="xs:integer" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>
Pas mal, mais l'objet de la chose est...

Je prends un content "XML" genre <user attr1="123" />
Et on dit: u = User(content=content, media_type='xml')
Ce qui crée une instance de User avec des attributs ayant les types Python qui vont bien... avec une validation de la conformité de content avec le XSD au passage... Ouf, on respire et:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
>>> u.str(media_type='xml')
<?xml version='1.0' encoding='utf-8'?>
<user attr1="123"/>
On n'a rien perdu... mais on a gagné:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
>>> u.str(media_type='json')
{
    "user": {
        "attr1": "123"
    }
}
Si on résume, on décrit la structure d'un document XML sous la forme d'une classe Python... Les instances sont crées à partir d'un document XML/JSON.
Et au bout je me retrouve avec une "chose" qu'on peut re-sérialiser dans un media type ou un autre.

Je suis tout à fait conscient qu'il serait assez farfelu d'essayer de coder tout ce que peut faire XML ainsi et que tout ce qu'on peut représenter en XML n'est pas facilement traduisible en Python ou en JSON.

Si je me suis lancé la dedans c'est parce que je fais un proto qui tire profit d'un truc comme çà et le XML que çà traite est suffisamment limité pour que cela ne devienne pas un projet dans le projet.

Donc avant de clore le petit bout de code est "good enough" pour mon proto, la question est "A-t-on des solutions équivalentes? Plus générales?"
Ou comment avez vous/auriez vous traité cela...

- W