web-dev-qa-db-fra.com

Convertir JSON en XML en Python

Je vois un certain nombre de questions sur SO poser des questions sur les moyens de convertir XML en JSON, mais je suis intéressé à aller dans l'autre sens. Existe-t-il une bibliothèque python pour la conversion de JSON en XML?


Edit: Rien n'est revenu tout de suite, alors je suis allé de l'avant et j'ai écrit un script qui résout ce problème. 

Python vous permet déjà de convertir du JSON en un dict natif (en utilisant json ou, dans les versions <2.6, simplejson), j'ai donc écrit une bibliothèque qui convertit les dict natifs en une chaîne XML.

https://github.com/quandyfactory/dict2xml

Il prend en charge les types de données int, float, boolean, string (et unicode), array et dict et l'imbrication arbitraire (yay récursivité). 

Je posterai ceci comme réponse une fois que 8 heures se seront écoulées.

37
Ryan McGreal

Rien n'est revenu tout de suite, alors je suis allé de l'avant et j'ai écrit un script qui résout ce problème. 

Python vous permet déjà de convertir du JSON en un dict natif (en utilisant json ou, dans les versions <2.6, simplejson), j'ai donc écrit une bibliothèque qui convertit les dict natifs en une chaîne XML.

https://github.com/quandyfactory/dict2xml

Il prend en charge les types de données int, float, boolean, string (et unicode), array et dict et l'imbrication arbitraire (yay récursivité). 

33
Ryan McGreal

Chargez-le dans un dict en utilisant json.loads puis utilisez quelque chose de cette question ...

Sérialiser le dictionnaire Python en XML

13
wmil

Si vous ne possédez pas un tel package, vous pouvez essayer:

def json2xml(json_obj, line_padding=""):
    result_list = list()

    json_obj_type = type(json_obj)

    if json_obj_type is list:
        for sub_elem in json_obj:
            result_list.append(json2xml(sub_elem, line_padding))

        return "\n".join(result_list)

    if json_obj_type is dict:
        for tag_name in json_obj:
            sub_obj = json_obj[tag_name]
            result_list.append("%s<%s>" % (line_padding, tag_name))
            result_list.append(json2xml(sub_obj, "\t" + line_padding))
            result_list.append("%s</%s>" % (line_padding, tag_name))

        return "\n".join(result_list)

    return "%s%s" % (line_padding, json_obj)

Par exemple:

s='{"main" : {"aaa" : "10", "bbb" : [1,2,3]}}'
j = json.loads(s)
print(json2xml(j))

Résultat:

<main>
        <aaa>
                10
        </aaa>
        <bbb>
                1
                2
                3
        </bbb>
</main>
10
diemacht
from json import loads
from dicttoxml import dicttoxml

s='{"main" : {"aaa" : "10", "bbb" : [1,2,3]}}'
xml = dicttoxml(json.loads(s))

Ou si vos données sont stockées dans un pandas data.frame comme le mien l’est souvent:

df['xml'] = df['json'].apply(lambda s: dicttoxml(json.loads(s))
0
cangers

Utilisez dicttoxml pour convertir JSON directement en XML

Installation 
pip install dicttoxml 
ou 
easy_install dicttoxml

In [2]: from json import loads

In [3]: from dicttoxml import dicttoxml

In [4]: json_obj = '{"main" : {"aaa" : "10", "bbb" : [1,2,3]}}'

In [5]: xml = dicttoxml(loads(json_obj))

In [6]: print(xml)
<?xml version="1.0" encoding="UTF-8" ?><root><main type="dict"><aaa type="str">10</aaa><bbb type="list"><item type="int">1</item><item type="int">2</item><item type="int">3</item></bbb></main></root>

In [7]: xml = dicttoxml(loads(json_obj), attr_type=False)

In [8]: print(xml)
<?xml version="1.0" encoding="UTF-8" ?><root><main><aaa>10</aaa><bbb><item>1</item><item>2</item><item>3</item></bbb></main></root>

Pour plus d'informations sur dicttoxml

0
Anurag Misra