Python: Convertir un flux JSON en XML

Voici un script Python qui permet de convertir en XML un contenu JSON et/ou un dictionnaire de données Python.

linkToXml.py

Quelques exemples d'utilisations:

En ligne de commande (BASH par exemple) avec un pipe et un flux JSON via CURL:

# curl "http://api.geonames.org/citiesJSON?formatted=true&north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo&style=full" -o - -s | python3 ToXml.py
<?xml version="1.0" ?>
<XML>
        <geonames>
                <name>Mexiko-Stadt</name>
                <countrycode>MX</countrycode>
                <geonameId>3530597</geonameId>
                <toponymName>Mexico City</toponymName>
                <wikipedia>en.wikipedia.org/wiki/Mexico_City</wikipedia>
                <fclName>city, village,...</fclName>
                <fcode>PPLC</fcode>
                <lat>19.428472427036</lat>
                <lng>-99.12766456604</lng>
                <fcl>P</fcl>
                <fcodeName>capital of a political entity</fcodeName>
                <population>12294193</population>
        </geonames>
        <geonames>
                <name>Peking</name>
                <countrycode>CN</countrycode>
                <geonameId>1816670</geonameId>
                <toponymName>Beijing</toponymName>
                <wikipedia>en.wikipedia.org/wiki/Beijing</wikipedia>
                <fclName>city, village,...</fclName>
                <fcode>PPLC</fcode>
                <lat>39.9074977414405</lat>
                <lng>116.397228240967</lng>
                <fcl>P</fcl>
                <fcodeName>capital of a political entity</fcodeName>
                <population>11716620</population>
        </geonames>
</XML>

infoUtilisé avec un pipe, seul un flux JSON est autorisé.

Sinon, en important la classe dans un script Python:

A partir d'un fichier:

# cat flux.json
{
    "un": "one",
    "deux": "two",
    " 3": "three",
    "4": "four"
}

Code Python:

>>> from ToXml import ToXml
>>> toxml = ToXml()
>>> toxml.fromjson('flux.json')
>>> print(toxml.topretty())
<?xml version="1.0" ?>
<XML>
    <XMLNODE v="3">three</XMLNODE>
    <XMLNODE v="4">four</XMLNODE>
    <un>one</un>
    <deux>two</deux>
</XML>

>>>

A partir d'une chaine de texte représentant un contenu JSON:

>>> from ToXml import ToXml
>>> s = '{" 3": "three", "4": "four", "un": "one", "deux": "two"}'
>>> toxml = ToXml()
>>> toxml.fromjsons(s)
>>> print(toxml.topretty())
<?xml version="1.0" ?>
<XML>
    <XMLNODE v="3">three</XMLNODE>
    <XMLNODE v="4">four</XMLNODE>
    <un>one</un>
    <deux>two</deux>
</XML>

>>>

A partir d'un dictionnaire de données:

>>> from ToXml import ToXml
>>> d = {' 3': 'three', '4': 'four', 'un': 'one', 'deux': 'two'}
>>> type(d)
<class 'dict'>
>>> toxml = ToXml()
>>> toxml.fromdict(d)
>>> print(toxml.topretty())
<?xml version="1.0" ?>
<XML>
    <XMLNODE v="3">three</XMLNODE>
    <XMLNODE v="4">four</XMLNODE>
    <un>one</un>
    <deux>two</deux>
</XML>

>>>

Et enfin, une fonction permettant d'enregistrer le contenu XML dans un fichier:

>>> toxml.tofile('flux.xml')
# cat flux.xml
<?xml version="1.0" ?>
<XML>
    <XMLNODE v="3">three</XMLNODE>
    <XMLNODE v="4">four</XMLNODE>
    <un>one</un>
    <deux>two</deux>
</XML>

N'hésitez pas à laisser vos avis.

J'ai essayé de documenter le code au maximum mais au cas où ...

Etiquettes: