2011-03-16 1 views
5

Existe-t-il un moyen facile de passer d'un type de données Ocaml à une représentation xml correspondante?Comment convertir un type de données Ocaml en XML et inversement?

Supposons que j'ai les types suivants:

type A = 
    | FirstA of B list 
    | SecondA of C * string 

type B = B1 | B2 

type C = { 
    my_field: int; 
} 

Pour la valeur SecondA (C {my_field=10}, "just a value") Je voudrais peut-être obtenir quelque chose comme ceci:

<A constructor="FirstA"> 
    <C><my_field>10</my_field></C> 
    <string>just a value</string> 
</A> 

Y at-il bibliothèque qui peut faire quelque chose comme ça ? Ou, si je dois le faire moi-même, quelle serait la meilleure approche? Notez que je souhaite appliquer cela à plusieurs types de données différents.

Je connais les techniques génériques de programmation de type data mais elles sont trop "lourdes" à utiliser dans mon cas.

Répondre

6

Si je comprends bien votre question, il y a IoXML qui peut le faire:

IoXML est une extension de syntaxe Camlp5 pour MLI OCaml et fichiers ml qui génère parseurs XML et imprimantes pour tous les types vous définissez .

Il y a une semblable pour JSON: https://github.com/mirage/shelf

Si vous êtes bien avec l'aide JSON, je vous suggère de regarder aussi ATD/yojson. Ce système repose sur un langage de définition de données externe, mais il produit toujours des définitions de type OCaml idiomatiques.

MISE À JOUR (15/08/2011): Maintenant, mon propre Piqi project peut le faire aussi bien. Il peut sérialiser les données OCaml en utilisant 4 formats différents: Google Protocol Buffers, JSON, XML et Piq.

5

Je ne suis pas sûr de ce que vous entendez par "techniques de programmation générique de type de données". Il existe plusieurs bibliothèques qui utilisent le préprocesseur camlp4 pour déduire automatiquement serializers des déclarations de type:

Bien qu'aucun d'entre eux ne produise du XML, ils pourraient être utiles. En particulier, les s-expressions générées par sexplib ne sont pas trop différentes de XML.

Questions connexes