DEV Community

Avnish
Avnish

Posted on

how to recursively iterate over XML tags in Python using ElementTree

Title: How to recursively iterate over XML tags in Python using ElementTree

Python's ElementTree library provides a convenient way to parse and manipulate XML data. Recursively iterating over XML tags using ElementTree involves traversing through the XML tree structure and visiting each element. Here are five examples demonstrating how to achieve this:

Example 1: Basic Recursive Iteration

import xml.etree.ElementTree as ET

def recursive_iterate(element):
    print(element.tag)
    for child in element:
        recursive_iterate(child)

# Parse the XML file
tree = ET.parse('example.xml')
root = tree.getroot()

# Start recursion from the root element
recursive_iterate(root)
Enter fullscreen mode Exit fullscreen mode

Explanation:

  1. Import the ElementTree module.
  2. Define a function recursive_iterate which takes an ElementTree Element object as input.
  3. Inside the function, print the tag of the current element.
  4. Iterate over each child element recursively, calling recursive_iterate on each child element.

Example 2: Printing Tag and Text

import xml.etree.ElementTree as ET

def recursive_iterate(element):
    if element.text:
        print(f"{element.tag}: {element.text}")
    for child in element:
        recursive_iterate(child)

# Parse the XML file
tree = ET.parse('example.xml')
root = tree.getroot()

# Start recursion from the root element
recursive_iterate(root)
Enter fullscreen mode Exit fullscreen mode

Explanation:
This example is similar to the first one, but it also prints the text content of each element.

Example 3: Printing Attributes

import xml.etree.ElementTree as ET

def recursive_iterate(element):
    print(f"{element.tag} - Attributes: {element.attrib}")
    for child in element:
        recursive_iterate(child)

# Parse the XML file
tree = ET.parse('example.xml')
root = tree.getroot()

# Start recursion from the root element
recursive_iterate(root)
Enter fullscreen mode Exit fullscreen mode

Explanation:
This example extends the previous ones by printing the attributes of each element along with its tag.

Example 4: Filtering Elements

import xml.etree.ElementTree as ET

def recursive_iterate(element, tag_filter):
    if element.tag == tag_filter:
        print(f"{element.tag} - Attributes: {element.attrib}")
        if element.text:
            print(f"Text: {element.text}")
    for child in element:
        recursive_iterate(child, tag_filter)

# Parse the XML file
tree = ET.parse('example.xml')
root = tree.getroot()

# Start recursion from the root element
recursive_iterate(root, 'item')
Enter fullscreen mode Exit fullscreen mode

Explanation:
This example adds a tag filter to print only elements with a specific tag.

Example 5: Storing Data in a Dictionary

import xml.etree.ElementTree as ET

def recursive_to_dict(element):
    result = {}
    for child in element:
        result[child.tag] = recursive_to_dict(child)
    result.update(element.attrib)
    if element.text:
        result['text'] = element.text
    return result

# Parse the XML file
tree = ET.parse('example.xml')
root = tree.getroot()

# Convert XML to dictionary recursively
xml_dict = recursive_to_dict(root)
print(xml_dict)
Enter fullscreen mode Exit fullscreen mode

Explanation:
This example converts the XML structure into a nested dictionary, including tags, attributes, and text content.

Output:
Assuming we have an XML file named example.xml, and its content is as follows:

<root>
    <item id="1">Item 1</item>
    <item id="2">Item 2</item>
    <subtree>
        <subitem id="3">Subitem 1</subitem>
    </subtree>
</root>
Enter fullscreen mode Exit fullscreen mode

The output of these examples would be:

root
item - Attributes: {'id': '1'}
Text: Item 1
item - Attributes: {'id': '2'}
Text: Item 2
subtree
subitem - Attributes: {'id': '3'}
Text: Subitem 1
Enter fullscreen mode Exit fullscreen mode

Top comments (0)