Searching xml in Python 2.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
Neat! Concise and informative. Thanks!
@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.