As the module name suggest itself, xmltodict actually converts the XML data we provide to just a simply Python dictionary. So, we can simply access the data with the dictionary keys as well. Here is a sample program:
import xmltodict import json my_xml = """ 123 Shubham """ my_dict = xmltodict.parse(my_xml) print(my_dict['audience']['id']) print(my_dict['audience']['id']['@what'])
Output:
OrderedDict([(‘@what’, ‘attribute’), (‘#text’, ‘123’)])
attribute
So, the tags can be used as the keys along with the attribute keys as well. The attribute keys just needs to be prefixed with the @
symbol.
Namespaces in XML
import xmltodict import json import pprint my_xml = """ 123 Shubham """ my_dict = xmltodict.parse(my_xml, process_namespaces=True) pp = pprint.PrettyPrinter(indent=4) pp.pprint(json.dumps(my_dict))
Output:
(‘{“http://defaultns.com/:root”: {“http://defaultns.com/:audience”: ‘
‘{“http://defaultns.com/:id”: {“@what”: “attribute”, “@xmlns”: {“”: ‘
‘”http://defaultns.com/”, “a”: “http://a.com/”}, “#text”: “123”}, ‘
‘”http://defaultns.com/:name”: “Shubham”}}}’)
JSON to XML conversion
import xmltodict student = { "data" : { "name" : "Shubham", "marks" : { "math" : 92, "english" : 99 }, "id" : "s387hs3" } } print(xmltodict.unparse(student, pretty=True))
Output:
Shubham 92
99
s387hs3
Adding New Element and Deleting Existing Element:
# -*- coding: utf-8 -*- """ Created on Wed Dec 19 23:50:30 2018 @author: Sidarth2015 """ import json import xmltodict xmlstring = """<planets> <planet> <name value='1'> Earth </name> <radius> 6,371km </radius> </planet> <planet> <name> Jupiter </name> <radius> 69,911km </radius> </planet> <planet> <name> Mars </name> <radius> 3,390km </radius> </planet> </planets>""" #jsonString = json.dumps(xmltodict.parse(xmlstring), indent=4) # #print("\nJSON output(output.json):") #print(jsonString) # #with open("output.json", 'w') as f: # f.write(jsonString) my_dict = xmltodict.parse(xmlstring) print("Before adding element") print(xmltodict.unparse(my_dict, pretty=True)) planet = my_dict['planets']['planet'] # adding element for item in planet: item['newnode']='test' #display output print("After adding element") print(xmltodict.unparse(my_dict, pretty=True)) #removing element for item in planet: item.pop('newnode', None) #display output print("After removing element") print(xmltodict.unparse(my_dict, pretty=True))
Output:
Before adding element <?xml version="1.0" encoding="utf-8"?> <planets> <planet> <name value="1">Earth</name> <radius>6,371km</radius> </planet> <planet> <name>Jupiter</name> <radius>69,911km</radius> </planet> <planet> <name>Mars</name> <radius>3,390km</radius> </planet> </planets>
After adding element <?xml version="1.0" encoding="utf-8"?> <planets> <planet> <name value="1">Earth</name> <radius>6,371km</radius> <newnode>test</newnode> </planet> <planet> <name>Jupiter</name> <radius>69,911km</radius> <newnode>test</newnode> </planet> <planet> <name>Mars</name> <radius>3,390km</radius> <newnode>test</newnode> </planet> </planets>
After removing element <?xml version="1.0" encoding="utf-8"?> <planets> <planet> <name value="1">Earth</name> <radius>6,371km</radius> </planet> <planet> <name>Jupiter</name> <radius>69,911km</radius> </planet> <planet> <name>Mars</name> <radius>3,390km</radius> </planet> </planets>