Python ElementTree

Python ElementTree tutorial shows how to use the ElementTree module for XML parsing and creation in Python.

Python ElementTree

Python ElementTree

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.

Parsing XML with ElementTree

The following example demonstrates how to parse an XML document using ElementTree.

main.py

import xml.etree.ElementTree as ET

XML data

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> """

Parse the XML data

root = ET.fromstring(xml_data)

Iterate over product elements

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

Modifying XML with ElementTree

The following example demonstrates how to modify an XML document using ElementTree.

main.py

import xml.etree.ElementTree as ET

XML data

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> """

Parse the XML data

root = ET.fromstring(xml_data)

Modify the first product’s price

first_product = root.find(‘product’) first_product.find(‘price’).text = ‘15.99’

Add a new product

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 the modified XML

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.

Reading XML File with id Attribute

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()

Iterate over product elements

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

Writing XML with ElementTree

The following example demonstrates how to create and write an XML document using ElementTree.

main.py

import xml.etree.ElementTree as ET

Create the root element

root = ET.Element(‘products’)

Create product elements

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’

Function to pretty-print XML

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-print the XML

pretty_root = prettify(root)

Create an ElementTree object

tree = ET.ElementTree(pretty_root)

Write the pretty-printed XML to a file

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.

Source

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.

Author

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.

ad ad