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>