Introduction

In this blog, we will learn how to perform basic CRUD application using Python and an XML file. We will also learn how to create a Python module and use it.
Prerequisite
VS Code or any other IDE for development.
Step 1
Create an XML file. Here, I have created a contact.xml with the following structure.
  1. <data>
  2. <contact id="1">
  3. <name>john doe</name>
  4. <address>unknown</address>
  5. <phone>007</phone>
  6. </contact>
  7. <contact id="2">
  8. <name>Test2</name>
  9. <address>Test Address2</address>
  10. <phone>1002</phone>
  11. </contact>
  12. </data>
Step 2
Creating Python module for CRUD operations.We will be using Python xml.etree.ElementTree module for creating and reading the XML data. I have created two files - myxml.py which is the application file and mymodules.py which has all functions of CRUD. We will import mymodules.py in our application file. I have included comments in the code for better understanding. The code is as below,
mymodules.py
  1. myroot=''
  2. def setXml(root,tree):
  3. global myroot
  4. global mytree
  5. myroot=root
  6. mytree=tree
  7. # Function to list all xml elements
  8. def readContact():
  9. global myroot
  10. for contact in myroot.findall('contact'):
  11. contactId=contact.attrib['id']
  12. name=contact.find('name').text
  13. address=contact.find('address').text
  14. phone=contact.find('phone').text
  15. print(" Name =",name,"\n"," Address =",address,"\n",
  16. " Phone =",phone,"\n"," Id =",contactId)
  17. print("----------------------------")
  18. input("Press any key to continue...")
  19. # Function to return next element id
  20. def getId():
  21. global myroot
  22. temp = 0
  23. for contact in myroot.findall('contact'):
  24. id= int(contact.attrib['id'])
  25. if id>temp:
  26. temp=id
  27. return temp+1
  28. # Function to create a new element
  29. def newContact(ET):
  30. global myroot
  31. global mytree
  32. print("Create a record")
  33. name=input("Name:")
  34. address=input("Address:")
  35. phone=input("Phone:")
  36. nextId=getId()
  37. newrecord = ET.SubElement(myroot, "contact",id=str(nextId))
  38. ET.SubElement(newrecord, "name", name="name").text = name
  39. ET.SubElement(newrecord, "address", name="address").text = address
  40. ET.SubElement(newrecord, "phone", name="phone").text = phone
  41. mytree.write("contact.xml")
  42. print("Contact created...")
  43. # Function to delete a element
  44. def deleteContact():
  45. global myroot
  46. global mytree
  47. deleteRecord=int(input("Enter the id of the contact you want to delete: "))
  48. #loop through all id's
  49. for contact in myroot.findall('contact'):
  50. delid= int(contact.attrib['id'])
  51. if delid == deleteRecord:
  52. myroot.remove(contact)
  53. mytree.write("contact.xml")
  54. print("Contact deleted...")
  55. # Function to update a element
  56. def updateContact():
  57. global myroot
  58. global mytree
  59. updateRecord=int(input("Enter the id of contact you want to update: "))
  60. for contact in myroot.findall('contact'):
  61. upid= int(contact.attrib['id'])
  62. if upid == updateRecord:
  63. #first we will select all current values
  64. name = contact.find('name').text
  65. address = contact.find('address').text
  66. phone = contact.find('phone').text
  67. #update..the or input means if input is empty keep old value
  68. name = input("Please enter name:") or name
  69. contact.find('name').text= name
  70. address = input("Please enter address:") or address
  71. contact.find('address').text= address
  72. phone = input("Please enter phone:") or phone
  73. contact.find('phone').text= phone
  74. mytree.write("contact.xml")
  75. print("Contact updated...")
myxml.py
  1. import xml.etree.ElementTree as ET
  2. import sys
  3. #importing module we created as myfun
  4. import mymodules as myfun
  5. try:
  6. mytree = ET.parse('contact.xml')
  7. myroot = mytree.getroot()
  8. choice=int(input('What you want to do..?\n 1.List\n 2.Insert \n 3.Update \n 4.Delete \n'))
  9. myfun.setXml(myroot,mytree)
  10. #using python conditional statement..calls function according to choice
  11. myfun.newContact(ET) if choice ==2 else ""
  12. myfun.updateContact() if choice ==3 else ""
  13. myfun.deleteContact() if choice ==4 else ""
  14. myfun.readContact() if choice ==1 else ""
  15. except OSError as err:
  16. print("OS error: {0}".format(err))
  17. except:
  18. print("Unexpected error:", sys.exc_info()[0])
  19. raise
Step 3
Run the myxml.py in the terminal. The screenshot of output as in vscode is as below.