Learn to Code via Tutorials on Repl.it

← Back to all posts
Searching xml in Python 2.7
franciscoareasareas (7)

Searching an xml in Python

Starting with version 2.7 ElementTree has a better support for XPath queries. XPath is a syntax to enable you to navigate through an xml like SQL is used to search through a database. Both find and findall functions support XPath. The xml below will be used for this example

<Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Do Androids Dream of Electric Sheep?</Title>
            <Author>Philip K. Dick</Author>
        </Book>
        <Book id="5" price="5.95">
            <Title>The Colour of Magic</Title>
            <Author>Terry Pratchett</Author>
        </Book>
        <Book id="7" price="6.95">
            <Title>The Eye of The World</Title>
            <Author>Robert Jordan</Author>
        </Book>
    </Books>
</Catalog>

XPath queries are built as if it were a path to the file you want. They separate tags with / and xml attributes are accessed with an @ before the attribute name.
Specifically for ElementTree, you don't specify the full path, just the relative path based on the object you're using.

Searching for all books:

import xml.etree.cElementTree as ET
tree = ET.parse('sample.xml')
tree.findall('Books/Book')

Searching for the book with title = ‘The Colour of Magic’:

tree.find("Books/Book[Title='The Colour of Magic']") 
# always use '' in the right side of the comparison

Searching for the book with id = 5:

tree.find("Books/Book[@id='5']")
# searches with xml attributes must have '@' before the name

Search for the second book:

tree.find("Books/Book[2]")
# indexes starts at 1, not 0

Search for the last book:

tree.find("Books/Book[last()]")
# 'last' is the only xpath function allowed in ElementTree

Search for all authors:

tree.findall(".//Author")
#searches with // must use a relative path
Commentshotnewtop
timmy_i_chen (946)

Neat! Concise and informative. Thanks!

franciscoareasareas (7)

@timmy_i_chen Thanks. I found it really powerful to navigate through xml. I had written it for Stackoverflow documentation and saved it when they shutdown the site.