Python ElementTree tutorial shows how to use the ElementTree module for XML parsing and creation in Python.
last modified February 15, 2025
In this article, we show how to use the ElementTree module in Python for XML parsing and creation. The ElementTree module provides a simple and efficient API for working with XML data. It is part of Python’s standard library and is widely used for XML processing.
The ElementTree module is particularly useful for tasks like reading, writing, and modifying XML files.
Key features:
- A lightweight and user-friendly API for parsing and manipulating XML data.
- Represents the XML document as a tree structure, with elements as nodes.
- Ideal for smaller to medium-sized XML files.
The following example demonstrates how to parse an XML document using ElementTree.
main.py
import xml.etree.ElementTree as ET
xml_data = """ <products> <product> <id>1</id> <name>Product 1</name> <price>10.99</price> <quantity>30</quantity> </product> <product> <id>2</id> <name>Product 2</name> <price>20.99</price> <quantity>130</quantity> </product> <product> <id>3</id> <name>Product 3</name> <price>24.59</price> <quantity>350</quantity> </product> <product> <id>4</id> <name>Product 4</name> <price>9.9</price> <quantity>650</quantity> </product> <product> <id>5</id> <name>Product 5</name> <price>45</price> <quantity>290</quantity> </product> </products> """
root = ET.fromstring(xml_data)
for product in root.findall(‘product’):
id = product.find('id').text
name = product.find('name').text
price = product.find('price').text
quantity = product.find('quantity').text
print(f"Id: {id}, Name: {name}, Price: {price}, Quantity: {quantity}")
In this program, the ET.fromstring function is used to parse the XML data. The findall method is used to find all product elements, and the find method is used to extract the values of id, name, price, and quantity tags.
$ python main.py Id: 1, Name: Product 1, Price: 10.99, Quantity: 30 Id: 2, Name: Product 2, Price: 20.99, Quantity: 130 Id: 3, Name: Product 3, Price: 24.59, Quantity: 350 Id: 4, Name: Product 4, Price: 9.9, Quantity: 650 Id: 5, Name: Product 5, Price: 45, Quantity: 290
The following example demonstrates how to modify an XML document using ElementTree.
main.py
import xml.etree.ElementTree as ET
xml_data = """ <products> <product> <id>1</id> <name>Product 1</name> <price>10.99</price> <quantity>30</quantity> </product> <product> <id>2</id> <name>Product 2</name> <price>20.99</price> <quantity>130</quantity> </product> </products> """
root = ET.fromstring(xml_data)
first_product = root.find(‘product’) first_product.find(‘price’).text = ‘15.99’
new_product = ET.Element(‘product’) ET.SubElement(new_product, ‘id’).text = ‘3’ ET.SubElement(new_product, ’name’).text = ‘Product 3’ ET.SubElement(new_product, ‘price’).text = ‘30.99’ ET.SubElement(new_product, ‘quantity’).text = ‘200’ root.append(new_product)
print(ET.tostring(root, encoding=‘unicode’))
In this program, the find method is used to locate the first product element, and its price is modified. A new product element is created using ET.Element and ET.SubElement, and it is appended to the root element. The modified XML is printed using ET.tostring.
The following example demonstrates how to read an XML file where each product element has an id attribute. The program extracts the id attribute along with the name, price, and quantity values.
products.xml
<products> <product id=“1”> <name>Product 1</name> <price>10.99</price> <quantity>30</quantity> </product> <product id=“2”> <id>2</id> <name>Product 2</name> <price>20.99</price> <quantity>130</quantity> </product> <product id=“3”> <name>Product 3</name> <price>24.59</price> <quantity>350</quantity> </product> <product id=“4”> <name>Product 4</name> <price>9.9</price> <quantity>650</quantity> </product> <product id=“5”> <name>Product 5</name> <price>45</price> <quantity>290</quantity> </product> </products>
We have products with ids as attributes.
main.py
import xml.etree.ElementTree as ET
file_name = ‘products.xml’
tree = ET.parse(file_name) root = tree.getroot()
for product in root.findall(‘product’): # Extract the id attribute product_id = product.get(‘id’) name = product.find(’name’).text price = product.find(‘price’).text quantity = product.find(‘quantity’).text print(f"Id: {product_id}, Name: {name}, Price: {price}, Quantity: {quantity}")
tree = ET.parse(file_name)
root = tree.getroot()
We parse the document with parse method and use the getroot method to get the root of the document.
product_id = product.get(‘id’) name = product.find(’name’).text price = product.find(‘price’).text quantity = product.find(‘quantity’).text
The get method is used to extract the id attribute from each product element. The find method is used to extract the values of name, price, and quantity.
$ python main.py Id: 1, Name: Product 1, Price: 10.99, Quantity: 30 Id: 2, Name: Product 2, Price: 20.99, Quantity: 130 Id: 3, Name: Product 3, Price: 24.59, Quantity: 350 Id: 4, Name: Product 4, Price: 9.9, Quantity: 650 Id: 5, Name: Product 5, Price: 45, Quantity: 290
The following example demonstrates how to create and write an XML document using ElementTree.
main.py
import xml.etree.ElementTree as ET
root = ET.Element(‘products’)
product1 = ET.SubElement(root, ‘product’) ET.SubElement(product1, ‘id’).text = ‘1’ ET.SubElement(product1, ’name’).text = ‘Product 1’ ET.SubElement(product1, ‘price’).text = ‘10.99’ ET.SubElement(product1, ‘quantity’).text = ‘30’
product2 = ET.SubElement(root, ‘product’) ET.SubElement(product2, ‘id’).text = ‘2’ ET.SubElement(product2, ’name’).text = ‘Product 2’ ET.SubElement(product2, ‘price’).text = ‘20.99’ ET.SubElement(product2, ‘quantity’).text = ‘130’
def prettify(element, level=0): indent = ’ ' if len(element): if not element.text or not element.text.strip(): element.text = ‘\n’ + indent * (level + 1) for elem in element: prettify(elem, level + 1) if not elem.tail or not elem.tail.strip(): elem.tail = ‘\n’ + indent * (level + 1) if not elem.tail or not elem.tail.strip(): elem.tail = ‘\n’ + indent * level else: if level and (not element.tail or not element.tail.strip()): element.tail = ‘\n’ + indent * level return element
pretty_root = prettify(root)
tree = ET.ElementTree(pretty_root)
tree.write(‘products2.xml’, encoding=‘utf-8’, xml_declaration=True)
print(“XML file created successfully with proper indentation.”)
In this program, the ET.Element and ET.SubElement functions are used to create the XML structure. The tree.write method is used to write the XML data to a file.
The prettify function is used to indent the XML data neatly.
Python ElementTree - Documentation
In this article, we have shown how to use the ElementTree module in Python for XML parsing, modification, and creation. The ElementTree module is a powerful tool for working with XML data.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all Python tutorials.