Using ElementTree in Python
June 17, 2010
This page contains some code that is useful for working with ElementTree in Python.
Parse an XML File
This code parses an XML file from disk into an ElementTree instance
from xml.etree.ElementTree import ElementTree lDocument = ElementTree() lDocument.parse(pFilepath) lRoot = lDocument.getroot()
Parse from String
This code parses to an XML document from a string, and returns the root node.
from xml.etree.ElementTree import fromstring lRoot = fromstring(lXmlAsString)
Get Child Tags
This is an example of getting hold of the child tags
if child.tag == 'ResourceParams': lChildren = child.getchildren()
Create If Not Present
This code looks for a given tag (Environment) with a given attribute (name="username") and creates it if it does not exist
lFound = False for child in lRoot.getchildren(): if child.tag == 'Environment': if child.attrib['name'] == 'Username': lFound = True if not lFound: lRoot.append(Element('Environment', {'description': 'Username', 'name':'Username'}))
Get Attribute Value
This code gets hold of the value of an attribute
for child in lRoot.getchildren(): if child.tag == 'Environment': lUrl = child.get('value')
Update Attributes
Update attributes in a parsed XML document
for child in lRoot.getchildren(): if child.tag == 'Environment': if child.attrib['name'] == 'AmqpUsername': child.set('value', lRabbitUsername) elif child.attrib['name'] == 'AmqpPassword': child.set('value', lRabbitPassword) elif child.attrib['name'] == 'AmqpVirtualHost': child.set('value', lRabbitVirtualHost) elif child.attrib['name'] == 'AmqpHost': child.set('value', lRabbitHost) elif child.attrib['name'] == 'AmqpPort': child.set('value', lRabbitPort) elif child.attrib['name'] == 'AmqpExchangePrefix': child.set('value', lRabbitExchangePrefix)
Update Tag Text Value
This code is an example of updating the text value in an XML tag
for child in lPoolSizeRoot.getchildren(): if child.tag == 'ResourceParams': lParameters = child.getchildren() for lParam in lParameters: if lParam.find('name').text == 'maxActive': lParam.find('value').text = str(lPoolSize)
Deleting Elements
Don't delete elements whilst iterating through the document (such as from a call to getchildren()). This will cause tags to be skipped by the iterator. Instead, add them to a delete list then use delete() after you've finished iterating the loop:
for tag in lRemoveList: lRoot.remove(tag)
Write XML File
This code writes back the XML file to disk
from xml.etree.ElementTree import tostring lXml = tostring(lDocument.getroot(),'utf-8') lXml = "<?xml version='1.0' encoding='utf-8'?>\n%s" % lXml lFile = open(pFilepath, "w") lFile.write(lXml) lFile.close()