Creating XML with lxml.objectify
We'll cover the following...
The lxml.objectify sub-package is extremely handy for parsing and creating XML. In this section, we will show how to create XML using the lxml.objectify module. We’ll start with some simple XML and then try to replicate it. Let’s get started!
We will continue using the following XML for our example:
Press + to interact
<?xml version="1.0" ?><zAppointments reminder="15"><appointment><begin>1181251680</begin><uid>040000008200E000</uid><alarmTime>1181572063</alarmTime><state></state><location></location><duration>1800</duration><subject>Bring pizza home</subject></appointment><appointment><begin>1234360800</begin><duration>1800</duration><subject>Check MS Office website for updates</subject><location></location><uid>604f4792-eb89-478b-a14f-dd34d3cc6c21-1234360800</uid><state>dismissed</state></appointment></zAppointments>
Let’s see how we can use lxml.objectify to recreate this XML:
Press + to interact
from lxml import etree, objectifydef create_appt(data):"""Create an appointment XML element"""appt = objectify.Element("appointment")appt.begin = data["begin"]appt.uid = data["uid"]appt.alarmTime = data["alarmTime"]appt.state = data["state"]appt.location = data["location"]appt.duration = data["duration"]appt.subject = data["subject"]return apptdef create_xml():"""Create an XML file"""xml = '''<?xml version="1.0" encoding="UTF-8"?><zAppointments></zAppointments>'''root = objectify.fromstring(xml)root.set("reminder", "15")appt = create_appt({"begin":1181251680,"uid":"040000008200E000","alarmTime":1181572063,"state":"","location":"","duration":1800,"subject":"Bring pizza home"})root.append(appt)uid = "604f4792-eb89-478b-a14f-dd34d3cc6c21-1234360800"appt = create_appt({"begin":1234360800,"uid":uid,"alarmTime":1181572063,"state":"dismissed","location":"","duration":1800,"subject":"Check MS Office website for updates"})root.append(appt)# remove lxml annotationobjectify.deannotate(root)etree.cleanup_namespaces(root)# create the xml stringobj_xml = etree.tostring(root,pretty_print=True,xml_declaration=True)try:with open("example.xml", "wb") as xml_writer:xml_writer.write(obj_xml)except IOError:passif __name__ == "__main__":create_xml()
Let’s break this down a bit. We will start with the create_xml function. ...