Convert JSON to XML in Python

PythonXmlJson

Python Problem Overview


I see a number of questions on SO asking about ways to convert XML to JSON, but I'm interested in going the other way. Is there a python library for converting JSON to XML?


Edit: Nothing came back right away, so I went ahead and wrote a script that solves this problem.

Python already allows you to convert from JSON into a native dict (using json or, in versions < 2.6, simplejson), so I wrote a library that converts native dicts into an XML string.

https://github.com/quandyfactory/dict2xml

It supports int, float, boolean, string (and unicode), array and dict data types and arbitrary nesting (yay recursion).

I'll post this as an answer once 8 hours have passed.

Python Solutions


Solution 1 - Python

Nothing came back right away, so I went ahead and wrote a script that solves this problem.

Python already allows you to convert from JSON into a native dict (using json or, in versions < 2.6, simplejson), so I wrote a library that converts native dicts into an XML string.

https://github.com/quandyfactory/dict2xml

It supports int, float, boolean, string (and unicode), array and dict data types and arbitrary nesting (yay recursion).

Solution 2 - Python

Load it into a dict using json.loads then use anything from this question...

https://stackoverflow.com/questions/1019895/serialize-python-dictionary-to-xml

Solution 3 - Python

If you don't have such a package, you can try:

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)

For example:

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

Result:

<main>
        <aaa>
                10
        </aaa>
        <bbb>
                1
                2
                3
        </bbb>
</main>

Solution 4 - Python

Use dicttoxml to convert JSON directly to XML

Installation
pip install dicttoxml
or
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>

For more information on dicttoxml

Solution 5 - Python

from json import loads
from dicttoxml import dicttoxml

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

Or if your data is stored in a pandas data.frame as mine often is:

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

Solution 6 - Python

I found xmltodict to be useful. Looks like it was released after some of the posts here. https://pypi.org/project/xmltodict/

import xmltodict
import json
sample_json = {"note": {"to": "Tove", "from": "Jani", "heading": "Reminder", "body": "Don't forget me this weekend!"}}
#############
#json to xml
#############
json_to_xml = xmltodict.unparse(sample_json)
print(json_to_xml)
#############
#xmlto json
#############
x_to_j_dict = xmltodict.parse(json_to_xml)
x_to_j_string = json.dumps(x_to_j_dict)
back_to_json = json.loads(x_to_j_string)
print(back_to_json)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRyan McGrealView Question on Stackoverflow
Solution 1 - PythonRyan McGrealView Answer on Stackoverflow
Solution 2 - PythonwmilView Answer on Stackoverflow
Solution 3 - PythondiemachtView Answer on Stackoverflow
Solution 4 - PythonAnurag MisraView Answer on Stackoverflow
Solution 5 - PythoncangersView Answer on Stackoverflow
Solution 6 - PythonJortegaView Answer on Stackoverflow