Python minidom
last modified March 7, 2025
In this article, we show how to use the minidom module in
Python for XML parsing and creation. The minidom module
offers a lightweight DOM interface for XML, part of Python's standard
library.
The minidom module is useful for reading, writing, and
modifying XML documents using a DOM-based approach.
Key features:
- Simple DOM API for parsing and manipulating XML data.
- Represents XML as a tree of nodes (elements, attributes, etc.).
- Suitable for small to medium-sized XML files.
Parsing XML with minidom
This example shows how to parse an XML document using minidom.
from xml.dom import minidom
# 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
doc = minidom.parseString(xml_data)
# Get all product elements
products = doc.getElementsByTagName('product')
# Iterate over product elements
for product in products:
id = product.getElementsByTagName('id')[0].firstChild.data
name = product.getElementsByTagName('name')[0].firstChild.data
price = product.getElementsByTagName('price')[0].firstChild.data
qty = product.getElementsByTagName('quantity')[0].firstChild.data
print(f"Id: {id}, Name: {name}, Price: {price}, Quantity: {qty}")
Here, parseString parses the XML string into a DOM object.
We use getElementsByTagName to find elements and extract
their text with firstChild.data.
$ python main.py Id: 1, Name: Product 1, Price: 10.99, Quantity: 30 Id: 2, Name: Product 2, Price: 20.99, Quantity: 130
Modifying XML with minidom
This example shows how to modify an XML document using minidom.
from xml.dom import minidom
# XML data
xml_data = """
<products>
<product>
<id>1</id>
<name>Product 1</name>
<price>10.99</price>
<quantity>30</quantity>
</product>
</products>
"""
# Parse the XML data
doc = minidom.parseString(xml_data)
# Modify the first product's price
product = doc.getElementsByTagName('product')[0]
price = product.getElementsByTagName('price')[0]
price.firstChild.data = '15.99'
# Add a new product
new_product = doc.createElement('product')
doc.documentElement.appendChild(new_product)
for tag, text in [('id', '2'), ('name', 'Product 2'),
('price', '30.99'), ('quantity', '200')]:
elem = doc.createElement(tag)
elem.appendChild(doc.createTextNode(text))
new_product.appendChild(elem)
# Print the modified XML
print(doc.toprettyxml(indent=" "))
We modify the price by updating firstChild.data. A new
product is created with createElement and text nodes are
added using createTextNode.
Reading XML File with id Attribute
This example reads an XML file with id attributes using
minidom.
<products>
<product id="1">
<name>Product 1</name>
<price>10.99</price>
<quantity>30</quantity>
</product>
<product id="2">
<name>Product 2</name>
<price>20.99</price>
<quantity>130</quantity>
</product>
</products>
Products have id as attributes.
from xml.dom import minidom
file_name = 'products.xml'
# Parse the XML file
doc = minidom.parse(file_name)
products = doc.getElementsByTagName('product')
# Iterate over product elements
for product in products:
product_id = product.getAttribute('id')
name = product.getElementsByTagName('name')[0].firstChild.data
price = product.getElementsByTagName('price')[0].firstChild.data
qty = product.getElementsByTagName('quantity')[0].firstChild.data
print(f"Id: {product_id}, Name: {name}, Price: {price}, Quantity: {qty}")
We use getAttribute to extract the id attribute
and firstChild.data for element text.
$ python main.py Id: 1, Name: Product 1, Price: 10.99, Quantity: 30 Id: 2, Name: Product 2, Price: 20.99, Quantity: 130
Writing XML with minidom
This example creates and writes an XML document using minidom.
from xml.dom import minidom
# Create the document
doc = minidom.Document()
# Create the root element
root = doc.createElement('products')
doc.appendChild(root)
# Create product elements
for i, (name, price, qty) in enumerate([
('Product 1', '10.99', '30'),
('Product 2', '20.99', '130')
], 1):
product = doc.createElement('product')
root.appendChild(product)
for tag, text in [('id', str(i)), ('name', name),
('price', price), ('quantity', qty)]:
elem = doc.createElement(tag)
elem.appendChild(doc.createTextNode(text))
product.appendChild(elem)
# Write to file with pretty printing
with open('products2.xml', 'w', encoding='utf-8') as f:
f.write(doc.toprettyxml(indent=" "))
print("XML file created successfully with proper indentation.")
We build the XML structure with createElement and
createTextNode, then write it using toprettyxml.
Source
Python minidom - Documentation
This article demonstrated using the minidom module in Python
for XML parsing, modification, and creation.
Author
List all Python tutorials.